1. 
 
In questo lavoro è stata considerata  la possibilità di utilizzare nel controllo di un 
sistema gestito da un microprocessore l’utilizzo di un sistema di comunicazione , per 
permettere il controllo dello stesso sistema con l’utilizzo di più microprocessori . 
Nella maggior parte dei microprocessori esiste gia un’interfaccia di comunicazione 
seriale, la quale però permette solo un collegamento tra due dispositivi , scopo del 
lavoro è progettare un sistema che gestisca la comunicazione fra quanti più 
dispositivi sia possibile . 
Nel campo automobilistico , data la necessità di controllare svariati sensori in 
un’unica automobile , viene utilizzato dalle maggiori case automobilistiche il sistema 
di comunicazione chiamato CAN ( Controlled Area Network ) . Visto la crescita 
della sua diffusione in campo industriale si è pensato di utilizzarlo per lo scopo 
prefisso .  
La scelta è dovuta pure alla sua facilità di connessione , dato che l’inserimento nella 
linea fisica di componenti per la trasmissione è quanto di più semplice e immediato , 
inoltre permette un esteso range di velocità di trasmissione , arrivando come velocità 
limite a 1 Mbit/s . Altre sue proprietà di indubbia utilità è l’utilizzo per la 
trasmissione di una semplice linea bifilare in rame , corredata di un controllo 
accurato sugli eventuali errori di trasmissione presenti nei messaggi che vengono 
scambiati nella comunicazione . 
Come materiale di consultazione e approfondimento sull’argomento si sono utilizzati 
vari data sheet e note applicative dei componenti dedicati al CAN già presenti nel 
mercato e si è trovato in Internet il sito della CIA ( CAN In Automation ) , 
un’associazione raggruppante un insieme di utenti e di fornitori di prodotti CAN 
nella quale è presente molto materiale esplicativo sul protocollo . 
Una volta quindi deciso il protocollo di comunicazione , trovato del materiale a 
riguardo , si è passato al lavoro vero e proprio , che consiste nel progettare un 
interfaccia hardware tra microprocessore e canale fisico di comunicazione CAN , 
scrivere un insieme di funzioni per la comunicazione e rendere quanto più semplice 
l’utilizzo di tale progetto anche da parte di coloro che pur non conoscendo il CAN 
vorrebberro utilizzarlo . 
Per quanto concerne la parte fisica si sono utilizzati componenti già presenti nel 
mercato e inglobati in un unico stampato lasciando per quanto fosse possibile 
disponibile ogni possibilità di configurazione . La parte di gestione della 
comunicazione è stata scritta in linguaggio C dato che oramai la maggior parte dei 
microprocessori utilizza tale linguaggio , inoltre il programma è strutturato in 
maniera tale da poter essere utilizzato da svariati microprocessori solo cambiando 
qualche riga di codice specifica del componente utilizzato .  
La parte di inizializzazione del sistema è stata affidata ad un programma in ambiente 
Windows con un’interfaccia utente molto semplice , che segue l’inizializzazione 
passo passo e descrive ampiamente i parametri da inserire nel sistema . Alla fine ci si 
trova di fronte ad un pacchetto software per l’utilizzo immediato del sistema . Si è 
poi sviluppato un insieme di funzioni , utilizzanti la comunicazione CAN , capaci di 
gestire il controllo di un sistema con l’utilizzo di più microprocessori ; mentre le 
funzioni di comunicazione CAN restano di valotre generale queste ultime dipendono 
molto dal sistema che si sta utilizzando e possono servire come esempio di utilizzo . 
Ma entrando nei particolari si descriva in maniera schematica la struttura dei vari 
capitoli :  
Nel primo capitolo vengono descritte le principali proprietà del CAN . 
Nel secondo capitolo viene descritto il progetto vero e proprio dell’interfaccia tra 
microprocessore e CAN bus , sia nella sua parte fisica che nella sua parte software , 
inoltre è descritto l'utilizzo del programma in ambiente Windows per 
l’inizializzazione del sistema . 
Nel terzo capitolo è descritto l’utilizzo dell’interfaccia nel controllo di due sistemi , 
confrontando il CAN con un altro sistema di comunicazione e con un controllo a 
singolo microprocessore . 
Nel quarto capitolo viene descritto in maniera approfondita e specifica il protocollo 
CAN nela sua interezza . 
Nelle appendici si trovano in esteso i programmi in linguaggio C sviluppati nel 
progetto e qualche pagina dei data sheet dei componenti utilizzati nel progetto . 
2. 
2.1 CENNI SUL PROTOCOLLO CAN  
Il CAN è un protocollo di comunicazione seriale sviluppato per la prima volta dalla 
Bosch. La nascita e lo sviluppo del protocollo avviene nell’industria automobilistica 
dalla necessità di collegare sempre più dispositivi di controllo in un'automobile , 
cercando però di non aumentare in maniera proporzionale il numero di cavi e 
connessioni per non incidere sul peso totale dell’autoveicolo e sulla complessità del 
sistema. Serviva inoltre un sistema di connessione molto flessibile così da introdurre 
senza troppe fatiche la presenza di nuovi nodi di comunicazione e messaggi da 
trasmettere, dato che l’impiego di sensori nel campo automobilistico è sempre più in 
costante aumento. La scelta di una comunicazione su bus fisico seriale, vale a dire 
con nodi collegati uno dopo l’altro su una stessa linea di trasmissione, è stata quindi 
immediata.  
Tabella 2.1  Elenco di dispositivi di controllo presenti in un’automobile 
controllo delle sospensioni 
airbag 
ABS (Anti Block System) 
ASC (Acceleration Skid Control)  
gestione gas di scarico (regolazione della carburazione) 
messa in fase del motore 
scatola del cambio 
regolazione automatica di sedili, specchietti, luci, ecc. 
regolazione del ventilatore 
chiusura porte 
tensionatura delle cinture 
comunicazione mobile (GSM, ...) 
supporti alla navigazione (GPS, ...) 
radio, tv, videoregistratori, ecc. 
 
