3.25. A CAN busz alapjai

A CAN-t (Controller Area Network) eredetileg a Bosch tervezte az 1980-as években, hogy egy autó összes elektronikus vezérlőegységét egyetlen rövid, közös buszra kösse. Ma is uralja az autók kábelkötegeit, de ugyanaz a robusztusság, valós idejű viselkedés és multi-master felépítés teszi az automatizálás, a robotika, valamint a mezőgazdasági és ipari berendezések minden fajtájának alapértelmezett terepbuszává.

A CAN-nak nincs egyetlen „vezérlője” és egy sor „perifériája” úgy, ahogy az SPI-nek és az I2C-nek. A buszon minden csomópont egyenrangú társ, és bármely csomópont adhat, amikor a busz tétlen. Ezt a skálázhatóságot a busz szórásos, arbitrációval kiegészített felépítése teszi lehetővé.

3.25.1. Szórás prioritás szerinti arbitrációval

A CAN buszon minden üzenet hordoz egy azonosítót – 11 bitet a klasszikus, szabványos képkocka esetén, és 29 bitet a kiterjesztett változatnál. Az azonosító nem cím; azt jelöli, hogy az üzenet miről szól (motor fordulatszáma, fékpedál állása, akkumulátor feszültsége stb.). Amikor egy csomópont egy értéket akar küldeni, azt a megfelelő azonosítóval megcímkézve szórja szét, és a buszon minden csomópont látja a szórást. Minden vevő hardveresen szűri a buszt, hogy csak az általa figyelt azonosítókat válassza ki.

Ha két csomópont egyszerre próbál adni, a busz elektromos felépítése lehetővé teszi, hogy az alacsonyabb számértékű azonosítójú üzenet nyerjen, anélkül hogy bármilyen bit elveszne.

A trükk a busz két elektromos állapotában rejlik: dominant (logikailag 0) és recessive (logikailag 1). A CAN vezetékeket a lezáró ellenállások magas (recessive) szinten tartják, amikor egyetlen csomópont sem ad; bármely csomópont alacsonyra (dominant) tudja húzni a vezetékeket azzal, hogy a transceiverén keresztül áramot vezet rájuk. Az eredmény egy huzalozott ÉS (wired-AND): ha bármely egyetlen csomópont dominant állapotba húzza a buszt, a vonalat dominantnak olvassuk, és csak akkor olvassuk recessive-nek, ha minden csomópont elengedte. A dominant mindig nyer. (Egyes források ugyanezt az elrendezést wired-OR-nak nevezik, a „dominant”-ot tekintve aktiválandó jelnek a recessive bitek ÉS-elése helyett – a fizikai viselkedés mindkét módon azonos.)

Egyetlen buszvonal, amelyet egy Vcc felé kötött lezáró ellenállás magas szinten tart. Három csomópont (A, B, C) lóg a buszra. Mindegyik csomópont kimeneti fokozata egy dióda sorba kötve egy földhöz vezető kapcsolóval -- a dióda a buszról lefelé a kapcsoló felé mutat, így a kapcsoló zárása alacsonyra húzza a buszt a diódán keresztül, de egyetlen csomópont sem tudja magasra hajtani a buszt.

A huzalozott ÉS fogalmi formában. A valódi CAN ugyanezt a logikát egy differenciális páron (CAN_H / CAN_L) futtatja, a transceiverekkel és a lezáró ellenállásokkal mindkét vezetékre megosztva, de a buszon a szabály ugyanaz: bármely csomópont dominant állapotba húzhat, és csak akkor olvasódik recessive-ként, ha minden csomópont elengedte.

Az arbitráció közvetlenül ezt az aszimmetriát használja ki. Minden adó csomópont egyszerre egy bitet küld az azonosítójából, MSB-vel kezdve, és figyeli a buszt, miközben ad. Az a csomópont, amely egy recessive bitet tesz a vezetékre, de dominantot olvas vissza, tudja, hogy egy másik, alacsonyabb azonosítójú csomópont ad ugyanabban a pillanatban, és megnyerte azt a bitpozíciót. Azonnal abbahagyja a busz hajtását, és figyel. A nyertes csomópont eközben látja, hogy saját bitjei változatlanul mennek ki – az ő szemszögéből semmi szokatlan nem történt. Az alacsonyabb számú azonosító azért nyer, mert dominant bitjei felülírják azokat a recessive biteket, amelyeket a magasabb számú azonosítók egyébként ugyanazokon a pozíciókon küldtek volna.

A vesztes ekkor megvárja, amíg a busz tétlenné válik, és automatikusan újra próbálkozik. Nincsenek ütközések, nincsenek elveszett üzenetek – csak determinisztikus prioritási sorrend.

Ez az a publish/subscribe stílus, amitől a CAN nagy léptékben működik: bárki beszélhet, bárki hallgathat, és az azonosítók implicitté teszik a kézbesítést.

3.25.2. A fizikai busz

Az MCU CAN vezérlője nem hajtja meg közvetlenül a buszt. Csupán két 3,3 V-os CMOS lábat tesz elérhetővé – TX (a küldeni kívánt bit) és RX (a buszon látott bit) –, és ezek a lábak egy külön chiphez vezetnek, amelyet CAN transceivernek vagy PHY-nek neveznek. A transceiver a vezérlő és a tényleges CAN vezetékek között helyezkedik el; ez tudja, hogyan kell a busszal kommunikálni.

