Nel febbraio 1986, la Bosch aveva introdotto un bus seriale denominato Controller Area Network, e da allora vi è stata una continua evoluzione, con successive formulazioni standard, fino alle nuove recenti proposte.
Il bus CAN (Controller Area Network), inizialmente concepito per uso in ambito Automotive e poi sviluppatosi anche in applicazioni industriali, è dedicato al collegamento in rete di sensori e attuatori in ambito sistema o sottosistema, con data rate fino a 1 Mbps, secondo una logica Multi-Master, con tutti i nodi che possono trasmettere dati e con più nodi che possono richiedere il bus contemporaneamente, senza quindi il classico indirizzamento di stazioni diverse, ma con la trasmissione di messaggi con priorità, da cui un comportamento deterministico. In questo si evidenzia una delle principali caratteristiche di CAN: un nodo della rete invia un messaggio in broadcasting a tutti i nodi presenti, i quali, sulla base di un identificatore ricevuto, che ne determina anche la priorità, verificano se processare o meno il messaggio. Il livello di priorità dell'identificatore opera, nell'ambito della competizione generale per il possesso del bus, secondo una variante del protocollo CSMA/CD Ethernet, accesso multiplo con controllo della collisione, denominato CSMA/CD/NDA, dove NDA sta per Non-Destructive bitwise Arbitration, che permette la trasmissione di dati che devono essere processati in tempo reale con una rapida "bus allocation" quando più stazioni chiedono contemporaneamente le risorse della rete. Il modello di riferimento è il "producer-consumer": tutti i nodi sono produttori dell'informazione e tutti i nodi nel contempo "consumano" questa informazione, a differenza del più generale modello Source/Destination, presente per esempio in Ethernet, in cui una sorgente dati indirizza una specifica destinazione.
Il principio di funzionamento
Nella trasmissione dati in ambito CAN il contenuto del messaggio è individuato da un identificatore unico per tutta la rete che, secondo uno schema di indirizzamento "content-oriented", definisce anche, come prima detto, la priorità del messaggio, parametro fondamentale quando più stazioni sono in competizione per accedere alla rete. In sintesi, sul bus vi sono due "stati": stato recessivo, equivalente a 1 logico e corrispondente allo stato di silenzio quando nessuna stazione trasmette, e stato dominante, equivalente a 0 logico. Ogni nodo può iniziare a trasmettere un messaggio non appena determina che lo stato del bus è inattivo (sul bus non vi è alcuna trasmissione in corso e il suo livello è recessivo). È possibile che due o più nodi inizino la trasmissione insieme, causando una collisione sul bus. Il conflitto che si genera è risolto direttamente dai nodi interessati tramite il campionamento del livello del bus a ogni tempo di bit. Un nodo che rileva un livello dominante sul bus mentre stà procedendo alla trasmissione di un bit recessivo, prende atto di aver perso la contesa e si pone in stato di ricezione. Questo procedimento prosegue fino all'esaurimento del campo Identifier, finchè non resta un solo nodo vincitore, che può quindi passare alla trasmissione dei propri dati. Da sottolineare che con questa modalità non si ha la perdita di tempo che si avrebbe con una ritrasmissione in caso di collisione come in CSMA/CD Ethernet: i nodi perdenti trasmetteranno in un tempo successivo. La trasmissione dell'identificatore inizia poi dal bit più significativo, per cui più basso è il valore numerico come codifica in bit dell'identificatore, più alta è la priorità del messaggio.
Il format di un messaggio CAN
Le nuove prestazioni delle successive versioni di CAN hanno una diretta corispondenza con una differente concezione del format dei messaggi, per cui occorre partire dal format base, che inizia con il campo SOF, Start Of Frame, livello logico 0 (dominante) usato per sincronizzare i nodi sul bus, cui segue l’Identifier a 11 bit, in cui, un ID con valore binario basso corrisponde a priorità alta (massimo = 00000000000), con lo standard che vieta poi l'uso di identificatori con i sette bit più significativi tutti a 1 dato che questo pattern è adottato come End Of Frame). Al campo Identifier segue il campo RTR, Remote Transmission Request, bit che indica se data frame o, se questo bit è "dominante", Remote Frame, in pratica una richiesta di frame senza data byte. Il Control Field seguente a 6 bit contiene il bit IDE, Identifier Extension, che indica se il formato attuale è standard o esteso, i bit r0 ed r1 non usati e riservati per future espansioni, e il sottocampo DLC di 4 bit, indicante la lunghezza in byte del campo dati: può avere solo valori compresi tra 0 e 8 in quanto 8 byte è la lunghezza massima del successivo Data Field. Dopo il Control Field viene il Data Field, il CRC, 15 bit più un delimiter, usati per controllo di correttezza della trasmissione, e l’ACK Field, o “di conferma”. Questo campo prevede 2 bit: ACK Slot e ACK Delimiter, con ACK Slot inviato a livello recessivo (1 logico): ogni nodo che riceve correttamente un messaggio, forza al livello dominante il bit ACK Slot, in modo che la stazione trasmittente possa sapere che almeno una stazione della rete ha visto transitare correttamente il messaggio, oppure che, in caso negativo, deve procedere alla ritrasmissione. Il format del messaggio si completa End Of Frame, 7 bit a livello recessivo (livello logico 1), e IFS, Interframe bit, campo a 7 bit costituito dal numero minimo di periodi di (stati recessivi) che separano due messaggi consecutivi (parametro programmabile, 3 minimo): se non vi sono altri messaggi, il bus resta in stato Idle (stato recessivo). Per quanto riguarda il formato esteso, le variazioni sono: un bit SRR (Substitute Remote Request) sempre a livello recessivo, collocato dopo il campo identifier a 11 bit e prima del bit IDE, a garanzia di una risoluzione deterministica dell'arbitrazione tra frame standard ed esteso; l'Identifier Extension che con livello recessivo indica formato esteso; ulteriori 18 bit di identificatore esteso dopo l'IDE. La differenza sostanziale si manifesta nel numero di identificatori: con 11 bit si hanno 211 quindi 2048 diversi identifier, che diventano 229 quindi 537 milioni nel formato esteso. Come sintesi, un frame CAN prevede 7 diversi campi: Start of Frame; Arbitration Field, di fatto la parte identificatore; Control Field; Data Field (eventualmente a zero in alcune tipologie di messaggi); CRC Field; ACK Field; End of Frame. Da notare infine che con il rilascio delle specifiche 2.0, si distinguono le due versioni di CAN base ed esteso con le denominazioni CAN 2.0A e CAN 2.0B.
Frame remoti, di errore e di overload
Oltre ai Data Frame sono presenti altre tipologie di messaggi CAN: Remote Frame, Error Frame e Overload Frame, in cui ancora entra in gioco la logica di stato recessivo e dominante. Il Remote Frame, usato per richiedere il valore di uno specifico “oggetto”, è simile al Data Frame, ma non contiene il campo dati, e il bit RTR, come prima detto, ha un valore recessivo mentre è dominante nei Data Frame, per cui a parità di identificatore un frame di dati ha la precedenza su un frame remoto. L’Error Frame evidenzia come nel protocollo CAN siano inclusi meccanismi che consentono al nodo "produttore" la scoperta di possibili errori di trasmissione, con conseguente ritrasmissione dei messaggi corrotti. Ogni nodo prende parte alla verifica dell'errore indipendentemente dal fatto che sia o meno uno dei destinatari del messaggio in transito sul bus, effettuando controlli di formato e di CRC per ogni messaggio in rete; scoperto un errore, il nodo inizia la trasmissione di Error Frame, costituiti da error flag e error delimiter (8 bit a livello recessivo). Sono presenti due tipi di error flag: attivo (6 bit a livello dominante) e passivo (6 bit a livello recessivo). Un error flag attivo, quando è trasmesso, si sovrappone al messaggio in transito ed altera la sequenza di bit sul bus, provocando un errore di ricezione in tutti i nodi della rete, da cui una ripresa automatica della trasmissione da parte del nodo trasmittente originale. entro 23 bit period. Il meccanismo di "error acknowledge" si basa sulla presenza di contatori di errori implementati nei CAN Controller. che si incrementano di 8 ogni volta che si individua un frame errato, e si decrementano di 1 a ogni trasmissione e ricezione corretta. Nelle operazioni normali, un CAN Controller è in "error-active state” e può trasmettere un error frame attivo alla scoperta di un frame corrotto. Se un contatore raggiunge il limite di 96 conteggi (accumulazione di errori) la situazione viene segnalata. Il controllore continua a operare in modo active error fino al limite di 127 conteggi di errore. Al raggiungimento del valore 128, il CAN Controller entra in "error-passive state", stato in cui è ancora in grado di ricevere e trasmettere, ma in cui può segnalare un errore solo tramite un frame di errore passivo. Tale frame può essere ignorato o sovrascritto da altri CAN Controller. Con questa logica si tiene conto del fatto che il nodo in oggetto potrebbe essere guasto e quindi disturbare continuamente le comunicazioni: si parla allora di "confinamento del guasto". Un’ultima citazione riguarda l’Overload Frame, che è simile all'error frame, solo che viene trasmesso da un nodo sovraccarico per rallentare le operazioni in rete.
CAN FD, CAN con data rate flessibile
In via preliminare, si può dire che con CAN FD resta invariata la fase di arbitrazione come pure il meccanismo di acknowledge, e come novità è stata introdotta la possibilità di uno switch a più alti data rate, fino a 15 Mbit/sec, ma solo per la trasmissione del Data Lenght Code, del Data Field e del CRC, la possibilità di avere più di 8 byte di dati (12, 16, 20, 24, 32, 48, 64), e vi sono inoltre nuovi polinomi CRC per campi dati più lunghi, fino a CRC a 21 bit per campi dati a 64 byte. In pratica CAN FD espande le potenzialità di CAN in applicazioni dove sono richiesti data rate superiori, con invio di più degli 8 byte dati standard di CAN base, e la sua flessibilità si manifesta in due modi: controllori CAN FD possono essere parte di comunicazioni standard CAN, con impiego dell'opzione FD solo in specifici modi operativi, per esempio download di software, mentre gli altri controllori che non supportano FD restano in stanby; possibilità di passare a un superiore bit rate dopo che è stata risolta la fase di arbitrazione. Anche per CAN FD è possibile una versione extend con 29 bit di identificatore e questo comporta differenze a livello format del messaggio non concettualmente rilevanti, per cui nel seguito ci si limita al format alla versione con 11 identificatori, indicando i nuovi bit che sono stati introdotti e il loro effetto funzionale. Dopo il campo identifier si posiziona il bit RTR, seguito dal bit IDE e dal nuovo bit EDL, Extended Data Lenght (al posto del precedente r1) a livello recessivo a significare frame FD, seguito da un bit r0 a livello dominante, riservato per future espansioni. Altra novità il bit BRS, Bit Rate Switch, in base al quale si decide il bit rate di trasmissione nel frame: se recessivo si passa dal bit rate standard a quello preconfigurato come alternativo, se dominante non si ha lo switch dal bit rate standard. Una nuova funzione anche con il successivo bit ESI, Error State Indicator, trasmesso dominante da un nodo in stato di errore, recessivo altrimenti. Questa prima parte del frame CAN FD è trasmessa allo stesso bit rate del CAN standard, e si passa a un bit rate più alto se BRS è recessivo, da definirsi in funzione delle performance degli elementi transceiver e delle caratteristiche della rete CAN FD, fino al delimiter del CRC e non oltre. Stando alle esperienze sin qui accumulate, si ritiene che la possibilità di avere due velocità sul bus, una per la fase di arbitrazione e l'altra per la trasmissione dei dati, abbia un impatto limitato sulle architetture hardware dato che i principi base di CAN sono preservati, riguardando i soli controllori e transceiver CAN, e il software di basso livello. In merito alla maggiore quantità di dati trasmissibili, l'impatto è invece superiore dal punto di vista architetturale in quanto le memorie tampone dei controllori CAN devono adattarsi a ricevere un carico utile superiore, e sviluppi in merito sono in corso.