3.25. Noțiuni de bază despre magistrala CAN¶
CAN (Controller Area Network) a fost conceput inițial de Bosch în anii 1980 pentru a conecta toate unitățile electronice de control dintr-un automobil pe o singură magistrală partajată scurtă. Încă domină cablajul automobilelor, dar aceeași robustețe, comportamentul în timp real și designul multi-master îl fac magistrala de teren implicită în automatizare, robotică, echipamente agricole și industriale de orice fel.
CAN nu are un singur „controler” și un set de „periferice”, așa cum au SPI și I2C. Fiecare nod de pe magistrală este un egal, iar orice nod poate transmite oricând magistrala este liberă. Ceea ce permite scalarea este designul de tip difuzare-cu-arbitrare al magistralei.
3.25.1. Difuzare cu arbitrare după prioritate¶
Fiecare mesaj de pe o magistrală CAN poartă un identificator – 11 biți pentru cadrul standard clasic, 29 de biți pentru varianta extinsă. Identificatorul nu este o adresă; el etichetează despre ce este mesajul (turația motorului, poziția pedalei de frână, tensiunea bateriei etc.). Când un nod dorește să trimită o valoare, o difuzează etichetată cu identificatorul corespunzător, iar fiecare nod de pe magistrală vede difuzarea. Fiecare receptor filtrează magistrala în hardware pentru a selecta doar ID-urile care îl interesează.
Dacă două noduri încearcă să transmită în același timp, designul electric al magistralei permite mesajului cu identificatorul numeric mai mic să câștige fără a pierde niciun bit.
Trucul constă în cele două stări electrice ale magistralei: dominant (logic 0) și recesiv (logic 1). Firele CAN sunt menținute la nivel ridicat (recesiv) de rezistențe de terminație atunci când niciun nod nu vorbește; orice nod poate trage firele la nivel scăzut (dominant) injectând curent prin transceiverul său. Rezultatul este un ȘI-cablat: dacă vreun singur nod pune magistrala în starea dominantă, linia citește dominant, și citește recesiv doar atunci când fiecare nod a eliberat-o. Dominantul câștigă întotdeauna. (Unele referințe numesc același aranjament un SAU-cablat, tratând „dominantul” ca semnalul afirmat mai degrabă decât ȘI-ul biților recesivi – comportamentul fizic este identic în ambele cazuri.)
ȘI-cablat în formă conceptuală. CAN-ul real rulează aceeași logică peste o pereche diferențială (CAN_H / CAN_L) cu transceiverele și rezistențele de terminație distribuite pe ambele fire, dar regula de pe magistrală este aceeași: orice nod poate trage dominant, doar când fiecare nod a eliberat-o se citește recesiv.¶
Arbitrarea folosește direct această asimetrie. Fiecare nod transmițător își trimite ID-ul câte un bit pe rând, cu MSB primul, și urmărește magistrala în timp ce transmite. Un nod care pune un bit recesiv pe fir, dar citește înapoi dominant, știe că un alt nod cu un ID mai mic transmite în același moment și a câștigat acea poziție de bit. Acesta încetează imediat să mai forțeze magistrala și ascultă. Între timp, nodul câștigător își vede propriii biți ieșind nemodificați – din punctul său de vedere nu s-a întâmplat nimic neobișnuit. ID-ul cu numărul mai mic câștigă deoarece biții săi dominanți suprascriu biții recesivi pe care ID-urile cu numere mai mari i-ar fi trimis altfel în aceleași poziții.
Apoi cel care a pierdut așteaptă ca magistrala să devină liberă și reîncearcă automat. Nu există coliziuni, nici mesaje pierdute – doar o ordonare deterministă după prioritate.
Acesta este stilul publish/subscribe care face ca CAN să funcționeze la scară: oricine poate vorbi, oricine poate asculta, iar ID-urile fac distribuția implicită.
3.25.2. Magistrala fizică¶
Controlerul CAN al MCU-ului nu acționează direct magistrala. El expune doar doi pini CMOS de 3,3 V – TX (bitul pe care vrea să-l trimită) și RX (bitul pe care îl vede pe magistrală) – iar acești pini merg la un cip separat numit transceiver CAN sau PHY. Transceiverul se află între controler și firele CAN propriu-zise; el este cel care știe cum să comunice cu magistrala.
Magistrala însăși este o pereche diferențială de 5 V:
CAN_H – firul „high” al perechii.
CAN_L – firul „low”.
În starea recesivă ambele fire stau la aproximativ 2,5 V (punctul de mijloc al alimentării de 5 V a magistralei). În starea dominantă transceiverul trage CAN_H în sus la aproximativ 3,5 V și CAN_L în jos la aproximativ 1,5 V, producând o diferență de aproximativ 2 V între cele două fire. Receptoarele eșantionează diferența dintre cele două fire, ceea ce face semnalul imun la zgomotul de mod comun captat pe trasee lungi de cablu.
Sarcina dublă a transceiverului:
Pe partea de TX, el citește pinul TX single-ended de 3,3 V al controlerului și fie separă CAN_H și CAN_L pentru dominant, fie le eliberează pe ambele pentru recesiv.
Pe partea de RX, el citește perechea diferențială CAN_H / CAN_L și raportează un nivel single-ended de 3,3 V pe pinul său RX înapoi către controler.
Două rezistențe de terminație de 120 de ohmi, câte una la fiecare capăt fizic al cablului, mențin magistrala la punctul de mijloc recesiv atunci când niciun nod nu o acționează și amortizează reflexiile care altfel ar corupe semnalul diferențial pe trasee lungi.
3.25.3. Cadrul de date¶
Un cadru de date CAN standard arată astfel pe fir:
Un cadru de date CAN standard: câmpurile SOF, ID, RTR, control, date, CRC, ACK și EOF.¶
Fiecare câmp are o sarcină specifică:
SOF (start of frame). Un singur bit dominant care anunță că începe un cadru nou și sincronizează ceasul de bit al fiecărui nod.
ID (identificator). Identificatorul de 11 biți pe care magistrala îl arbitrează. Număr mai mic = prioritate mai mare.
RTR (remote transmission request). Setat la o cerere de date mai degrabă decât la o livrare de date; receptoarele cu un ID corespunzător răspund trimițând ele însele datele.
Control. Un câmp de 6 biți care codifică lungimea datelor (
DLC) și câțiva biți de gestiune.Date. 0 până la 8 octeți de încărcătură utilă (CAN Classic; CAN FD extinde acest lucru la 64 de octeți).
CRC. 16 biți în total: un CRC pe 15 biți peste câmpurile precedente plus un delimitator CRC de 1 bit.
ACK. 2 biți în total. În primul bit – slotul ACK – transmițătorul eliberează linia și orice nod care a primit corect cadrul o trage la nivel scăzut; al doilea bit este un delimitator recesiv. Lipsa unui ACK îi spune transmițătorului că niciun nod nu a auzit cadrul și că ar trebui să reîncerce.
EOF (end of frame). Șapte biți recesivi care închid cadrul.
Toate acestea sunt generate și decodate de controlerul CAN în hardware; software-ul vede doar ID-ul, datele și câteva fanioane.
3.25.4. Unde se situează CAN¶
Alegerile de design ale CAN îi stabilesc nișa:
Robust. Semnalizarea diferențială pe o pereche răsucită, detectarea erorilor încorporată, arbitrarea deterministă după prioritate și reîncercările automate fac ca CAN să supraviețuiască în medii zgomotoase electric, unde UART și SPI ar corupe datele.
Multi-master. Orice nod poate vorbi oricând. Nu este necesar niciun controler central și niciun nod nu este un punct unic de defectare.
Lățime de bandă limitată. CAN clasic atinge maxim aproximativ
1 Mbit/s; CAN FD extinde acest lucru. CAN este răspunsul potrivit atunci când legătura este între plăci sau module, adesea pe metri de cablu, cu fiabilitatea ca prioritate.Protocoale de nivel superior. Magistrala CAN simplă nu spune ce înseamnă un ID sau cum să împartă un mesaj lung în fragmente. Protocoalele de nivel aplicație – CANopen, J1939, ISO-TP/UDS, NMEA 2000 – adaugă acele reguli deasupra. Un element separat care merită cunoscut este fișierul DBC: un format text specific producătorului care înregistrează care ID-uri poartă care semnale la nivel de bit pe un anumit vehicul sau sistem. Fișierele DBC sunt un format de metadate care descrie aranjamentul mesajelor al unei magistrale, nu un protocol propriu.
Driverul din Magistrala CAN în cod gestionează cadrul CAN la nivel de fir; maparea ID-urilor la semnificații este sarcina aplicației.