Impariamo ad usare il protocollo I2C.

Posted in: Elettronica,Schemi e Progetti |

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.

sch_i2c

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

(Articolo visitato: 12.880)

15 Risposte to “Impariamo ad usare il protocollo I2C.”

  1. alessandro Says:

    ciao grazie per la spiegazione…..vorrei chiederti se avevi un pokino di tempo per spiegarmi bene alcune cose…su questo protocollo….grazie

  2. F. Mira Says:

    Ciao Alessandro, un pokino di tempo lo troverò… Dimmi pure. 🙂

  3. Maurizio Mazzotti Says:

    SN761633 RX TX FM STEREO
    Ho questo integrato, anzi ne ho 5,
    è una cosa fattibile quella di poter cambiare canale e alzare il volume? Con l’I2C? Non so a chi rivolgermi. Tutti mi dicono, che è una cosa semplice, però nessuno sa come si fà. Non scherzo, anche la TI che lo produce, mi ha risposto che non sa come fare. Boh!?
    Puoi essere così gentile, almeno per rispondermi?
    73 I4KOZ ora IK4GLT
    Maurizio

  4. Giuseppe D.P. Says:

    Sono un novizio nel campo PIC e asm
    Personalmente mi piace usare il pic 16F84/628
    e l’assembler anche se ci capisco poco.
    Ho gia conservato la pagina col tuo nome nel mio HD.
    Mi interesserebbe il codice di comunicazione ic2
    spiegato magistralmente nella tua pagina
    Ho visto il tuo sito, Sei un maestro.
    Grazie di cuore.
    Giuseppe Di Perna

  5. andrea Says:

    😕 ciaoo a tutti : sono all’ultimo anno di scuola e sto facendo il progetto per l’esame di stato. sto creando un orologio digitale a led da 10mm su un pannello di vetro sintetico . e per ora ho creato i display a sette segmenti con il pcb usando il decoder driver (9368)ora avrei bisogno di un chip orologio voi sapreste dirmi quale utilizare se ne conoscete qualcuno ? sono quasi disperato . io ho trovato un chip orologio il (Ds1307) con quarzo ed è in i2c che è un interfaccia ke nn ho mai usato . tutto questo parte da un pic 18f14k22 . ora nn so se sto utilizando componenti giuste . se gentilmente qualcuno ha capito il tutto sa darmi altri consigli . attendo una risp grazie ! 😕 😕

  6. f.mira Says:

    I componenti sono effetivamente quelli giusti, ma dovresti prima imparare a gestire l’i2c ed il pic, cosa non impossibile ma che richiede molto tempo e forse per fine anno scolastico non c’è la fai. Visto che per la visualizzazione sei già a buon punto, io ti consiglio di usare dei più semplici decade-counter TTL o CMOS, due per i secondi, due per i minuti e due per le ore. Per generare il clock di un secondo, un 4060 con quarzo recuperato da un vecchio orologio da parete va più che bene, ed il risultato è assicurato…Ciao.

  7. andrea Says:

    ciao : grazie davvero di avermi risposto almeno ho qualche altro punto di riferimento . se solo avvessi letto prima il commento . cmq arrivando al punto. spero che ci sei ancora disposto a rispondermi . praticamente io ora ho tutto e sto realizzando il tutto come avevo scritto in precedenza . il pic dalla mia esperienza nn mi crea problemi e pui o meno sto iniziando a capire l’i2c . ma l’unico problema ke sto incontrando che io riesco a creare l’orologio come avevo scritto , ma quello ke mi sta facendo pensare e come comandare i 60 led in cerchio da fare accendere uno ogni secondo per poi in fine arrivare a 60 che saranno tutti accesi , e nello spegnersi per riiniziare il ciclo mi dovra commparire il minuto sul display a segmente che ho creato come faccio

  8. andrea Says:

    avevo pensato di estrarre i secondi dal ds1307 ? pero poi come li divido in 60 inpulsi separati (x led ). seno devo creare un generatore di clock a parte e equilibrarli da farsi ke nn si veda la diferrenza . il cio sara comandato per registrare l’ora , a distanza con un telecomando ad infrarossi . il pannello realizato e un metro x un metro , quindi e di dimensioni sproporzionate è un ageggio bello grosso . . aiutoooooooooooo è un casino quest’eletronica mamma mia 😕 😕

  9. f.mira Says:

    Sicuramente sono diversi i modi possibili per accendere 60 led in sequenza per poi spegnerli sempre uno dopo l’altro. In questo momento mi viene in mente il CD4094, un 8-Bit Shift Register/Latch with 3-STATE Outputs. Se ne colleghi otto in cascata, e ad ogni uscita colleghi un led, ti avanzeranno 4 uscite che non utilizzerai. Dovrai prima porre ad 1 l’ingresso data del primo chip, e dare quindi 60 impulsi di clock, uno al secondo, fino ad accendere tutti i led; dopodichè, poni a zero l’ingresso data di prima e ridai altri 60 impulsi, vedrai i led spegnersi uno dopo l’altro. Questo, per effetto del dato d’ingresso che si propaga lungo tutta la catena di flip-flop. Spero tu abbia studiato questi utilissimi dispositivi. Per il clock te l’ho detto prima, un CD4060 più quarzo va più che bene…..In bocca al lupo.
    Ciao…
    f.mira

  10. andrea Says:

    grazie tante davvero scusa il disturbo . e cmq per lo spegnimento dei led deve avvenire al sessantesimo secondo . e si dovranno spegnere tutti insieme .

  11. f.mira Says:

    Il chip in questione non ha un reset, però dato che usi il pic, dopo aver dato zero all’ingresso data, devi inviare 60 impulsi a 1000 Hz circa ed in 60 ms circa si spegneranno tutti i led.
    Ciao.

  12. andrea Says:

    si ho studiato un po tutto l’apparato , ho fatto lo schema elettrico stamane . e giustamente nn mi trovavo per il reset, e sono arrivato allo stesso punto , il fatto di azzerare col pic per lo spegnimento. ma dimmi , ma te che mestiere fai se posso permettermi di chedertelo

  13. andrea Says:

    buonasera !!! sono ancora io 🙁 spero che ci sei ancora . ho dei problemi ho realizzato il mega orologio . e ora mi ritrovo il pic 18f14k22 e il ds 1307 in mano e devo fare questo dannato programma che mette in funzione il tutto . sto provando a programmare il pic con il PICAXEprogramming editor . ho i pin segnati sul pic dell’ scl e sda x il bus i2c , e io da questo chip mi serve solo l’ora minuti e secondi , i secondi mi serviranno a far accendere i 60led che ho predisposto a cerchio collegandoli al sheeft register cd4094. e per le ore e minuti devo far funzionare i display con 4 9368 decoder driver . come faccio a fare questo programma e ottenere le funzioni che ho scritto in precedenza . ho l’esame tra una settimana e vorrei presentare quest orologio che funziona alla commissione . LEI GENTILE PERSONA RIESCE AD ESSERMI DI AIUTO . MA FACCIA UN CENNO 🙁 sono disperato al massimo oltre ad essere nella fogna 🙁

  14. f.mira Says:

    Ci sono e vorrei poterti aiutare, purtroppo non conosco il picaxe. Dato che i tempi sono stretti, come ti ho suggerito prima, ti consiglio di usare un semplice generatore di clok, tanto a te serve solo un impulso al secondo ed il ds1307 è sprecato, sempre che la prova d’esame non preveda necessariamente l’uso di un pic.
    Un grande in bocca al lupo..

  15. andrea Says:

    crepi : cmq si cerca il pic il prof . grazie mille ancora

Lascia un Commento!