I²C

Da Wikipedia, l'enciclopedia libera.

I²C, abbreviazione di Inter Integrated Circuit (pronuncia i-quadro-ci o i-due-ci), è un sistema di comunicazione seriale bifilare utilizzato tra circuiti integrati.

Il classico bus I²C è composto da almeno un master ed uno slave (letteralmente "capo, padrone" e "sottoposto, schiavo").
La situazione più frequente vede un singolo master e più slave; possono tuttavia essere usate architetture multimaster e multislave in sistemi più complessi.

Il bus è stato sviluppato dalla Philips[1] nel 1982 e dopo la realizzazione di centinaia di componenti e sistemi negli anni '80, nel 1992 è stata rilasciata la prima versione del protocollo[2] che ha subìto diversi aggiornamenti ed ha generato bus simili, uno dei quali (SMBUS) per motivi squisitamente commerciali, di brevetto Intel, nel 1995.
Di fatto i due standard si assomigliano in molti aspetti quali l'arbitrazione del bus (cioè la scelta nel caso di più possibili master di quale dispositivo debba assumere questa funzione di controllo del bus), l'alta impedenza (3state) in condizione di rilascio bus, il sistema di indirizzamento ed il protocollo ACK/NACK (vi sono però differenze da tenere presenti[3]).

Uso[modifica | modifica sorgente]

Trattandosi di un protocollo seriale i vantaggi che offre sono quelli di impegnare solo due linee (e quindi due pin dei dispositivi che lo usano).
Un suo limite è la velocità di comunicazione. Lo Standard iniziale è stato comunque aggiornato sotto questo aspetto.
Il protocollo di comunicazione può essere usato liberamente dal 1º ottobre 2006. Numerosi costruttori di circuiti integrati possono implementarlo (su schede madri, microcontrollori ed altri integrati dotati di questo sistema di comunicazione: memorie flash, EEPROM, driver di display, RTC, ecc.) ma, avendo ogni tipo di periferica un proprio codice fisso di riferimento, la registrazione di un nuovo codice richiede il pagamento di un diritto alla Philips[4].

Secondo la Philips i circuiti integrati che comunicano con questo protocollo sono più di 1000 di oltre 50 costruttori diversi.

Dettagli[modifica | modifica sorgente]

Esempio di dispositivi collegati mediante I2C bus (due microcontrollori: uno con la funzione di master ed uno di slave, un ADC ed un DAC). Notare la presenza dei resistori Rp di pull-up. Non è indicata la linea comune di riferimento (indispensabile)

