# I²C

I²C és un bus de comunicacions en sèrie. El seu nom ve d'Inter-Integrated Circuit (Circuits Inter-Integrats). La versió 1.0 data de l'any 1992 i la versió 2.1 de l'any 2000, el seu dissenyador és Philips. La velocitat és de 100Kbits per segon en el mode estàndard, encara que també permet velocitats de 3.4 Mbit/s. És un bus molt utilitzat en la indústria, principalment per a comunicar microcontroladors i els seus perifèrics en sistemes integrats (Embedded Systems) i generalitzant més, per a comunicar circuits integrats entre si que normalment resideixen en un mateix circuit imprès.
La principal característica d'I²C és que utilitza dos línies per a transmetre la informació: una per a les dades i per un altre el senyal de rellotge. També és necessària una tercera línia, però esta només és la referència (massa). Com que solen comunicar-se circuits en una mateixa placa que comparteixen una mateixa massa, aquesta tercera línia no sol ser necessària.

## Capa física (PHY)

Les línies s'anomenen:
* SDA: dades
* SCL: rellotge
* GND: mass
Les dues primeres línies són de drenador obert, per la qual cosa necessiten resistències de pull-up. Els dispositius connectats al bus I²C tenen una direcció única per a cadascú. També poden ser mestres o esclaus. El dispositiu mestre inicia la transferència de dades i a més genera el senyal de rellotge, però no cal que el mestre siga sempre el mateix dispositiu, esta característica se la poden anar passant els dispositius que tinguen eixa capacitat. Esta característica fa que al bus I²C se li denomine bus multimestre.

## Capa d'enllaç de dades (MAC)

Les transaccions en el bus I2C tenen aquest format:
* start | A7 A6 A5 A4 A3 A2 A1 | R/W | ACK | ... DATA ... | ACK | stop | idle |
* El bus està lliure quan SDA i SCL estan en estat lògic alt.
* En estat bus lliure, qualsevol dispositiu pot ocupar el bus I²C com a mestre.
* El mestre comença la comunicació enviant un patró de començament "start condition". Açò alerta als dispositius esclaus, posant-los a l'espera d'una transacció.
* El mestre es dirigix al dispositiu amb el que vol parlar, enviant un byte que conté els set bits (A7-A1) que componen la direcció del dispositiu esclau amb què es vol comunicar, i l'octau bit (A0) de menor pes es correspon amb l'operació desitjada (L/E), lectura=1 (rebre de l'esclau) i escriptura=0 (enviar a l'esclau).
* La direcció enviada és comparada per cada esclau del bus amb la seua pròpia direcció, si ambdós coincidixen, l'esclau es considera adreçat com a esclau-transmissor o esclau-receptor depenent del bit R/W.
* L'esclau respon enviant un bit d'ACK que li indica al dispositiu mestre que l'esclau reconeix la sol·licitud i està en condicions de comunicar-se.
* A continuació comença l'intercanvi d'informació entre els dispositius.
* El mestre envia la direcció del registre intern del dispositiu que es desitja llegir o escriure.
* L'esclau respon amb un altre bit d'ACK
* Ara el mestre pot començar a llegir o escriure bytes de dades. Tots els bytes de dades han de constar de 8 bits, el nombre màxim de bytes que poden ser enviats en una transmissió no està restringit, sent l'esclau qui fixa esta quantitat d'acord amb les seues característiques.
* Cada byte llegit/escrit pel mestre ha de ser obligatòriament reconegut per un bit d'ACK pel dispositiu mestre/esclau.
* Es repetixen els 2 passos anteriors fins a finalitzar la comunicació entre mestre i esclau.
* Encara que el mestre sempre controla l'estat de la línia del rellotge, un esclau de baixa velocitat o que haja d'aturar la transferència de dades mentre efectua una altra funció, pot forçar la línia SCL a nivell davall. Açò fa que el mestre entre en un estat d'espera, durant el qual, no transmet informació esperant que l'esclau estiga preparat per a continuar la transferència en el punt on havia sigut detinguda.
* Quan la comunicació finalitza, el mestre transmet una "stop condition" per a deixar lliure el bus.
* Després de la "stop condition", és obligatori per al bus estar inactiu durant uns microsegons.
El codi del kernel de Linux per al suport I2C està separat en diverses peces lògiques:
* I2C xip driver (es maneja un dels xips connectats al bus I2C, tant si es comporta com a mestre o com a esclau)
* I2C bus driver
* I2C algorithm driver
* I2C core (la part genèrica del subsistema d'I2C)

## Fabricants de circuits integrats amb bus I2C

* NXP, Microchip, Texas Instruments, Atmel

## Referències

* ↑ «History of the I2C Bus - Embedded Systems Academy» (en anglès). esacademy. [Consulta: 12 febrer 2017].
* ↑ Kalinsky, David Kalinsky and Roee «Introduction to I2C» (en anglès). Embedded.
* ↑ «I2C tutorial» (en anglès). .robot-electronics. [Consulta: 12 febrer 2017].
* ↑ «I2C Info – I2C Bus, Interface and Protocol» (en anglès). i2c.info. [Consulta: 12 febrer 2017].

## Vegeu també

* Altres busos de comunicació sèrie: SPI, I²S, M-Bus, SMBus, MIDI, Modbus, I3C
* Busos de comunicació en paral·lel : IEEE 488, PXI (PCI eXtensions for Instrumentation), IEEE 1284, PCMCIA, PCI Express