Oltre a tali necessità, legate alla possibilità di collegare un gran numero di 
componenti e sensori, c’è da risolvere il problema “ ambientale “, difatti il sistema di 
comunicazione è sistemato in un ambiente molto rumoroso come quello vicino ad un 
motore a scoppio. Il CAN risolve la difficoltà con l’ausilio di una ridondanza nel 
messaggio tale da ridurre la probabilità d'errore rispetto ad un messaggio senza alcun 
controllo del 4.7e-11 e di individuare la presenza in un messaggio fino a cinque 
errori di trasmissione.  
Un ridotto esempio di quantità di dispositivi di controllo presenti su un'automobile di 
media cilindrata è elencato nella tabella 2.1 . 
Data la robustezza alle interferenze elettromagnetiche e la facilità di connessione, il 
CAN bus viene sempre più usato anche nel campo industriale  , sono nati difatti vari 
protocolli di gestione derivanti dal CAN e specifici per un dato campo 
d'applicazione.  
Dato non trascurabile è il costo di tale struttura che deve essere contenuto e non 
essere la parte preponderante di tutto l’autoveicolo. Fortunatamente il mercato è 
ricco di componenti dedicati al CAN, portando una riduzione dei costi e una grande 
scelta senza alcun problema d'incomunicabilità dato che il protocollo CAN risulta 
unico e ben definito nella sua parte fondamentale. Il protocollo è stato codificato 
nella normativa ISO11898.  
Si veda nella tabella 2.2 un elenco parziale dei settori in cui il protocollo CAN è già 
utilizzato : 
Tabella 2.2  Elenco di settori in cui è utilizzato il protocollo CAN 
 Trasporto di persone o di cose 
 Controllo del trasporto pubblico  
 Macchinari mobili 
 Controllo di sistemi industriali 
 Sistemi automatici per la costruzione edile 
 Network embedded  
 Sistemi legati alla medicina 
 Simulatori di volo 
 Fisica delle altre energie 
 ecc. 
 
 