Maga a busz egy 5 V-os differenciális pár:

  • CAN_H – a pár „magas” vezetéke.

  • CAN_L – az „alacsony” vezeték.

Recessive állapotban mindkét vezeték körülbelül 2,5 V-on van (a busz 5 V-os tápjának középpontja). Dominant állapotban a transceiver a CAN_H-t körülbelül 3,5 V-ra húzza fel, a CAN_L-t pedig körülbelül 1,5 V-ra le, így körülbelül 2 V-os differenciát hoz létre a páron. A vevők a két vezeték közötti különbséget mintavételezik, ami immunissá teszi a jelet a hosszú kábelszakaszokon felszedett közös módusú zajra.

A transceiver kétirányú feladata:

  • A TX oldalon beolvassa a vezérlő 3,3 V-os, egyvégű TX lábát, és vagy szétfeszíti a CAN_H-t és a CAN_L-t a dominant állapothoz, vagy mindkettőt elengedi a recessive állapothoz.

  • Az RX oldalon beolvassa a differenciális CAN_H / CAN_L párt, és egyvégű 3,3 V-os szintet jelez vissza az RX lábán a vezérlőnek.

Két 120 ohmos lezáró ellenállás, egy-egy a kábel mindkét fizikai végén, a recessive középponton tartja a buszt, amikor egyetlen csomópont sem hajtja, és csillapítja a visszaverődéseket, amelyek egyébként megrontanák a differenciális jelet a hosszú szakaszokon.

3.25.3. Az adatkocka

Egy szabványos CAN adatkocka így néz ki a vezetéken:

Nyolc mező sorrendben ábrázolva: SOF (1 bit), ID (11 bit), RTR (1 bit), vezérlés (6 bit), adat (0 -- 8 bájt), CRC (16 bit), ACK (2 bit) és EOF (7 bit).

Egy szabványos CAN adatkocka: SOF, ID, RTR, vezérlés, adat, CRC, ACK és EOF mezők.

Mindegyik mezőnek megvan a maga konkrét feladata:

  • SOF (start of frame, képkocka kezdete). Egy dominant bit, amely jelzi, hogy egy új képkocka kezdődik, és szinkronizálja minden csomópont bitórajelét.

  • ID (identifier, azonosító). A 11 bites azonosító, amely fölött a busz arbitrál. Alacsonyabb szám = magasabb prioritás.

  • RTR (remote transmission request, távoli adáskérés). Akkor van beállítva, amikor adatot kérnek, nem pedig adatot kézbesítenek; az azonosítóra illeszkedő vevők úgy válaszolnak, hogy maguk küldik el az adatot.

  • Control (vezérlés). Egy 6 bites mező, amely az adathosszt (DLC) és néhány adminisztratív bitet kódol.

  • Data (adat). 0–8 bájt hasznos adat (CAN Classic; a CAN FD ezt 64 bájtra bővíti).

  • CRC. Összesen 16 bit: egy 15 bites CRC a megelőző mezők fölött, plusz egy 1 bites CRC határoló.

  • ACK. Összesen 2 bit. Az első bitben – az ACK résben – az adó elengedi a vonalat, és minden csomópont, amely helyesen vette a képkockát, alacsonyra húzza azt; a második bit egy recessive határoló. Az ACK hiánya jelzi az adónak, hogy egyetlen csomópont sem hallotta a képkockát, és újra kell próbálkoznia.

  • EOF (end of frame, képkocka vége). Hét recessive bit zárja a képkockát.

Mindezt a CAN vezérlő generálja és dekódolja hardveresen; a szoftver csak az azonosítót, az adatot és néhány jelzőt lát.

3.25.4. Hol helyezkedik el a CAN

A CAN tervezési döntései határozzák meg a helyét:

  • Robusztus. A csavart páron futó differenciális jelzés, a beépített hibafelismerés, a determinisztikus prioritás-arbitráció és az automatikus újrapróbálkozások révén a CAN túléli azokat az elektromosan zajos környezeteket, ahol a UART és az SPI megrontaná az adatokat.

  • Multi-master. Bármely csomópont bármikor beszélhet. Nincs szükség központi vezérlőre, és egyetlen csomópont sem jelent egyetlen meghibásodási pontot.

  • Sávszélességben korlátozott. A klasszikus CAN körülbelül 1 Mbit/s-nál tetőzik; a CAN FD ezt kibővíti. A CAN a helyes válasz, amikor a kapcsolat panelek vagy modulok között van, gyakran több méternyi kábelen át, ahol a megbízhatóság az elsődleges szempont.

  • Magasabb rétegű protokollok. A puszta CAN busz nem mondja meg, hogy egy azonosító mit jelent, vagy hogyan kell egy hosszú üzenetet darabokra bontani. Az alkalmazási rétegű protokollok – CANopen, J1939, ISO-TP/UDS, NMEA 2000 – ezeket a szabályokat építik rá. Külön említést érdemel a DBC fájl: egy gyártóspecifikus szöveges formátum, amely rögzíti, hogy egy adott járművön vagy rendszeren mely azonosítók mely bitszintű jeleket hordozzák. A DBC fájlok egyetlen busz üzenet-elrendezését leíró metaadat-formátumok, nem pedig önálló protokollok.

A CAN busz a kódban szakaszban szereplő illesztőprogram a vezetékszintű CAN képkockát kezeli; az azonosítók jelentésekhez rendelése az alkalmazás feladata.