Prima di aggiungere la comunicazione seriale al progetto, ad esempio una eeprom seriale, bisogna conoscere i differenti tipi di comunicazione seriale che è possibile utilizzare. Ci sono due protocolli principali da considerare, i protocolli SPI e I2C. Entrambi i sistemi hanno i propri pro e contro che li rendono più o meno convenienti per l’applicazione data.
Differenze tra SPI e I2C
SPI supporta la comunicazione full-duplex con un throughput molto più alto rispetto ad I2C. non è limitato a parole di 8 bit, in modo da poter inviare messaggi di ogni genere e con contenuti e scopi arbitrari. L’interfaccia SPI non richiede resistenze di pull-up, il che si traduce in un minore consumo di energia. Tuttavia, I2C è più semplice avendo meno linee il che significa che meno piedini sono richiesti per interfacciarsi ad un circuito intergrato. Quando si comunica con più di un dispositivo slave, I2c possiede il vantaggio di un indirizzamento in banda, al posto di avere una linea chip select per ogni slave. I2c supporta inoltre lo slave acknowledgment che significa che si è certi del dispositivo con cui si sta comunicando. Con SPI, un master può inviare dati a vuoto e non saperlo. In generale SPI è consigliato per applicazioni che comunicano lunghi flussi di dati e non solo parole come locazioni di memoria.
Lunghi flussi di dati sono presenti in applicazioni in cui si lavora con un processore di segnali digitali o con un ADC, per esempio, SPI sarebbe perfetto per riprodurre dell’audio memorizzato in una eeprom e riprodotto attraverso un convertitore digitale analogico. Inoltre, dato che SPI supporta elevate dimensioni di dati in confronto a I2C, soprattutto grazie alla sua capacità duplex, è molto raccomandato per applicazioni veloci, che raggiungono le decine di MegaHertz. Inoltre dato che non ci sono dispositivi per l’indirizzamento sviluppati per SPI il protocollo è molto più difficile da usare nel caso di più dispositivi slave. Questo significa che quando si utilizzano più di un nodo, in genere utilizzare I2C è consigliato
Interfaccia SPI
come si può vedere nella figura, SPI ha 4 linee. La linea SCLK è la linea di clock, il clock è generato dal master e scandisce la comunicazione in entrambe le direzioni, e questa linea è un ingresso per tutti gli slave. MOSI è la linea master output slave input e porta i dati dal master verso lo slave. La linea MISO è l’opposto, prende l’output dello slave e lo indirizza al master. Per finire la linea SS conosciuta anche come CS è utilizzata per selezionare lo slave a cui trasferire i dati. Di solito la sequenza di trasferimento consiste nel porre a livello basso la linea SS con un piedino di I/O generico, inviare un numero di X segnali di clock con la giusta polarità e fase, porre a livello alto la linea SS per terminare la comunicazione.
I dati sono trasmessi in entrambe le direzioni, per cui in un sistema “transmit only” i byte ricevuti saranno scartati e in un sistema “receive only” deve essere mandato un byte fittizio. Bisogna aver cura di non invertire la il segnale SS durante la comunicazione siccome questo introdurrà errori. La polarità e il controllo della fase del clock avvengono su ogni fronte del segnale di clock in cui i dati sono ricevuti o inviati. Deve essere settato per coincidere tra master e slave. Esiste inoltre una versione di SPI 3-wire che tuttavia supporta solo la comunicazione half duplex. Questa implementazione usa una linea SISO, questa linea bidirezionale singola trasporta i dati in entrata e in uscita dallo slave. Questa modalità ha una tendenza a non essere supportato dai microcontroller ma può essere facilmente implementato via software.
I2C
I2C consiste di due linee bidirezionali che sono tenute alte a Vdd. La linea SDA corrisponde ai dati seriali e SCL è il clock seriale. I moduli standard I2C supportano indirizzi slave a 7 bit e supportano fino a 112/128 nodi, alcuni moduli estesi supportano indirizzamenti slave a 10 bit, tuttavia tutti i moduli sono limitati ad una capacità di bus di 400pF. Le velocità standard si aggirano intorno ai 10kbps per la modalità Low-speed 100kbps nella modalità Fast plus, e 3.4Mbps nella modalità Hi-speed. I tre tipi di messaggi definiti dal protocollo I2C sono un singolo messaggio che il master scrive ad uno slave, un singolo messaggio che il master legge da uno slave e un messaggio combinato dove il master dispone almeno due letture e/o scritture ad uno o più slave.
La sequenza di comunicazione inizia con il master che invia un bit di start seguito dall’indirizzo dello slave a 7 o 10 bit e infine un bit che seleziona l’operazione: 1 per leggere e 0 per scrivere. A questo punto, se l’indirizzo dello slave esiste sul bus, lo slave invierà un bit di acknowledgment al master. I data sono dunque trasmessi sulla linea SDA nella direzione specificata dal master. Un bit di acknowledgment viene mandato alla fine della trasmissione di ogni byte fino al ricevimento della fine della trasmissione. L’unica eccezione si ha quando il master è in modalità ricevimento e lo slave in modalità trasmissione il master non invierà nessun bit di acknowledgment dopo l’invio dell’ultimo bit ricevuto. In ultimo la comunicazione viene terminata con il master che invia un comando di stop.
I comandi di start e stop altro non sono che semplici transizioni dall’alto al basso (start) sulla linea SDA con SCL alta, o dal livello basso al livello alto (stop) sulla linea SDA con SCL a livello alto. Le transizioni per i bit di dati sono sempre eseguite quando la linea SCL è bassa; lo stato alto è solo per i comandi di start e stop.
Fortunatamente questo fornisce una conoscenza migliore di questi due protocolli, e le loro differenze. Dovrebbe essere molto più semplice scegliere tra i due per un’applicazione data. Ma la vita non è così semplice, bisogna comunque considerare se altri tipi di comunicazione non si addicono bene per l’applicazione sarebbe meglio ancora non utilizzare affatto un protocollo seriale ma utilizzare un tipo di comunicazione parallela.
L’interfaccia I2C presenta, almeno in via teorica, una maggiore sensibilita’ al rumore. A differenza dell’interfaccia SPI, infatti, l’I2C opera sul livello (o stato) anziche’ sul fronte del segnale. Ne consegue che un elevato livello di rumore potrebbe modificare il bit di operazione (quello successivo all’indirizzo) cambiandone il valore e quindi il significato dell’operazione: una lettura da una memoria potrebbe trasformarsi in una scrittura con corruzione inevitabile del suo contenuto. L’SPI invece esegue le letture/scritture tramite appositi comandi sul bus e quindi non e’ affetta da questo fenomeno.
Ciao Emmanuele, volevo chiederti che tipo di elettronica o microcontrollori sono presenti nei tomografi, tipo dispositivi medici come questi
https://i.ytimg.com/vi/4re9IOmSUko/maxresdefault.jpg
A me interessa il settore biomedico, in particolare sull’elettronica che usano dei diversi macchinari, mi riesci a fornire delle fonti, link o riferimenti ?
Grazie
Salve Peter,
non ho mai progettato un apparato del genere. Quando mi sono occupato di medicali nel campo dei raggi x, come micro utilizzavamo Atmel AVRMega. Posso quindi presupporre che nell’apparato indicato può esserci qualsiasi tipo di microcontrollore.
Se l’apparato è di recente realizzazione, direi che un micro ARM sia il giusto compromesso tra costi, performance e versatilità.
Buon giorno Emanuele, avevo una domanda che riguarda il protocollo I2C.
In questo periodo stò approfondendo l’applicazione RTC tramite protocollo I2C.
In particolare non riesco a capire un aspetto di questa tipologia di comunicazione.
Ogni dispositivo è individuato da un indirizzo espresso in esadecimale .
In una citazione :
……http://www.brescianet.com/appunti/Elettronica/Arduino/corso/Esempio_RTC.htm…..
nel listato proposto c’è un commento , che informa:
“..#define DS1307_ADDRESS 0x68 // Indirizzo dell’integrato DS1307
// come indicato nel datasheet….”
Ora io sono andato a scaricarmi il data sheet del DS1307 , ma non ho individuato l’informazione che indica che l’indirizzo dell’integrato è 0x68.
Cortesemente mi potrebbe far chiarezza su questo punto.
Se così fosse significa che tutti gli integrati prodotti hanno lo stesso indirizzo??
Cordialità
roberto r.
Devi leggere a pagina 12 del datasheet, vedi i grafici dove troverai lo slave address= 11010000 che in esadecimale corrisponde a 68
https://www.maximintegrated.com/en/products/digital/real-time-clocks/DS1307.html
Vedi anche
https://www.maximintegrated.com/en/app-notes/index.mvp/id/95
“the address byte contains the 7-bit DS1307 address, which is 1101000, followed by the direction bit (R/active-low W) which for a write is a 0”