Tutorial sul protocollo I2C
Introduzione
Molti dispositivi usano delle interfacce standard per comunicare tra di loro, progettate per rendere la comunicazione affidabile e univoca tra diversi dispositivi prodotti da aziende diverse. Proprio per i motivi citati pocanzi, sono nati degli standard di comunicazione tra questi c’è anche il protocollo I2C, introdotto da Philips Semiconductors, negli anni 80, per poi standardizzarlo agli inizi del 1990.
Il protocollo I2C è stato adottato da molte aziende che producono periferiche e sensori, dove non è richiesta un elevato bit-rate di trasmissione, infatti, i sensori che devono monitorare una grandezza fisica che ha una certa inerzia, trasferisco una quantità limitata di dati.
Il protocollo I2C, ha un rate di trasferimento compreso tra qualche Kb/s fino ad un massimo di un Mb/s, se paragonate alla velocità dei bus moderni, che possono raggiungere anche velocità di migliaia di Gb/s, queste velocità possono sembrare ridicole, ma per un sistema embedded che svolge funzioni di controllo, sono più che sufficienti.
Collegamento elettrico
Uno dei maggiori vantaggi del protocollo I2C è sicuramento quello di poter collegare contemporaneamente ben 255 dispositivi con l’uso di soli due cavi di comunicazione: SDA (dati) e SCL (CLK). In Figura 1 c’è lo schema di principio di come collegare il bus, per il suo corretto funzionamento è necessario connettere due resistori di pull-up, uno per ogni linea di comunicazione, e il valore di resistenza dipende dalle caratteristiche e dalla velocità di trasmissione del bus (vedi paragrafo successivo).
Come calcolare il valore di resistenza di pull-up del bus I2C
Il valore del resistore di pull-up che deve essere inserito sulle linee del bus di comunicazione I2C e’ fondamentale, un valore errato può provocare la perdita dell’informazione trasmessa e/o ricevuta.
I dispositivi connessi sul bus hanno un’interfaccia open-drain/open-collector, quindi, sono delle linee flottanti, non hanno un riferimento e solo ad alta impedenza, per evitare conflitti, per questi motivi bisogna collegare sulle due linee del bus due resistori di valore opportuno.
Un dispositivo digitale (CMOS) è in grado di interpretare un livello basso (VIL) se il valore di tensione è massimo il 30% della tensione d’alimentazione, mentre il livello alto (VIH) il valore di tensione deve essere minimo il 70% della tensione d’alimentazione, l’intervallo di tensione compreso tra questi due livelli è indefinito, cioè non sappiamo l’uscita in quale stato si pone.
Se il resistore connesso sulle linee di pull-up è di valore molto basso non riusciremo a garantire il livello di tensione massimo necessario per per pilotare a livello basso la logica digitale a valle (vedi Figura 3), il MOSFET quando è in conduzione lo possiamo rappresentare come un resistore. Facciamo un esempio, il datasheet di una EEPROM, prodotta da Microchip, fornisce la corrente massima di 3 mA, per avere una caduta di tensione 0.4V sul MOSFET.
Da questi dati possiamo ricavare il valore del resistore di pull-up minimo:
Questo è il valore minimo di resistenza per il quale il dispositivo riesce a garantire un livello di tensione di 0.4V.
Adesso, dobbiamo considerare la capacità parassita presente sulle linee, questo valore è difficile da reperire, di solito si considerano dei valori standard che riporto nella Tabella 1
La capacità parassita rallenta il tempo di salita e discesa durate le commutazioni del segnale, che sono definite come tr (tempo di salita) e tf (tempo di discesa). Consideriamo solo il tempo di salita come in Figura 3
Maggiore sarà il valore del resistore e capacità parassita e maggiore sarà il tempo TR, questo tempo è importantissimo, perché’ determina la velocità massima di trasmissione, se è maggiore del periodo di trasmissione la comunicazione risulterà indecifrabile, poiché ci sarà intermodulazione tra due bit adiacenti. Non possiamo agire sulla capacità parassita poiché essa non è una variabile del sistema ma solo sul valore del resistore di pull-up.
Il comportamento del segnale sul bus è descritta dalla seguente relazione:
che descrive il comportamento esponenziale della Figura 3.
Per il livello alto ,VIH = 0.7 x VCC:
Per il livello basso ,VIL = 0.3 x VCC:
Come indicato nella Figura 3, il tempo di salita del segnale e’ dato dalla differenza tra t2-t1:
Quindi il massimo valore del resistore di pull-up:
Supponiamo di dover progettare un sistema con una frequenza di trasmissione di 400 kHz, e con un tempo di salita (TR) di 300 ns e con una capacità parassita CBUS di 100 pF e sostituiamo i valori nell’ultima relazione:
Conclusione: il valore del resistore deve essere compreso tra:
Specifiche del protocollo I2C
La comunicazione si svolge tra un dispositivo, definito “master”, e gli “slave”, che sono delle periferiche come dei sensori , display, memorie ecc. . Ogni “slave” ha un proprio indirizzo univoco (da 7 a 10 bit) , quando inizia la comunicazione il “master” inserisce sul bus , con trasferimento seriale, l’indirizzo della periferica da interrogare per poi inviare il comando e solo la periferica selezionata può rispondere, onde evitare conflitti sul bus e la corruzione dell’informazione.
In Figura 4 e’ rappresentato il timing di una trasmissione sul bus I2C.
Il “master” genera il segnale di start, per comunicare agli “slaves” che sta per iniziare una trasmissione, ponendo la linea SDA a livello basso. Dopo la generazione del segnale di start, inizia la trasmissione, il primo byte è l’indirizzo dello “slave”, seguito dal bit, che indica la richiesta di trasmissione o ricezione dati:
- “0” : Ricezione dati;
- “1” : Trasmissione dati
Dopo la trasmissione di ogni byte chi trasmette ha l’obbligo di rilasciare il bus SDA nello stato alto, in modo da consentire a chi ha ricevuto i dati di trasmettere l’acknowledge, abbassando la linea SDA in corrispondenza del fronte di salita del clock SCL (vedi Figura 5)
Mentre il frame completo della trasmissione è riportato nella Figura 6:
La sincronizzazione del trasferimento dei dati è eseguito grazie al clock sulla linea SCL, generato dal master, in questo modo tutte le periferiche, anche con caratteristiche diverse, devono trasferire i dati alla stessa velocità.
Spero che le informazioni riportate in questo articolo siano state chiare se doveste avere qualche dubbio non esitate a scrivermi, nel form di seguito, sara’ un piacere per me rispondervi il prima possibile.