Si vuole ora elencare brevemente un insieme delle proprietà principali del protocollo 
CAN , seguite da una breve descrizione , informazioni più complete e specifiche si 
trovano nel proseguio del capitolo . 
1) Priorità nei messaggi : ogni messaggio ha un suo identificatore che stabilisce la 
priorità nella trasmissione, dato che ogni nodo utilizza lo stesso bus fisico. 
2) Flessibilità di configurazione : è permessa qualsiasi tipo di connessione al bus, 
inoltre ogni oggetto può essere attaccato e staccato dal bus senza alcuna modifica del 
sistema 
3) Multicast : il messaggio arriva contemporaneamente a tutti i nodi, sta ad ognuno 
di questi, leggendo ed interpretando l’identificatore, stabilire se leggere e sfruttare il 
messaggio o non considerarlo. 
4) Multimaster : il sistema non presenta un nodo master, mentre gli altri sono slave, 
ma semplicemente di volta in volta diventa master il nodo che sta trasmettendo 
qualche messaggio sul bus ( i messaggi a più alta priorità sono trasmessi prima )  
5) Scoperta e segnalazione degli errori : la scoperta avviene essenzialmente 
attraverso la ridondanza aggiunta al messaggio, la segnalazione di un errore avviene 
attraverso il bus e subito dopo la scoperta dell’errore. 
6) Ritrasmissione del messaggio con errore fino all'avvenuta ricezione da parte dei 
nodi di un messaggio senza alcun errore rilevabile. 
7) Distinzione tra errori : sono considerati in modo diverso gli errori dovuti a fatti 
temporanei e gli errori permanenti. Nel caso d'errori permanenti dovuti a guasto di 
un nodo, il protocollo toglie automaticamente il nodo dalla comunicazione senza 
bisogno di mettere mano fisicamente al bus, viceversa nel caso di un errore 
temporaneo il nodo può ancora trasmettere. 
 
2.2 CONCETTI FONDAMENTALI SUL CAN  
 
Per avere un’idea di base sulle funzionalità e sul meccanismo di funzionamento del 
protocollo CAN si sono descritti i concetti fondamentali con l’ausilio di qualche 
schema per la comprensione .Il tipo di comunicazione utilizzato dal CAN viene 
denominato seriale , sia rispetto al messaggio sia rispetto alle connessioni fisiche dei 
nodi interessati alla comunicazione. 
Comunicazione seriale rispetto al messaggio significa che il messaggio non è 
trasmesso tutto insieme  ma  bit per bit a catena sulla stessa linea di trasmissione. 
Difatti il protocollo CAN utilizza un'unica linea di trasmissione composta nel caso 
più semplice da due fili elettrici e quindi permette la trasmissione di un solo  bit per 
volta ; il messaggio diventa quindi una sequenza ordinata di bit . La comunicazione 
seriale comporta una presenza ridotta al minimo delle connessioni fisiche tra nodo e 
nodo, permettendo una riduzione del numero di cablaggi e di connessioni necessari 
alla comunicazione. Difatti il CAN è nato in campo automobilistico dove è 
importante ridurre al minimo  l’ingombro e il peso totale di tutte le connessioni 
utilizzate nella gestione del veicolo. Questa scelta comporta una ridotta velocità di 
trasmissione dei dati ; difatti un canale costituito da n linee di trasmissione al posto 
di una necessariamente riesce a trasmettere n volte più messaggi della linea unica 
nello stesso tempo, ma la velocità massima del protocollo CAN, che è di 1 Mbit/s, 
nella maggior parte degli utilizzi è più che sufficiente. 
Il protocollo CAN è anche un tipo di comunicazione seriale rispetto alle 
connessioni , significa che tutti i nodi sono attaccati ad un unico bus di 
comunicazione, come se le connessioni avvenissero in maniera “seriale” lungo tale 
bus. Solitamente negli altri tipi di comunicazione da un nodo principale denominato 
host   si diramano tutte le connessioni dirette a tutti gli altri nodi , mentre nel CAN 
dall’unico bus fisico partono le connessioni verso tutti i nodi del sistema . Mentre nel 
primo caso è permesso solo una comunicazioni dirette tra il nodo host e quelli slave e 
solo una comunicazione indiretta tra due nodi qualsiasi , nel CAN ogni nodo può 
comunicare ad un qualsiasi altro nodo in maniera diretta servendosi del bus di 
comunicazione. Il pregio più evidente è la riduzione della lunghezza delle 
connessioni del sistema, difatti non servono più tutte le connessioni tra l’host e i nodi 
del sistema , ma solo un'unica linea di trasmissione (chiamata bus di comunicazione) 
che parte da un nodo qualsiasi e colleghi in serie tutti gli altri nodi. Si veda nella 
figura 1.1 una rappresentazione schematica della comunicazione seriale rispetto alle 
connessioni . Il cambio di topologia porta però ad una complessità di gestione 
dell’accesso dei vari nodi al bus di comunicazione ; se  difatti può comunicare 
sull’unico bus un solo nodo per volta  occorre un insieme di regole per decidere quali 
nodi ( o messaggi ) abbiano la priorità nell’utilizzo del bus per la comunicazione . 
Solitamente questa gestione porta alla perdita di potere di trasmissione, vale a dire 
che non è possibile che nel bus avvenga la trasmissione continua di messaggi ma una 
parte del tempo è necessario sia persa per decidere quale nodo ha la priorità nella 
trasmissione. Fortunatamente nel CAN non si ha perdita di tempo grazie al sistema di 
trasmissione binario di bit “recessivi” e di bit “dominanti” come sarà descritto nel 
proseguimento della descrizione . 
 •  
 
Figura 2.1 Esempio di comunicazione seriale 
 
Mentre nella maggior parte dei sistemi di comunicazione c’è la presenza di una linea 
di comunicazione nella quale è trasmesso il sincronismo, chiamato per lo più 
CLOCK, costituito da una sequenza di bit 0 e 1 trasmessi tutti ad una prefissata 
frequenza , nel protocollo CAN tale sincronismo non esiste . Questo segnale serve 
per sincronizzare il nodo che trasmette con il nodo che riceve, così che sia ben chiara 
la durata dei bit trasmessi e il punto in cui il ricevitore deve decidere il valore del 
segnale in arrivo.  
Nel protocollo CAN ogni nodo ha un suo clock interno, uguale in frequenza  per tutti 
i nodi del sistema, che il trasmettitore utilizza durante la trasmissione di un 
messaggio per avere bit della stessa durata temporale. Durante la ricezione il nodo 
utilizza i passaggi dei bit costituenti il messaggio da alto a basso e viceversa per 
sincronizzarsi sul messaggio , sfruttando l’inevitabile informazione di 
sincronizzazione già presente nel messaggio in se. 
  
 
Figura 2.2 Esempio di sincronizzazione sul messaggio 
 
Si veda nella figura 2.2 un esempio di utilizzo dei passaggi da alto a basso per la 
sincronizzazione sul messaggio . L’aspetto positivo risulta la mancanza della linea di 
comunicazione del sincronismo ; inoltre il sistema, sincronizzandosi sul messaggio, 
riesce ad evitare errori di lettura del messaggio dovuti a ritardi o compensazioni varie 
introdotte dal canale fisico di comunicazione seguendo così non un suo clock, ma 
quello del messaggio stesso. Tutto questo comporta però una complessità del sistema 
di sincronizzazione dato che si basa solo sul messaggio ; per altre informazioni 
sull’argomento si vedano i capitoli descrittivi del protocollo e in particolare quelli sul 
sincronismo e sul Bit Timing. 
Come visto prima se due o più nodi vogliono trasmettere contemporaneamente un 
messaggio sul CAN bus, deve essere in grado di scegliere.Occorre quindi un 
regolamento capace di decidere quale tra i messaggi deve essere trasmesso per primo 
nel bus seriale. Quest'operazione è chiamata arbitrazione e nel caso specifico del 
CAN bus è di tipo non distruttivo, vale a dire che la scelta del messaggio da 
trasmettere avviene senza perdita né di messaggi  né di tempo, dato che 
l’arbitrazione avviene contemporaneamente alla trasmissione del messaggio 
prescelto. 
Tutto questo è possibile grazie al sistema di rappresentazione dei bit nel bus seriale ; 
esistono due valori tra loro esclusivi del bit : “ dominante” e “ recessivo”. 
 
 Figura 2.3 Esempio di valori logici presenti nel bus 
 
 Quando due o più nodi stanno trasmettendo contemporaneamente la loro catena di 
