3.25. Grunderna i CAN-bussen

CAN (Controller Area Network) konstruerades ursprungligen av Bosch på 1980-talet för att koppla samman alla elektroniska styrenheter i en bil på en enda kort delad buss. Den dominerar fortfarande bilens kabelnät, men samma robusthet, realtidsbeteende och multimaster-design gör den till standardfältbuss inom automation, robotik samt lantbruks- och industriutrustning av alla slag.

CAN har inte en enda ”styrenhet” och en uppsättning ”kringutrustningar” på det sätt som SPI och I2C har. Varje nod på bussen är likställd, och vilken nod som helst kan sända så snart bussen är ledig. Det som gör detta skalbart är bussens design med broadcast och arbitrering.

3.25.1. Broadcast med prioritetsarbitrering

Varje meddelande på en CAN-buss bär en identifierare – 11 bitar för den klassiska standardbildrutan, 29 bitar för den utökade varianten. Identifieraren är inte en adress; den anger vad meddelandet handlar om (motorvarvtal, bromspedalsläge, batterispänning osv.). När en nod vill skicka ett värde sänder den ut det märkt med lämplig identifierare, och varje nod på bussen ser denna utsändning. Varje mottagare filtrerar bussen i hårdvara för att plocka ut endast de ID:n den bryr sig om.

Om två noder försöker sända samtidigt låter bussens elektriska konstruktion meddelandet med den lägre numeriska identifieraren vinna utan att någon bit går förlorad.

Knepet är bussens två elektriska tillstånd: dominant (logiskt 0) och recessivt (logiskt 1). CAN-ledningarna hålls höga (recessivt) av termineringsmotstånd när ingen nod sänder; vilken nod som helst kan dra ner ledningarna (dominant) genom att leda ström via sin transceiver. Resultatet är ett wired-AND: om en enda nod driver bussen dominant läser ledningen dominant, och den läser recessivt endast när varje nod har släppt den. Dominant vinner alltid. (Vissa källor kallar samma arrangemang för ett wired-OR, och behandlar ”dominant” som den hävdade signalen snarare än AND av recessiva bitar – det fysiska beteendet är identiskt hur som helst.)

En enda bussledning som hålls hög av ett termineringsmotstånd till Vcc. Tre noder (A, B, C) hänger på bussen. Varje nods utgångssteg är en diod i serie med en strömställare till jord -- dioden pekar från bussen ner mot strömställaren, så att stängning av strömställaren drar bussen låg genom dioden, men ingen nod kan driva bussen hög.

Wired-AND i konceptform. Verklig CAN kör samma logik över ett differentiellt par (CAN_H / CAN_L) med transceivrarna och termineringsmotstånden fördelade över båda ledningarna, men regeln på bussen är densamma: vilken nod som helst kan dra dominant, och endast när varje nod har släppt läser den recessivt.

Arbitreringen utnyttjar denna asymmetri direkt. Varje sändande nod skickar sitt ID en bit i taget, MSB först, och bevakar bussen medan den sänder. En nod som lägger en recessiv bit på ledningen men läser tillbaka dominant vet att en annan nod med ett lägre ID sänder i samma ögonblick och har vunnit den bitpositionen. Den slutar omedelbart att driva bussen och lyssnar. Den vinnande noden ser samtidigt sina egna bitar gå ut oförändrade – ur dess perspektiv hände inget ovanligt. Det lägre numrerade ID:t vinner eftersom dess dominanta bitar åsidosätter de recessiva bitar som de högre numrerade ID:na annars skulle ha skickat på samma positioner.

Förloraren väntar sedan på att bussen ska bli ledig och försöker igen automatiskt. Det finns inga kollisioner, inga förlorade meddelanden – endast deterministisk prioritetsordning.

Detta är den publish/subscribe-stil som gör att CAN fungerar i stor skala: vem som helst kan prata, vem som helst kan lyssna, och ID:na gör dispatchen implicit.

3.25.2. Den fysiska bussen

MCU:ns CAN-styrenhet driver inte bussen direkt. Den exponerar endast två 3,3 V CMOS-stift – TX (biten den vill skicka) och RX (biten den ser på bussen) – och dessa stift går till ett separat chip som kallas CAN-transceiver eller PHY. Transceivern sitter mellan styrenheten och de faktiska CAN-ledningarna; det är den som vet hur man pratar med bussen.

Själva bussen är ett 5 V differentiellt par:

  • CAN_H – parets ”höga” ledning.

  • CAN_L – parets ”låga” ledning.