Il protocollo hardware dell'I2C richiede due linee seriali di comunicazione:

  • SDA (Serial DAta) per i dati
  • SCL (Serial CLock) per il clock (per la presenza di questo segnale l'I2C è un bus sincrono)

Va aggiunta una connessione di riferimento detta, talvolta impropriamente, GND (non visualizzata in figura) e una linea di alimentazione Vdd a cui sono connessi i resistori di pull-up[5] che può anche non essere condivisa da tutti i dispositivi (le tensioni tipiche usate sono +5 V o +3,3 V anche se sono ammesse tensioni più basse o più alte). Esistono esempi di architetture più complete[6].

Temporizzazione dei segnali[modifica | modifica sorgente]

Esempio di trasferimento dati:
S è lo START bit (la linea SDA viene forzata bassa dal master mentre il clock SCL è a livello logico alto). Segue, quando SCL è basso il settaggio del primo bit B1 (in blu) la commutazione di SCL indica che il dato è stabile e può essere letto (verde). La stessa procedura prosegue fino all'ultimo bit BN. La transazione termina con lo STOP bit (P) in giallo in cui SDA viene commutato da basso ad alto quando SCL è alto.

L'I2C ha 7 bit di indirizzo (B1 è il bit più significativo, B7 il meno significativo) e quindi 128 possibili indirizzi diversi (detti nodi). Di questi però 16 sono riservati quindi i dispositivi che possono essere collegati sullo stesso bus sono al massimo 112. Le velocità di trasmissione nel modo standard sono di 100 kbit/s e 10 kbit/s (velocità del low-speed mode) ma nulla impedisce di scendere a velocità più basse.
Revisioni del I2C hanno introdotto dispositivi con velocità di 400 kbit/s (detto fast mode) e 3,4 Mbit/s (detto High Speed mode). Anche le possibilità di indirizzamento di dispositivi sono state ampliate a 10 bit.
Il massimo numero di nodi oltre ad essere limitato dal numero di indirizzi possibili diversi è limitato dalle capacità parassite introdotte da ciascun dispositivo. La capacità totale presentata da SDA e da SCL deve essere limitata a 400 pF (i resistori di pull-up dovranno essere dimensionati su questo dato, cioè la massima capacità dovuta alla somma dei dispositivi connessi, oltre al limite della corrente che ogni dispositivo può assorbire al livello logico basso).

Dettagli sui dispositivi[modifica | modifica sorgente]

Come accennato in precedenza l'i2c è un bus con un clock (SCL) e una linea dati (SDA) e 7 bit possibili di indirizzamento. Un bus ha due tipi di nodi:

  • nodo master – il dispositivo che emette il segnale di clock
  • nodo slave – il nodo che si sincronizza sul segnale di clock senza poterlo controllare

Nel bus possono essere presenti più dispositivi che possono svolgere la funzione master ma solo uno alla volta può svolgere questa funzione (altrimenti la corretta comunicazione non può avere luogo).
In fase di progetto (nello sviluppo del software/firmware) si può decidere:

  • di avere sempre lo stesso master
  • di scegliere, ad ogni comunicazione tra circuiti integrati, quale tra i possibili master deve svolgere questa funzione (mediante una procedura detta arbitrazione)

In generale ci sono 4 distinti modi di operare:

  • un master trasmette – controlla il clock e invia dati agli slave
  • un master riceve - controlla il clock ma riceve dati dallo slave
  • lo slave trasmette – il dispositivo non controlla il clock ma invia dati al master
  • lo slave riceve – il dispositivo non controlla il clock e riceve dati dal master.

Il master inizia lo scambio di informazioni inviando lo start bit (S) seguito dall'indirizzo dello slave con cui vuole comunicare (B1, ..., B7). Segue un bit (B8) che indica se vuole trasferire informazioni allo slave (scrivere, ammesso che il dispositivo permetta questa possibilità) o ricevere informazioni (leggere). Nel primo caso il bit B8 tenuto basso dal master nel caso voglia ricevere informazioni rilascerà la linea dati (alto per la presenza del pull-up).

Se lo slave indirizzato (B1, ..., B7) esiste prende il controllo della linea dati sul successivo impulso alto del SCL e la forza bassa (ACK). Il master sa quindi che il dispositivo selezionato ha ricevuto la richiesta ed è in attesa di rispondere. Gli indirizzi e i dati per convenzione del bus sono trasmessi iniziando dal bit più significativo (B1) e terminando con il bit meno significativo. Lo start e lo stop seguono le indicazioni della figura:

  • lo start (S) è costituito da una transizione da alto a basso del bus dati SDA mentre il clock (SCL) è alto
  • lo stop (P) è rappresentato da una transizione da basso ad alto del SDA mentre il SCL è alto.

Se il master vuole ricevere informazioni da uno slave, invia un ACK ad ogni byte ricevuto escluso l'ultimo byte. Dopo questo può inviare uno STOP bit (P) o uno START bit (S) se vuole mantenere il controllo del bus per un altro trasferimento.

Livello fisico[modifica | modifica sorgente]

Bus I2C con resistori aggiuntivi Rs (per la loro funzione vedi nota[7])

A livello hardware, come detto, le linee SCL e SDA sono open-drain o open-collector a seconda della tecnologia usata (rispettivamente MOSFET o BJT).
È quindi indispensabile la presenza di un resistore di pull-up. Quando un dispositivo attiva la sua uscita forza bassa la linea portandola a livello logico zero, lasciandola libera viene tirata alta dal resistore di pull-up ed è considerata a livello logico alto (Vdd).
Questo comporta il vantaggio di non avere in nessun caso conflitti hardware (nessun dispositivo può forzare il livello logico alto).

Va anche detto che, per migliorare la lettura in presenza di disturbi è spesso presente sugli ingressi dei dispositivi un'isteresi.

Il bus è detto a due fili intendendo che la comunicazione necessita di due linee di comunicazione. In realtà è comunque indispensabile avere un filo di riferimento comune (chiamato GND o Vss) per cui in pratica il numero minimo di connessioni fisiche è tre.
Per quanto riguarda la connessione positiva di alimentazione (indicata come Vdd, Vdd1, Vdd2, ecc., Vcc o simili; di solito +5 V o +3,3 V) non è indispensabile che sia comune a tutti i componenti connessi (anche se nella maggior parte delle applicazioni lo è).
Esiste anche la possibilità di usare tensioni di alimentazione diverse per i dispositivi connessi al bus. In questo caso se tutti i dispositivi sono "tolleranti" rispetto alla tensione di alimentazione disponibile possono essere collegati direttamente al bus; altrimenti si dovranno inserire dei circuiti integrati adattatori (disponibili in commercio) tra i nodi che hanno tensioni di alimentazione diverse.

Applicazioni[modifica | modifica sorgente]

L'I2C è usato per comunicare con dispositivi in cui semplicità e basso costo sono prioritari rispetto alla velocità di trasmissione. Applicazioni comuni sono:

Anche se in numerosi microcontrollori è presente una sezione che gestisce direttamente questo protocollo di comunicazione e l'hardware dedicato (spesso indicato nei datasheet genericamente come Two-wire Serial Interface), è possibile implementarlo direttamente usando due generici pin di I/O e un software/firmware abbastanza semplice (in inglese questo metodo è chiamato bit-banging).
Sistemi di comunicazione seriale come l'I2C si sono diffusi quando, per contenere i costi, si sono adottati dispositivi con contenitori (package) ridotti e con numero di pin limitato. Un contenitore piccolo in genere pesa di meno ed ha bisogno di minor potenza, cosa importante specialmente nei telefoni e computer portatili.

Note[modifica | modifica sorgente]

  1. ^ (EN) Vedi logo dell'I²C sul documento ufficiale della Philips
  2. ^ (EN) Prima versione del protocollo e sue revisioni
  3. ^ (EN) Sul documento ufficiale Philips le differenze tra SMBus e I²C. In particolare la frequenza minima di clock (0 Hz per I²C; 10 kHz per l'SMBus) e le differenze sulle soglie dei livelli logici.
  4. ^ (EN) Registrazione di un nuovo codice
  5. ^ Per il calcolo dei resistori Rp vedi, ad esempio: (EN) I2C-bus specification and user manual (PDF), NXP, 9 ottobre 2012, p. 55. URL consultato il 3 luglio 2013 (archiviato l'11 maggio 2013).
  6. ^ (EN) Esempio di una architettura più completa di I2C sul sito Philips
  7. ^ I resistori aggiunti Rs hanno le funzioni di:
    • proteggere i dispositivi indicati in figura come 1 e 2 da disturbi (chiamati spikes) di alta tensione indotti sulle linee SDA e SCL che potrebbero danneggiarli
    • nelle applicazioni standard e soprattutto in modo fast (cioè di trasmissione dati a frequenze elevate) adattare l'impedenza dei dispositivi collegati al bus

Voci correlate[modifica | modifica sorgente]

Altri progetti[modifica | modifica sorgente]

Collegamenti esterni[modifica | modifica sorgente]

informatica Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica