# I²C

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 nel 1982 e dopo la realizzazione di centinaia di componenti e sistemi negli anni '80, nel 1992 è stata prodotta la prima versione del protocollo 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'arbitraggio 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).

## Uso

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.
Secondo la Philips i circuiti integrati che comunicano con questo protocollo sono più di 1000 di oltre 50 costruttori diversi.

## Dettagli

Il protocollo hardware dell'I$^2$C 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'I$^2$C è un bus sincrono)
Va aggiunta una connessione di riferimento detta, talvolta impropriamente, GND (non visualizzata in figura) e una linea di alimentazione V$_{dd}$ a cui sono connessi i resistori di pull-up (R$_p$) 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.

## Temporizzazione dei segnali

L'I$^2$C 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 I$^2$C 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

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 non può avere luogo una corretta comunicazione).
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 arbitraggio)
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

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 portata 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 V$_{ss}$) per cui in pratica il numero minimo di connessioni fisiche è tre. Per quanto riguarda la connessione positiva di alimentazione (indicata come V$_{dd}$, V$_{dd1}$, V$_{dd2}$, ecc., V$_{cc}$ 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

L'I²C è usato per comunicare con dispositivi in cui semplicità e basso costo sono prioritari rispetto alla velocità di trasmissione. Applicazioni comuni sono:
* Accesso a Memoria flash ed EEPROM che mantengono i dati memorizzati anche quando non sono alimentate
* Accesso a DAC a bassa velocità
* Accesso a ADC a bassa velocità
* Cambiamento del settaggio nei monitor
* Cambiamento del volume in altoparlanti intelligenti
* Controllo di display come nei telefoni cellulari
* Lettura e diagnostica di sensori come, ad esempio, sensori di temperatura o velocità di ventilatori
* Lettura e regolazione di RTC (integrati orologio)
* Attivazione e spegnimento dell'alimentazione di componenti di un sistema elettronico
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'I$^2$C 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.