3.25. Základy sběrnice CAN

Sběrnice CAN (Controller Area Network) byla původně navržena společností Bosch v 80. letech, aby propojila všechny elektronické řídicí jednotky v automobilu do jedné krátké sdílené sběrnice. Stále dominuje kabeláži v automobilech, ale tatáž robustnost, chování v reálném čase a návrh s více řídicími jednotkami (multi-master) z ní činí výchozí provozní sběrnici v automatizaci, robotice, zemědělské a průmyslové technice všeho druhu.

CAN nemá jednu „řídicí jednotku“ a sadu „periferií“, jako mají SPI a I2C. Každý uzel na sběrnici je rovnocenný partner a libovolný uzel může vysílat, kdykoliv je sběrnice volná. To, co umožňuje takovou škálovatelnost, je návrh sběrnice založený na vysílání všesměrově s arbitráží.

3.25.1. Vysílání s prioritní arbitráží

Každá zpráva na sběrnici CAN nese identifikátor – 11 bitů u klasického standardního rámce, 29 bitů u rozšířené varianty. Identifikátor není adresa; označuje, o čem zpráva je (otáčky motoru, poloha brzdového pedálu, napětí baterie atd.). Když chce uzel odeslat hodnotu, vysílá ji všesměrově opatřenou příslušným identifikátorem a každý uzel na sběrnici toto vysílání vidí. Každý přijímač filtruje sběrnici hardwarově, aby vybral pouze ta ID, o která se zajímá.

Pokud se dva uzly pokusí vysílat ve stejný okamžik, elektrický návrh sběrnice umožní, aby zvítězila zpráva s nižším číselným identifikátorem, aniž by došlo ke ztrátě jakýchkoliv bitů.

Trik spočívá ve dvou elektrických stavech sběrnice: dominantní (logicky 0) a recesivní (logicky 1). Vodiče CAN jsou drženy na vysoké úrovni (recesivní) zakončovacími rezistory, když žádný uzel nehovoří; libovolný uzel může vodiče stáhnout dolů (dominantní) tím, že přes svůj transceiver vede proud. Výsledkem je drátové AND (wired-AND): pokud kterýkoliv jediný uzel vybudí sběrnici do dominantního stavu, vodič ukazuje dominantní hodnotu, a recesivní ukazuje pouze tehdy, když ji uvolnily všechny uzly. Dominantní stav vždy zvítězí. (Některé zdroje totéž uspořádání nazývají wired-OR, kdy považují „dominantní“ za uplatněný signál namísto AND recesivních bitů – fyzikální chování je v obou případech totožné.)

Jediný vodič sběrnice držený na vysoké úrovni zakončovacím rezistorem k Vcc. Ke sběrnici jsou připojeny tři uzly (A, B, C). Výstupní stupeň každého uzlu je dioda v sérii se spínačem k zemi -- dioda směřuje od sběrnice dolů ke spínači, takže sepnutí spínače stáhne sběrnici nízko přes diodu, ale žádný uzel nemůže vybudit sběrnici vysoko.

Drátové AND (wired-AND) v koncepční podobě. Skutečný CAN provozuje tutéž logiku přes diferenciální pár (CAN_H / CAN_L) s transceivery a zakončovacími rezistory rozdělenými mezi oba vodiče, ale pravidlo na sběrnici je stejné: libovolný uzel může stáhnout do dominantního stavu, a recesivní stav se přečte pouze tehdy, když jej uvolnily všechny uzly.

Arbitráž využívá tuto asymetrii přímo. Každý vysílající uzel posílá své ID po jednom bitu, nejprve nejvýznamnější bit (MSB), a během vysílání sleduje sběrnici. Uzel, který na vodič umístí recesivní bit, ale přečte zpět dominantní, ví, že ve stejný okamžik vysílá jiný uzel s nižším ID a tuto bitovou pozici vyhrál. Okamžitě přestane budit sběrnici a naslouchá. Vítězný uzel mezitím vidí své vlastní bity odcházet beze změny – z jeho pohledu se nestalo nic neobvyklého. ID s nižším číslem vyhrává, protože jeho dominantní bity přepíší recesivní bity, které by ID s vyššími čísly jinak odeslala na stejných pozicích.

Poražený poté čeká, až se sběrnice uvolní, a automaticky opakuje pokus. Nedochází k žádným kolizím, žádné zprávy se neztrácejí – pouze deterministické řazení podle priority.

Toto je styl publish/subscribe, díky němuž CAN funguje ve velkém měřítku: kdokoliv může hovořit, kdokoliv může naslouchat, a ID činí směrování implicitním.

3.25.2. Fyzická sběrnice

Řadič CAN v mikrokontroléru nebudí sběrnici přímo. Vystavuje pouze dva 3,3 V CMOS piny – TX (bit, který chce odeslat) a RX (bit, který vidí na sběrnici) – a tyto piny vedou k samostatnému čipu zvanému CAN transceiver nebo PHY. Transceiver se nachází mezi řadičem a skutečnými vodiči CAN; je to právě on, kdo umí komunikovat se sběrnicí.