bit, sul bus seriale appare una catena di bit che dipende da tutte le altre catene di bit 
nel seguente modo : 
1) se almeno uno dei nodi trasmette un bit dominante , sul bus appare un bit 
dominante 
2) se tutti i nodi non trasmettono o trasmettono al massimo bit recessivi , sul bus 
appare un bit recessivo. 
Risulta evidente che il messaggio che appare nel bus è costituito da il risultato di una 
funzione logica sui messaggi trasmessi dai nodi , ma per qualche esempio si veda le 
situazioni descritte nella figura 2.3 . 
Ma si passi a descrivere in maniera più specifica la gestione della comunicazione . 
Non appena il bus è libero, ogni nodo che desidera mandare un messaggio inizia a 
trasmetterlo, anche in contemporanea con altri nodi. La prima parte d'ogni messaggio 
è costituita dall’identificatore, una catena di bit, se possibile, unica solo di quel 
messaggio, ed è su questa che avviene l’arbitrazione. Ogni nodo, mentre sta 
trasmettendo i suoi bit, contemporaneamente controlla se il valore presente nel bus 
seriale corrisponde a quello trasmesso. Non appena si accorge di aver trasmesso un 
bit recessivo e di aver letto un bit dominante (vedi sopra la regola 1), il nodo perde 
l’arbitrazione e non trasmette più alcun bit. E’ successo che almeno un altro nodo 
ha trasmesso contemporaneamente un bit dominante, portando il bus allo stesso 
valore e implicitamente comunicando al nodo "recessivo" d'avere un livello di 
priorità più basso e quindi di bloccare la trasmissione del suo messaggio. 
 
 
 
Figura 2.4 Esempio d'arbitrazione fra tre nodi 
Dato che, per regola del CAN, non esistono contemporaneamente due messaggi con 
identificatore uguale , alla fine dei bit d'identificazione solo un nodo porta a termine 
la trasmissione del messaggio ; si tratta del nodo che legge tutti i suoi bit Recessi 
anche nel bus, ed è quindi o è l’unico che sta trasmettendo o è quello con più alta 
priorità tra i nodi che tentano la trasmissione. 
Gli altri nodi non devono far altro che aspettare il termine del messaggio e non 
appena possibile ritentare la trasmissione, sperando di avere l’identificatore con più 
alta priorità. Se si associa lo zero al valore dominante e l’uno al valore recessivo, i 
nodi con identificatore di valore numerico minore possiedono la più alta priorità di 
trasmissione.  Per un’idea più strettamente legata alla rappresentazione fisica del 
messaggio si veda la figura 2.4 in cui viene rappresentato un esempio di arbitrazione 
tra tre nodi . 
Per quanto concerne la sicurezza nella trasmissione il protocollo CAN prevede un 
sistema di controllo sugli errori inevitabilmente presenti nel messaggio e dovuti al 
rumore della linea di trasmissione. Nel messaggio è aggiunta una ridondanza di 
quindici bit per controllare, al momento della ricezione, la presenza d'eventuali errori 
dovuti alla trasmissione. Ridondanza significa che non viene trasmesso solo il 
messaggio , ma che viene aggiunta dell’informazione ulteriore ( nel caso specifico 
del CAN sono 15 bit ) che permette al ricevitore di accorgersi della presenza nel 
messaggio di qualche errore . Il tipo di controllo si basa sui codici CRC (ciclic 
redundancy code) che verranno descritti in maniera più approfondita nella parte 
dedicata specificatamente al protocollo . Grazie a questo sistema di sicurezza si 
riesce a ridurre la probabilità d'errore di un fattore uguale a 4.7*10
-11
 rispetto allo 
stesso messaggio privo della ridondanza e del controllo su di essa . 
Ma tornando alla comunicazione , qunando il messaggio trasmesso sul bus di 
comunicazione arriva ad un nodo, viene letto e sono eseguiti dei controlli per 
accertare la correttezza dello stesso. Il nodo calcola, basandosi sul messaggio letto, il 
codice CRC e lo confronta con la parte del messaggio contenente il codice CRC 
calcolato alla partenza del messaggio. Se le due sequenze di bit corrispondono, la 
ricezione da parte del nodo di un messaggio senza errori è comunicata al nodo di 
partenza attraverso un messaggio di accettazione . Tale comunicazione avviene 
sovrascrivendo un bit denominato ACK ( parte integrante del messaggio)  ; difatti il 
bit è mandato “ recessivo “ dal nodo che trasmette e viene sovrascritto “ dominante “ 
da tutti i nodi che hanno ricevuto correttamente il messaggio.  
Il nodo che ha appena trasmesso deve quindi controllare se il bit ACK è “ dominante 
“ così da essere sicuro d'avere avuto una trasmissione senza problemi ; in caso 
contrario (bit letto “recessivo”, quindi messaggio corrotto da rumore o nessun nodo 
presente sulla linea) il nodo, appena possibile, ritrasmette il messaggio fino ad un 
buon fine. 
 
 
Figura 2.5 Esempio d'accettazione di un messaggio 
 
