3.25. Nozioni di base sul bus CAN¶
Il CAN (Controller Area Network) fu originariamente progettato da Bosch negli anni “80 per collegare tutte le centraline elettroniche di un’automobile su un unico bus condiviso di breve lunghezza. Domina ancora il cablaggio automobilistico, ma la stessa robustezza, il comportamento in tempo reale e il design multi-master ne fanno il bus di campo predefinito nell’automazione, nella robotica e nelle apparecchiature agricole e industriali di ogni tipo.
Il CAN non ha un singolo «controller» e un insieme di «periferiche» come SPI e I2C. Ogni nodo sul bus è un pari, e qualsiasi nodo può trasmettere ogni volta che il bus è inattivo. Ciò che permette a questo schema di scalare è il design del bus basato su broadcast con arbitraggio.
3.25.1. Broadcast con arbitraggio per priorità¶
Ogni messaggio su un bus CAN porta con sé un identificatore – 11 bit per il frame standard classico, 29 bit per la variante estesa. L’identificatore non è un indirizzo; etichetta ciò di cui il messaggio tratta (numero di giri del motore, posizione del pedale del freno, tensione della batteria, ecc.). Quando un nodo vuole inviare un valore lo trasmette in broadcast contrassegnato con l’identificatore appropriato, e ogni nodo sul bus vede il broadcast. Ciascun ricevitore filtra il bus via hardware per selezionare solo gli ID che gli interessano.
Se due nodi tentano di trasmettere nello stesso momento, il design elettrico del bus fa sì che vinca il messaggio con l’identificatore numerico inferiore senza perdere alcun bit.
Il trucco sta nei due stati elettrici del bus: dominante (logicamente 0) e recessivo (logicamente 1). I fili CAN sono mantenuti alti (recessivo) dalle resistenze di terminazione quando nessun nodo sta comunicando; qualsiasi nodo può tirare giù i fili (dominante) erogando corrente attraverso il proprio transceiver. Il risultato è un wired-AND: se un singolo nodo qualsiasi pilota il bus al livello dominante, la linea legge dominante, e legge recessivo solo quando ogni nodo lo ha rilasciato. Il dominante vince sempre. (Alcune fonti chiamano la stessa disposizione un wired-OR, considerando «dominante» come il segnale asserito anziché l’AND dei bit recessivi – il comportamento fisico è identico in entrambi i casi.)
Il wired-AND in forma concettuale. Il CAN reale esegue la stessa logica su una coppia differenziale (CAN_H / CAN_L) con i transceiver e le resistenze di terminazione ripartiti su entrambi i fili, ma la regola sul bus è la stessa: qualsiasi nodo può tirare al livello dominante, e solo quando ogni nodo lo ha rilasciato la linea legge recessivo.¶
L’arbitraggio sfrutta direttamente questa asimmetria. Ogni nodo trasmittente invia il proprio ID un bit alla volta, a partire dal MSB, e osserva il bus mentre trasmette. Un nodo che mette un bit recessivo sul filo ma rilegge dominante sa che un altro nodo con un ID inferiore sta trasmettendo nello stesso istante e ha vinto quella posizione di bit. Smette immediatamente di pilotare il bus e si mette in ascolto. Il nodo vincente, nel frattempo, vede i propri bit uscire inalterati – dal suo punto di vista non è successo nulla di insolito. L’ID con numero inferiore vince perché i suoi bit dominanti prevalgono sui bit recessivi che gli ID con numero superiore avrebbero altrimenti inviato nelle stesse posizioni.
Il perdente attende quindi che il bus torni inattivo e ritenta automaticamente. Non ci sono collisioni, né messaggi persi – solo un ordinamento di priorità deterministico.
Questo è lo stile publish/subscribe che fa funzionare il CAN su larga scala: chiunque può parlare, chiunque può ascoltare, e gli ID rendono implicito lo smistamento.
3.25.2. Il bus fisico¶
Il controller CAN dell’MCU non pilota direttamente il bus. Espone solo due pin CMOS a 3,3 V – TX (il bit che vuole inviare) e RX (il bit che vede sul bus) – e questi pin vanno a un chip separato chiamato transceiver o PHY CAN. Il transceiver si trova tra il controller e i fili CAN effettivi; è ciò che sa come dialogare con il bus.
Il bus stesso è una coppia differenziale a 5 V:
CAN_H – il filo «alto» della coppia.
CAN_L – il filo «basso».
Nello stato recessivo entrambi i fili si trovano a circa 2,5 V (il punto medio dell’alimentazione a 5 V del bus). Nello stato dominante il transceiver porta CAN_H fino a circa 3,5 V e CAN_L fino a circa 1,5 V, producendo una differenza di circa 2 V tra la coppia. I ricevitori campionano la differenza tra i due fili, il che rende il segnale immune al rumore di modo comune captato lungo lunghe tratte di cavo.
Il duplice compito del transceiver:
Sul lato TX, legge il pin TX single-ended a 3,3 V del controller e pilota CAN_H e CAN_L separandoli per il livello dominante oppure rilascia entrambi per il livello recessivo.
Sul lato RX, legge la coppia differenziale CAN_H / CAN_L e riporta un livello single-ended a 3,3 V sul proprio pin RX verso il controller.
Due resistenze di terminazione da 120 ohm, una a ciascuna estremità fisica del cavo, mantengono il bus al punto medio recessivo quando nessun nodo lo pilota e smorzano le riflessioni che altrimenti corromperebbero il segnale differenziale sulle lunghe tratte.
3.25.3. Il frame di dati¶
Un frame di dati CAN standard appare così sul filo:
Un frame di dati CAN standard: campi SOF, ID, RTR, controllo, dati, CRC, ACK ed EOF.¶
Ogni campo ha un compito specifico:
SOF (start of frame). Un singolo bit dominante che indica l’inizio di un nuovo frame e sincronizza il clock di bit di ogni nodo.
ID (identificatore). L’identificatore a 11 bit su cui il bus esegue l’arbitraggio. Numero inferiore = priorità superiore.
RTR (remote transmission request). Impostato in caso di richiesta di dati anziché di consegna di dati; i ricevitori con un ID corrispondente rispondono inviando essi stessi i dati.
Controllo. Un campo di 6 bit che codifica la lunghezza dei dati (
DLC) e alcuni bit di servizio.Dati. Da 0 a 8 byte di payload (CAN Classic; il CAN FD lo estende a 64 byte).
CRC. 16 bit in totale: un CRC a 15 bit calcolato sui campi precedenti più un delimitatore CRC a 1 bit.
ACK. 2 bit in totale. Nel primo bit – lo slot ACK – il trasmittente rilascia la linea e qualsiasi nodo che ha ricevuto correttamente il frame la tira al livello basso; il secondo bit è un delimitatore recessivo. L’assenza di un ACK indica al trasmittente che nessun nodo ha sentito il frame e che dovrebbe riprovare.
EOF (end of frame). Sette bit recessivi che chiudono il frame.
Tutto ciò viene generato e decodificato dal controller CAN via hardware; il software vede solo l’ID, i dati e alcuni flag.
3.25.4. Dove si colloca il CAN¶
Le scelte di progettazione del CAN definiscono la sua nicchia:
Robusto. La segnalazione differenziale su una coppia intrecciata, il rilevamento degli errori integrato, l’arbitraggio per priorità deterministico e le ritrasmissioni automatiche fanno sì che il CAN sopravviva in ambienti elettricamente rumorosi dove UART e SPI corromperebbero i dati.
Multi-master. Qualsiasi nodo può comunicare in qualsiasi momento. Non è richiesto alcun controller centrale e nessun nodo costituisce un singolo punto di guasto.
Larghezza di banda limitata. Il CAN classico arriva al massimo a circa
1 Mbit/s; il CAN FD lo estende. Il CAN è la risposta giusta quando il collegamento è tra schede o moduli, spesso su metri di cavo, con l’affidabilità come priorità.Protocolli di livello superiore. Il bus CAN nudo e crudo non specifica cosa significhi un ID né come suddividere un messaggio lungo in frammenti. I protocolli di livello applicativo – CANopen, J1939, ISO-TP/UDS, NMEA 2000 – sovrappongono queste regole. Un elemento a parte che vale la pena conoscere è il file DBC: un formato di testo specifico del fornitore che registra quali ID trasportano quali segnali a livello di bit su un particolare veicolo o sistema. I file DBC sono un formato di metadati che descrive la disposizione dei messaggi di un singolo bus, non un protocollo a sé stante.
Il driver in Il bus CAN nel codice gestisce il frame CAN a livello di filo; la mappatura degli ID ai loro significati è compito dell’applicazione.