Samotná sběrnice je 5V diferenciální pár:

  • CAN_H – „vysoký“ vodič páru.

  • CAN_L – „nízký“ vodič.

V recesivním stavu sedí oba vodiče zhruba na 2,5 V (uprostřed 5V napájení sběrnice). V dominantním stavu transceiver vytáhne CAN_H nahoru na asi 3,5 V a CAN_L dolů na asi 1,5 V, čímž vytvoří diferenciál kolem 2 V napříč párem. Přijímače vzorkují rozdíl mezi oběma vodiči, což činí signál odolným vůči souhlasnému (common-mode) rušení zachycenému na dlouhých kabelových trasách.

Obousměrný úkol transceiveru:

  • Na straně TX čte 3,3 V jednoduchý (single-ended) TX pin řadiče a buď rozevře CAN_H a CAN_L od sebe pro dominantní stav, nebo oba uvolní pro recesivní stav.

  • Na straně RX čte diferenciální pár CAN_H / CAN_L a hlásí jednoduchou (single-ended) 3,3 V úroveň na svém RX pinu zpět řadiči.

Dva zakončovací rezistory 120 ohmů, po jednom na každém fyzickém konci kabelu, drží sběrnici na recesivní střední hodnotě, když ji žádný uzel nebudí, a tlumí odrazy, které by jinak na dlouhých trasách narušily diferenciální signál.

3.25.3. Datový rámec

Standardní datový rámec CAN vypadá na vodiči takto:

Osm polí vykreslených v posloupnosti: SOF (1 bit), ID (11 bitů), RTR (1 bit), control (6 bitů), data (0 -- 8 bajtů), CRC (16 bitů), ACK (2 bity) a EOF (7 bitů).

Standardní datový rámec CAN: pole SOF, ID, RTR, control, data, CRC, ACK a EOF.

Každé pole má specifický úkol:

  • SOF (start of frame). Jeden dominantní bit, který oznamuje, že začíná nový rámec, a synchronizuje bitové hodiny každého uzlu.

  • ID (identifikátor). 11bitový identifikátor, na němž sběrnice provádí arbitráž. Nižší číslo = vyšší priorita.

  • RTR (remote transmission request). Nastaven u žádosti o data namísto dodání dat; přijímače s odpovídajícím ID reagují tím, že data odešlou samy.

  • Control. 6bitové pole kódující délku dat (DLC) a několik pomocných (housekeeping) bitů.

  • Data. 0 až 8 bajtů užitečné zátěže (CAN Classic; CAN FD to rozšiřuje na 64 bajtů).

  • CRC. Celkem 16 bitů: 15bitové CRC přes předchozí pole plus 1bitový oddělovač CRC.

  • ACK. Celkem 2 bity. V prvním bitu – slotu ACK – vysílač uvolní vodič a libovolný uzel, který rámec přijal správně, jej stáhne nízko; druhý bit je recesivní oddělovač. Chybějící ACK říká vysílači, že žádný uzel rámec neslyšel a měl by pokus zopakovat.

  • EOF (end of frame). Sedm recesivních bitů uzavírajících rámec.

Vše výše uvedené generuje a dekóduje řadič CAN v hardwaru; software vidí pouze ID, data a několik příznaků.

3.25.4. Kam CAN patří

Konstrukční volby CAN určují jeho niku:

  • Robustnost. Diferenciální signalizace na kroucené dvojlince, vestavěná detekce chyb, deterministická prioritní arbitráž a automatické opakování pokusů umožňují CAN přežít v elektricky zarušených prostředích, kde by UART a SPI poškodily data.

  • Více řídicích jednotek (multi-master). Libovolný uzel může hovořit kdykoliv. Není zapotřebí žádná centrální řídicí jednotka a žádný uzel nepředstavuje jediný bod selhání.

  • Omezená šířka pásma. Klasický CAN dosahuje stropu kolem 1 Mbit/s; CAN FD to rozšiřuje. CAN je správnou odpovědí, když je spoj mezi deskami nebo moduly, často přes metry kabelu, s prioritou na spolehlivosti.

  • Protokoly vyšších vrstev. Holá sběrnice CAN neříká, co ID znamená ani jak rozdělit dlouhou zprávu na fragmenty. Tato pravidla na ni nadstavují protokoly aplikační vrstvy – CANopen, J1939, ISO-TP/UDS, NMEA 2000. Samostatnou položkou, kterou je dobré znát, je soubor DBC: textový formát specifický pro výrobce, který zaznamenává, která ID nesou které bitové signály na konkrétním vozidle nebo systému. Soubory DBC jsou formát metadat popisující rozvržení zpráv jedné sběrnice, nikoliv samostatný protokol.

Ovladač v Sběrnice CAN v kódu obsluhuje rámec CAN na úrovni vodiče; mapování ID na významy je úkolem aplikace.