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”.
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.)