HOME     

TUTTO O  QUASI  SUL PROTOCOLLO  I2C

Introduzione

Credo che ormai saranno poche le persone a non aver sentito parlare almeno una volta del protocollo di comunicazione I2C. Immagino inoltre che tutti sapranno che  tale sistema consente il trasferimento di dati tra due o più dispositivi elettronici in modo seriale, con soli due fili  ed in entrambe le direzioni. Ciò significa che nell’ambito di una circuiteria più o meno complessa, due o più dispositivi possono  dialogare tra loro, trasferendosi grandi quantità di dati con una complessità ardware notevolmente semplificata. Generalmente in un circuito elettronico così concepito vi è un “master” e degli “slave”. Il primo e sempre un microprocessore o microcontrollore a cui è devoluto il compito di organizzare e dirigere il traffico di dati  proveniente o diretto, dagli o agli “slave”. 

Nella veste di “slave” generalmente possiamo trovare memorie, pll, dds,  amplificatori,  sonde termometriche e molto altro ancora. I due fili a cui facevo riferimento prima prendono il nome di “SDA”  ed  “SCL” e sono comuni a tutti i dispositivi ad esse collegati. Sulla linea SDA viaggiano solo i dati da inviare o da ricevere, mentre sulla linea SCL viaggiano i soli impulsi di clock,  generati dal master che scandisce e temporizza tutte le operazioni necessarie al corretto trasferimento dei dati. Ciò e possibile in quanto entrambe le linee sono tenute a livello alto con delle resistenze di pull-up; mentre i dispositivi ad esse colleagati, siano essi master o slave hanno le loro uscite di tipo open-collector. Ovviamente ad impegnare le linee sarà sempre un dispositivo slave alla volta, grazie ad un codice inviato dal dispositivo master ed univocamente riconosciuto dagli slave.

Descrizione del progetto

Chiaramente esiste una vasta documentazione sia cartacea che on-line che riguarda il  protocollo in oggetto, ma vorrei lo stesso coinvolgervi nell’esperienza da me condotta,  descrivendovi tutti i segnali e le temporizzazioni occorrenti in una comunicazione di questo tipo. Nella nostra esperienza, svolge le funzioni di master il mio personal-computer e fa le veci di slave una memoria eeprom del tipo 24C32. 

Come si può vedere dallo schema elettrico di fig.1, per semplificare al massimo la parte ardware ho preferito utilizzare la porta parallela del mio P.C.,  scegliendo inoltre di prelevare l’alimentazione necessaria al funzionamento della eeprom, direttamente dalla porta parallela. Ciò è possibile in quanto la corrente assorbita dalla eeprom in questione non supera 1mA. Raccomando comunque la massima cautela nell’utilizzare la porta parallela del vostro P.C. , in quanto eventuali errori di connessione tra i vari pins di input-output possono irrimediabilmente danneggiarla, mettendola fuori uso.   

Inizialmente e prima di ogni altra operazione, il master deve inviare sulle linee una particolare  sequenza detta di start, che consiste nel portare a livello logico basso la linea SDA e subito dopo la linea SCL. (vedi fig.2) A seguire sarà inviato il codice “1010” che  riconosciuto dalla eeprom  predisporrà se stessa in stato di comunicazione. Tale codice sarà inviato rispettando i tempi raffigurati nella fig.2 nel modo seguente. Si porta la linea SDA alta e si invia un impulso di clock; si porta la linea SDA bassa e si invia un impulso di clock; e così via  per tutti gli altri bit da inviare. I successivi tre bits sono di identificazione e nel nostro caso sono pari a zero, corrispondente al codice binario impostato sui pins 1; 2 e 3 della eeprom, in questo caso collegati a massa. Ciò consente di gestire fino ad un massimo di otto eeprom collegate in parallelo nello stesso circuito. Il successivo bit posto a zero, segnala alla eeprom che stiamo tentando di scrivere su di essa. 

Dopo questa prima fase, la eeprom invierà un livello basso sulla linea SDA che prende il nome di ACK. Tale segnalazione sarà letta dal master che nel frattempo si sarà posto in ricezione, se così non dovesse accadere, se cioè la eeprom non invierà un livello basso, cioè un ACK, allora vuol dire che si è verificato un errore durante il trasferimento dei bits e quindi bisogna ripetere la procedura dall’inizio. Se invece tutto è andato a buon fine, un ACK sarà ricevuto dal master che potrà così proseguire con l’invio dei dati successivi, relativi questa volta al byte alto ed al byte basso dell’indirizzo della locazione di memoria sulla quale intendiamo scrivere oppure leggere. Da notare che dopo l’invio di ogni byte il master attende l’invio di un ACK dalla eeprom prima di continuare, diversamente ripete tutto dall’ultimo ACK ricevuto correttamente.

Nel caso in cui tutto sia andato secondo la procedura, si prosegue ripetendo l’invio di una sequenza di start, l’invio del codice 1010 e  dei bits 000. Il successivo bits sarà un “1” se vogliamo comunicare alla eeprom che intendiamo leggere dall’indirizzo precedentemente specificato; oppure uno “0”  se vogliamo comunicare alla eeprom che intendiamo scrivere all’indirizzo precedentemente specificato.

Lettura della memoria

Nel primo caso cioè dopo l’invio del bit “1”, il master si predisporrà in lettura ricevendo i dati dalla eeprom, in questo caso sarà il master ad inviare un ACK alla eeprom ogni otto bits ricevuti, informando in questo modo la eeprom che può proseguire con l’invio dei dati successivi. Con questo sistema, se si da come indirizzo iniziale quello della prima locazione, cioè “0000.0000”,  si può leggere l’intero contenuto della eeprom dalla prima fino all’ultima locazione, perché dopo ogni lettura l’indirizzo viene incrementato automaticamente dalla eeprom stessa, come nell’esempio adottato nel software dimostrativo.

Scrittura sulla memoria

Nel caso volessimo scrivere sulla eeprom, occorre che dopo i tre bits di identificazione venga inviato un ulteriore bit pari a “0”, in questo caso la eeprom si predisporrà in scrittura; e subito dopo il master invierà i dati da memorizzare a partire dall’ultimo indirizzo specificato, per un massimo di 32 bytes consecutivi alla volta. Anche in questo caso la eeprom invierà verso il master un segnale di ACK ogni otto bits ricevuti e correttamente memorizzati. Per un corretto utilizzo del protocollo ricordarsi al termine della lettura o scrittura, di chiudere la comunicazione con una sequenza di stop, che consiste nell’inviare a livello alto prima la linea  “SCL” e subito dopo la linea “SDA”.  

Conclusioni

Il software di gestione è visionabile e modificabile da chiunque per eventuali esperimenti e prove; potrete richiederlo direttamente al mio indirizzo e-mail, esso prevede la possibilità di scrivere od incollare sul buffer di scrittura un testo inferiore ad 8 Kbytes e di trasferirlo sulla eeprom in modo permanente, oppure di visualizzare il contenuto della eeprom sul buffer di lettura.

Con questo vi saluto sperando di aver dato un imput valido ed un incoraggiamento a chi non ha ancora preso confidenza con questo tipo di protocollo ritenendolo ostico e fuori portata.

 

IT9DPX - #135  (Francesco M.)