I det recessiva tillståndet ligger båda ledningarna på ungefär 2,5 V (mittpunkten i bussens 5 V-matning). I det dominanta tillståndet drar transceivern upp CAN_H till omkring 3,5 V och CAN_L ner till omkring 1,5 V, vilket ger en differens på runt 2 V över paret. Mottagare samplar skillnaden mellan de två ledningarna, vilket gör signalen okänslig för gemensamt brus som plockas upp över långa kabelsträckor.

Transceiverns tvåvägsuppgift:

  • På TX-sidan läser den styrenhetens 3,3 V enkeländade TX-stift och driver antingen isär CAN_H och CAN_L för dominant eller släpper båda för recessivt.

  • På RX-sidan läser den det differentiella paret CAN_H / CAN_L och rapporterar en enkeländad 3,3 V-nivå på sitt RX-stift tillbaka till styrenheten.

Två 120-ohms termineringsmotstånd, ett i varje fysisk ände av kabeln, håller bussen vid den recessiva mittpunkten när ingen nod driver och dämpar reflektioner som annars skulle förvanska den differentiella signalen på långa sträckor.

3.25.3. Databildrutan

En CAN-databildruta av standardtyp ser ut så här på ledningen:

Åtta fält ritade i sekvens: SOF (1 bit), ID (11 bitar), RTR (1 bit), kontroll (6 bitar), data (0 -- 8 byte), CRC (16 bitar), ACK (2 bitar) och EOF (7 bitar).

En CAN-databildruta av standardtyp: fälten SOF, ID, RTR, kontroll, data, CRC, ACK och EOF.

Varje fält har en specifik uppgift:

  • SOF (start of frame). En dominant bit som anger att en ny bildruta startar och som synkroniserar varje nods bitklocka.

  • ID (identifierare). Den 11-bitars identifierare som bussen arbitrerar på. Lägre nummer = högre prioritet.

  • RTR (remote transmission request). Sätts vid en begäran om data snarare än en leverans av data; mottagare med ett matchande ID svarar genom att själva skicka datan.

  • Control. Ett 6-bitars fält som kodar datalängden (DLC) och några hushållsbitar.

  • Data. 0 till 8 byte nyttolast (CAN Classic; CAN FD utökar detta till 64 byte).

  • CRC. 16 bitar totalt: en 15-bitars CRC över de föregående fälten plus en 1-bitars CRC-avgränsare.

  • ACK. 2 bitar totalt. I den första biten – ACK-platsen – släpper sändaren ledningen och varje nod som tog emot bildrutan korrekt drar den låg; den andra biten är en recessiv avgränsare. Avsaknad av en ACK talar om för sändaren att ingen nod hörde bildrutan och att den bör försöka igen.

  • EOF (end of frame). Sju recessiva bitar som avslutar bildrutan.

Allt detta genereras och avkodas av CAN-styrenheten i hårdvara; programvaran ser endast ID:t, datan och några få flaggor.

3.25.4. Var CAN passar in

CAN:s designval avgör dess nisch:

  • Robust. Differentiell signalering på ett tvinnat par, inbyggd feldetektering, deterministisk prioritetsarbitrering och automatiska omsändningar gör att CAN överlever elektriskt brusiga miljöer där UART och SPI skulle förvanska data.

  • Multimaster. Vilken nod som helst kan prata när som helst. Ingen central styrenhet krävs och ingen nod utgör en enskild felpunkt.

  • Bandbreddsbegränsad. Klassisk CAN toppar runt 1 Mbit/s; CAN FD utökar detta. CAN är rätt svar när länken går mellan kort eller moduler, ofta över flera meter kabel, med tillförlitlighet som prioritet.

  • Protokoll på högre nivå. Den nakna CAN-bussen säger inte vad ett ID betyder eller hur ett långt meddelande ska delas upp i fragment. Protokoll på applikationslagret – CANopen, J1939, ISO-TP/UDS, NMEA 2000 – lägger dessa regler ovanpå. En separat sak värd att känna till är DBC-filen: ett tillverkarspecifikt textformat som registrerar vilka ID:n som bär vilka bitnivåsignaler på ett visst fordon eller system. DBC-filer är ett metadataformat som beskriver en buss meddelandelayout, inte ett eget protokoll.

Drivrutinen i CAN-bussen i kod hanterar CAN-bildrutan på ledningsnivå; att avbilda ID:n till betydelser är applikationens uppgift.