C’è differenza tra un nodo che legge un messaggio e un nodo che utilizza le 
informazioni del messaggio : difatti tutti i nodi leggono i messaggi presenti nel bus, 
controllano il CRC e mandano il bit d'ACK ; solo alcuni nodi invece utilizzano le 
informazioni contenute nel messaggio (vedi identificazione). Si veda la figura 2.5 per 
vedere come funziona il meccanismo di accettazione di un messaggio da parte degli 
altri nodi . 
Il messaggio che è presente nel bus, come visto , arriva contemporaneamente a tutti i 
nodi, tutti i nodi lo leggono e controllano la presenza d'eventuali errori ; ma il nodo 
deve essere in grado di capire se le informazioni presenti nel messaggio sono di sua 
utilità (o meglio capire se il messaggio è stato indirizzato proprio a lui). 
Quest'operazione di destinazione avviene attraverso l’uso dell'identificatore 
presente nella prima parte del messaggio. L’identificatore è un insieme di bit che è 
parte fondamentale del messaggio. Se l’identificatore del messaggio appartiene 
all’insieme degli identificatori propri di quel nodo, allora il messaggio è di sua 
competenza ; altrimenti il messaggio è diretto ad altri nodi. Indipendentemente dal 
fatto che il messaggio sia di sua competenza o no, il nodo controlla se c’è la presenza 
d'eventuali errori. L’identificatore ha anche un’altra funzione visto che la prima 
catena di bit formanti il messaggio è quella dell’identificatore; l’operazione 
d'arbitrazione avviene su tali bit. E' evidente la grande importanza portata 
dall’identificatore : serve a definire le priorità di trasmissione tra messaggi e definire 
quali siano i nodi cui il messaggio deve arrivare. 
 
 
 
 3. 
 
Si desidera sviluppare un’interfaccia tra il bus fisico CAN e un qualunque 
microprocessore, così da facilitare l’utilizzo della comunicazione CAN in sistemi già 
dotati di controllo a microprocessore (magari anche già dotati di un altro sistema di 
comunicazione). Nei paragrafi seguenti si vedrà una breve descrizione dei 
componenti attualmente presenti nel mercato , la progettazione dell’interfaccia e la 
creazione di un insieme di funzioni in linguaggio C per la gestione di tutta la 
comunicazione .  
 
3.1 PROGETTAZIONE DELLA PARTE 
HARDWARE DELL’ INTERFACCIA   
 
Nel mercato sono disponibili molti tipi di componenti specifici per la comunicazione 
con il CAN, così è facilitato l’utilizzo di questo protocollo nei vari sistemi controllati 
da microprocessore. Si veda di seguito un elenco dei principali componenti  con una 
breve descrizione del loro funzionamento ed utilizzo : 
- Controllore CAN : si tratta di un componente che gestisce automaticamente il 
protocollo CAN, ed è collegato attraverso una porta di tipo memoria esterna ad un 
microprocessore dal quale riceve i comandi ; in uscita gestisce una doppia linea 
seriale con il messaggio CAN da trasmettere . 
- Trasmettitore CAN : si tratta semplicemente di un’interfaccia tra la linea seriale 
che arriva dal controllore CAN e il bus fisico del CAN. Trasforma segnali seriali di 
tipo seriali classici (PAM 0-5 V.) in segnali di tipo CAN (vedi paragrafo sui segnali 
fisici del CAN per maggiori informazioni). 
- SLIO (Serial Link I\O)  : si tratta di un controllore CAN che non richiede alcun 
microprocessore trattandosi di un nodo CAN gestito da un nodo dotato di