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.)
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:
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.