You are on page 1of 19

Tutorial Arduino : I2C

En este tutorial se explicara el funcionamiento del bus I2C, entrando en detalle


en como se transmite la trama as como las diferencias con otros buses.
Adems se explicara su uso con Arduino con varios ejemplos de
funcionamiento.

I2C (Inter-Integrated Circuit) es un bus de comunicacin muy utilizado para


comunicar circuitos integrados, uno de sus usos mas comunes es la
comunicacin entre un microcontrolador y sensores perifricos. El I2C es un
bus multi-maestro es decir permite que haya mltiples maestros
y mltiples esclavos en el mismo bus.

El bus I2C cuenta con dos lineas SDA(datos) y SCL(clock) ademas de masa.
Como hemos visto en SPI a cada flanco de SCL se captura un bit de SDA,
aunque la forma de transmitir la informacin es diferente. Ademas hay que
tener en cuenta que la linea SDA solo puede cambiar de valor en caso de que
la linea SCL este a 0.

Conexin I2C. Fuente Wikipedia.


En este caso la misma linea de datos envia la informacin en las dos
direcciones, por lo que es necesario un control de acceso al bus y un
direccionamiento de cada elemento.
En I2C hay un valor fuerte y otro valor dbil, normalmente el 0 es el valor fuerte
y el 1 el dbil Esto es as porque el 0 se consigue forzando la linea a esa
tensin pero por contra el 1 se consigue con pull-up, por lo tanto en caso de
que alguien transmita un 0 y otro un 1, en la linea solo se vera reflejado el 0.
Por lo tanto se define como el valor de reposo del bus como el 1, ya que si
alguien quiere empezar a comunicar siempre podr modificar el estado del bus
y los dems se darn cuenta.

Otro aspecto a tener en cuenta en I2C es que los maestros o


maestro son los nicos que pueden controlar la linea de SCL, eso implica que
solo un maestro puede iniciar una transmisin por lo que un Slave tendr que
esperar a que un maestro le pregunte por un dato para poder enviarlo.

As en I2C cada dispositivo tiene una direccin de 7 bits, es decir se pueden


tener hasta 128 dispositivos conectados al mismo bus, hay que tener en cuenta
que existen versiones extendidas de I2C con direccionamiento a 8,10 y 12 bits.
En el caso del I2C el protocolo del bus si reserva unos campos para poder
realizar la transmisin, cosa totalmente diferente con
el SPI donde podamos enviar en cada byte el dato que queramos.

Una trama I2C esta comprendida por los siguientes campos.

1. Bit de start: Este es un bit especial ya que como hemos dicho antes la
linea SDA no puede cambiar a menos que SCL este a 0. Este bit rompe
dicha norma y provoca un cambio de 1 a 0 cuando SCL esta a nivel alto.

2. Address: El primer byte enviado empieza con 7 bits de direccin, el cual


indica a quien enviamos o solicitamos el dato.

3. R/W (Read/Write): El siguiente bit indica si vamos a realizar


una operacin de lectura o escritura.

4. ACK: Este bit esta presente al final de cada byte que enviamos y nos
permite asegurarnos que el byte ha llegado a su destino. De este modo
el que enva deja el bit a 1 y si alguien a recibido el mensaje fuerza ese
bit a 0. De esta manera confirma que le ha llegado el byte y
la transmisin puede continuar.

5. 1 Byte de datos: Este es el primer byte de datos propiamente dicho ya


que lo anterior no lo podemos elegir nosotros y nos viene impuesto por
el protocolo. Aqu podemos poner el dato que queramos en caso de
comunicacin con sensores remotos un uso habitual es poner el numero
de registro al que queremos escribir o leer. Despus del byte de datos se
espera otro ACK del receptor.

6. Se repite el paso 5 tantas veces como sea necesario.


7. Bit de Stop. En este caso ocurre lo contrario al bit de Start, se pasa de 0
a 1 cuando la linea SCL se encuentra en alto. Esto termina
la transmisin y deja el bus libre para que otro puede empezar a
transmitir.

Trama I2C
Lo explicado anteriormente es una trama tpica de I2C aunque en realidad
puede haber algunas variantes, ya que en caso de que el mismo Master quiera
seguir comunicndose no es necesario terminar la transmisin con un Stop y
luego volver a empezar una transmisin .El protocolo permite que en medio de
una trama se realice otro Start por lo que se tendr que volver a enviar
la direccin y el R/W, as que se puede cambiar el modo de comunicacin y
pasar a una lectura o a otra escritura y acceder a otro sensor o a otro registro
del mismo sensor. En la siguiente imagen se puede ver una trama de este tipo.

Trama con dos Starts.


Uso en Arduino.
Vista la teora del bus I2C es el momento de ver como podemos usarlo en
nuestro Arduino. En el Arduino Uno los pines del I2C se encuentran en el
pin analgico 4(SDA) y el pin analgico 5(SCL). En el Arduino Mega se
encuentran en los pines 20 (SDA) y en el 21(SCL). Finalmente en el nuevo
Arduino Leonardo los pines I2C estn pintados al lado de AREF.

En lo referente a conexiones conectamos los SDA y los SCL de los dispositivos


entre ellos y a la vez una pull-up por cada linea. Estas resistencias pueden
tener valores entre 1k y 10 k, dependiendo de la velocidad de comunicacin.
Un buen valor para esta velocidad es 4.7K. Aunque es cierto que se pueden
conectar sin las pull-up y funciona, en el osciloscopio la seal no se vea muy
bien, as que para evitar posibles errores lo mejor es asegurarse poniendo las
pull-up.
Conexin del I2C con solo un dispositivo.
Para usar el bus I2C en Arduino hay que incluir la librera Wire con #include
<Wire.h>. A continuacin en el setup hay que usar la funcin Wire.begin() esto
inicia el bus I2C y nos define como maestros. Dentro del begin se puede poner
una direccin aunque si solo hay un master no es necesario ya que nadie nos
va a solicitar datos sino que seremos nosotros los que siempre iniciemos la
comunicacin.

Una vez iniciado el bus podemos empezar a transmitir. Para ello se usan 3
instrucciones:

1. Wire.beginTransmission(direccin) :Inicia el bus y ponemos con que


direccin vamos a comunicarnos.

2. Wire.write(bytes): Esta funcin enva uno o varios bytes a la direccin


anterior.

3. Wire.endTransmission(): Finaliza la comunicacin con un STOP y deja


el bus libre.
Cdigo que enva el byte 0x52.

i2c_1.zip
Descargar archivo

Ahora vamos a ver el resultado con el osciloscopio, en el este caso no hay


nadie conectado al otro lado por lo que no se recibir un ACK y se abortara
la transmisin. As podemos ver como con I2C podemos saber si el mensaje a
llegado a su destino.
Trama con not ACK.
Se puede observar como la velocidad de comunicacin es de 100 Kbps esto es
debido a que a diferencia del SPI el protocolo I2C en el modo estndar la
velocidad mxima es de 100 Kpbs, aunque se puede llegar hasta 3.4 Mbps en
otras configuraciones.

En el siguiente ejemplo vamos a conectar dos Arduinos , uno sera configurado


como esclavo y otro como maestro. El cdigo del maestro sera el mismo que el
anterior y ahora vamos a programar el esclavo para que nos ensee por el
monitor Serial lo que recibe por I2C.
Conexin dos Arduinos por I2C.
Cdigo del Slave.

i2c_2.zip
Descargar archivo

Vemos como configuramos el Arduino para actuar como Slave y ademas


configuramos la recepcion por Evento. De esta forma al llegar una trama nos
saltara a la interrupcin y podremos leer los datos almacenados en el buffer. En
nuestro ejemplo solo se enva el byte 0x52 por lo que con el
Serial.print(rec,HEX) nos permite ver ese valor en hexadecimal por el monitor.
Trama con Address 0xF5 y dato 0x52
Envi con Slave.
Finalmente nos queda por ver como enviar datos desde un slave y recibirlos en
un master. Desde el master enviaremos dos nmeros en este caso el 5 y el 7.
Y en el Slave los recibiremos y los sumaremos, posteriormente cuando el
master nos lo pida se enviara el resultado de la suma al Master.
Cdigo del slave.

i2c_3.zip
Descargar archivo
Cdigo del Master.

i2c_4.zip
Descargar archivo

Con estos dos programas en el Arduino, vemos como podemos interactuar


entre dos microcontroladores. Podemos ver el resultado en el osciloscopio
donde se distinguen las tramas de envi y de recepcin.
Imagen con una envi desde el Master y otro desde el Slave.
Finalmente el resultado por el monitor Serial.

Para terminar vamos a exponer las principales ventajas e inconvenientes que


presenta el bus I2C.
Ventajas:

1. 2 hilos + masa para funcionar.

2. Control de flujo.

3. Mecanismo para asegurar que el mensaje ha llegado a su destino


mediante ACK.

4. Muy usado en sensores y otros circuitos integrados.


5. Velocidad media-alta en Arduino 100 Kbps aunque existe otro modo a
3.4 Mbits pero no en Arduino.

6. Cada nodo posee una direccin con el cual podemos comunicarnos


individualmente

Desventajas:

1. No es Full-Duplex por lo que no permite envos y recepciones al mismo


tiempo.

2. Un poco mas complejo que SPI.

3. No hay control de errores, por ejemplo mediante paridad etc. Aunque si


se puede realizar por Software.

4. Velocidad no tan elevada como SPI.

5. En el modo estndar numero de nodos limitado a 128.

Un circuito interintegrado (IC, del ingls Inter-Integrated Circuit) es un bus serie de


datos desarrollado en 1982 por Philips Semiconductors (hoy NXP Semiconductors, parte
de Qualcomm1 ). Se utiliza principalmente internamente para la comunicacin entre
diferentes partes de un circuito, por ejemplo, entre un controlador y circuitos perifricos
integrados.

El sistema original fue desarrollado por Philips a principios de 1980 con el fin de controlar
varios chips en televisores de manera sencilla. Desde mediados de 1990 el IC tambin es
utilizado por algunos competidores para designar los sistemas compatibles IC Philips,
incluyendo Siemens AG (posteriormente Infineon Technologies AG), NEC,
STMicroelectronics, Motorola (Freescale ms adelante), Intersil, etc. Hay un total de mil
circuitos integrados diferentes de ms de 50 fabricantes (segn datos de 2014).

Atmel introdujo por motivos de licencia la designacin TWI (interfaz de dos hilos)
actualmente utilizada por algunos otros fabricantes. Desde el punto de vista tcnico, TWI e
IC son idnticos. Sin embargo, el 1 de octubre 2006, la patente original caduc, as que ya
no hay derechos de autor para el uso del trmino IC. IC no es tampoco una marca
comercial registrada de NXP Semiconductors, la proteccin de marca es slo para el
logotipo.
ndice

[ocultar]

1Historia

2Sistema de bus

o 2.1Definicin elctrica

o 2.2Pulso y estado del bus

o 2.3Direccionamiento

o 2.4Protocolo de transferencia

3Uso

4Estabilidad

5Alternativas

6Vase tambin

7Enlaces externos

Historia[editar]

El bus IC fue introducido en 1982 por Philips para la comunicacin interna entre circuitos
integrados como por ejemplo juegos de CD y televisiones. Para ello, fue desarrollada la
familia de microcontrolador MAB8400, la cual posea un controlador de bus IC. La primera
especificacin estandarizada 1.0 fue publicada en 1992. sta sustituy el estndar original
de 100 kbps por un nuevo modo rpido con 400 kbps y expandi el espacio de
direccionamiento a un modo de 10 bits, de tal manera que en vez de los 112 nodos
originales, ahora es compatible con hasta 1136 nodos.

Con la versin 2.0 de 1998 lleg el modo de alta velocidad (Hs) con un mximo de 3,4
Mbps, aunque los requisitos de voltaje e intensidad de corriente fueron reducidos. La
versin 3.0 de 2007 incluy un nuevo modo denominado Fm+ (modo rpido mejorado) con
una velocidad mxima de 1 Mbps que, al contrario que el modo Hs, utiliza el mismo
protocolo que los modos de 100 y 400 kbps.

En el ao 2012 fue establecido con la versin V.4 un modo an ms rpido, el Ufm (modo
ultrarrpido), el cual es compatible con velocidades de transferencia unidireccionales de
hasta 5 Mbps. En el mismo ao fueron corregidos con la versin actual de V.5 los errores
de la versin anterior. En abril de 2014 fue presentada la versin V.6 que volvi a corregir
algunos errores.

Sistema de bus[editar]
El IC est diseado como un bus maestro-esclavo. La transferencia de datos es siempre
inicializada por un maestro; el esclavo reacciona. Es posible tener varios maestros
mediante un modo multimaestro, en el que se pueden comunicar dos maestros entre si, de
modo que uno de ellos trabaja como esclavo. El arbitraje (control de acceso en el bus) se
rige por las especificaciones, de este modo los maestros pueden ir turnndose.

Un ejemplo esquemtico con un maestro (un microcontrolador) y tres nodos esclavos (un ADC,
un DAC, y otro microcontrolador) con resistencias pull-up Rp.

Definicin elctrica[editar]

En el diagrama de la derecha se encuentran representados tres dispositivos. El IC precisa


de dos lneas de seal: reloj (CLK, Serial Clock) y la lnea de datos (SDA, Serial Data).
Ambas lneas precisan resistencias de pull-up hacia VDD. Cualquier dispositivo conectado
a estas lneas es de drenador o colector abierto (Open Collector), lo cual en combinacin
con las resistencias pull-up, crea un circuito Wired-AND. El nivel alto debe ser de al menos
0,7 x VDD y el nivel bajo no debe ser ms de 0,3 x VDD. Las resistencias en serie Rs (no
representadas en el diagrama), en la entrada de los dispositivos, son opcionales y se usan
como resistencias de proteccin. El Bus IC trabaja con lgica positiva, esto quiere decir
que un nivel alto en la lnea de datos corresponde a un 1 lgico, el nivel bajo a un 0.

Pulso y estado del bus[editar]

La seal de reloj siempre es generada por el maestro. Para cada modo especificado, est
predeterminado respectivamete un pulso de reloj mximo permitido. En general, tambin
pueden ser utilizadas seales de reloj ms lentas, siempre y cuando sean compatibles con
la interfaz del maestro. Sin embargo, algunos circuitos integrados (por ejemplo, un
conversor o convertidor de seal analgica-digital) requieren una frecuencia mnima con el
fin de funcionar correctamente. En la tabla siguiente se muestran los porcentajes mximos
permisibles de reloj.

Modo Velocidad de transmisin mxima Direccin

Standard Mode (Sm) 0,1 Mbit/s Bidireccional

Fast Mode (Fm) 0,4 Mbit/s Bidireccional


Fast Mode Plus (Fm+) 1,0 Mbit/s Bidireccional

High Speed Mode (Hs-mode) 3,4 Mbit/s Bidireccional

Ultra Fast-mode (UFm) 5,0 Mbit/s Unidireccional

Si el esclavo necesita ms tiempo que el dictado por el reloj del maestro, puede mantener,
entre la transferencia de bytes individuales, la seal de reloj en nivel bajo o low (clock-
stretching) para frenar de este modo al maestro.

Los datos (bits individuales) slo son vlidos si su nivel lgico no cambia durante una fase
de reloj alta. Las excepciones son el inicio, la parada, y la seal de inicio repetida o reset.
La seal de arranque es un flanco descendiente en SDA mientras SCL se encuentra en
nivel alto. La seal de parada es un flanco ascendiente en SDA mientras SCL est en en
nivel alto. La seal de reset se comporta de igual manera que la seal de incio.

Una unidad de datos consta de 8 bits = 1 octeto (los cuales puede ser interpretados como
un valor o como una direccin, dependiendo del protocolo) y un bit de ACK. Este bit de
confirmacin (Acknowledge) es sealizado por un esclavo como NACK (not acknowledge)
con un nivel alto, durante un nivel bajo en SDA y el noveno nivel alto de SCL (que sigue
siendo generado por el maestro). El esclavo debe poner un nivel bajo en SDA antes de
que SCL cambie a nivel alto, de lo contrario otros participantes podran interpretar esto
como una seal de arranque.

Direccionamiento[editar]

La direccin de IC estndar es el primer byte enviado por el maestro, aunque los primeros
7 bits representan la direccin y el octavo bit (R/W-Bit) es el que comunica al esclavo si
debe recibir datos del maestro (low/bajo) o enviar datos al maestro (high/alto). Por lo tanto,
IC utiliza un espacio de direccionamiento de 7 bits, lo cual permite hasta 112 nodos en un
bus (16 de las 128 direcciones posibles estn reservadas para fines especiales).

Cada uno de los circuitos integrados con capacidad de soportar un IC tiene una direccin
predeterminada por el fabricante, de la cual los ltimos tres bits (subdireccin) pueden ser
fijados por tres pines de control. En este caso, pueden funcionar en un IC hasta 8 circuitos
integrados. Si no es as, los circuitos integrales (que precisan ser idnticos) deben ser
controlados por varios buses IC separados.

Debido a la escasez de direcciones, se introdujo ms tarde un direccionamiento de 10 bits.


Es compatible con el estndar de 7 bits mediante el uso de 4 de las 16 direcciones
reservadas. Ambos modos de direccionamiento pueden ultilizarse simultnemente, lo que
permite hasta 1136 nodos en un nico bus.
Protocolo de transferencia[editar]

El inicio de una transmisin es indicado por la seal de incio del maestro, seguido de la
direccin. sta es confirmada por el ACK-Bit del esclavo correspondiente. En funcin del
R/W-Bit se escriben bytes de datos (datos al esclavo) o se leen (datos al maestro). El ACK
es enviado desde el esclavo al escribir, y desde el maestro al leer. El ltimo byte ledo es
reconocido por el maestro como un NACK (not acknowledge), para indicar el final de una
transmisin. Una transmisin es finalizada por la seal de parada. Como alternativa, puede
ser enviada una seal de reset al arranque de una nueva transmimsin, sin necesidad de
parar la transmisin anterior con una seal de parada.

Todos los bytes son transferidos de esta manera como Most Significant Bit First (bit ms
significativo primero).

Para el modo de alta velocidad (High-Speed-Mode) es enviado un cdigo del maestro a


travs del modo estndar o rpido, antes de cambiar al aumento de frecuencia.

Uso[editar]

Una de las propiedades del IC es el hecho de que un microcontrolador puede controlar


toda una red de circuitos integrados con slo dos I/O-Pins (Input/Output) y un software
muy simple. Los buses de este tipo fueron realizados ya que una proporcin significativa
del precio de un circuito integrado y la placa de circuito depende del tamao de la carcasa
y del nmero de pines. Una carcasa grande tiene ms pines, necesita ms espacio en la
placa de circuito y tiene ms conexiones que podran fallar. Todo esto aumenta los costes
de desarrollo, produccin y pruebas.

Aunque es ms lento que los sistemas de bus ms nuevos, IC es beneficioso (debido al


bajo coste) para los sistemas perifricos que no necesitan ser rpidos. A menudo es usado
para la transmisin de datos de control y configuracin, por ejemplo para control de
volumen, conversor de seal analgica-digital o digital-analgica con baja tasa de
frecuencia de muestreo, relojes a tiempo real, pequeos espacios de memoria o
conmutadores bidireccionales y multiplexores. Incluso los sensores electrnicos integran
con frecuencia un convertidor analgico-digital con un IC.

Es posible aadir o retirar microcontroladores al bus durante su funcionamiento (Hot-


Plugging).

Tambin es utilizado como base para ACCESS.bus y monitores de interfaz VESA (DCC,
Display Data Channel). El SMBus (del fabricante Intel) para la comunicacin de
componentes de la placa base, se parece mucho al bus IC. La mayora de los circuitos
integrados soportan ambos buses.

El protocolo IC tuvo gran importancia en el pasado en el rea de las tarjetas chip. La


tarjeta sanitaria utilizada en Alemania hasta finales del 2014 era una tarjeta IC, es decir,
debajo de la superficie dorada del chip, se encontraba una simple IC-EEPROM, que poda
ser leda y escrita por el lector de tarjetas a travs de un protocolo de bus IC.

Estabilidad[editar]
El protocolo del IC es por definicin bastante simple, pero a la vez muy susceptible a las
interferencias. Este hecho limita su uso nicamente a entornos de poca interferencia, en
los cuales no se ha de esperar nign tipo de ruido, problemas de compatibilidad
electromagntica o diafonas, ni problemas de contacto (clavijas, enchufes). Asimismo, no
es adecuado como puente entre grandes distancias, como suele ser tpico para los buses
de campo, por ejemplo.

Sin embargo, el bus puede ser implementado por conductores especiales a un mayor nivel
de intensidad de corriente o tensin, gracias a lo cual la posible longitud de potencia y la
distancia de seal de ruido aumenta. Una mayor distancia de ruido es posible a travs de
una implementacin sobre la capa fsica del bus CAN, la cual opera con seales
diferenciales de colector abierto (drenador abierto). Las irregularidades tanto de la seal
SDA como de la seal SCL provocan que los datos sean transmitidos incorrectamente.
Estas irregularidades a menudo no se pueden detectar, especialmente si son producidas
en la seal SDA. nicamente con perturbaciones o irregularidades de corto tiempo, como
por ejemplo muy por encima de la frecuencia de seal, el sistema puede hacerse ms
estable a travs de seales de procesamiento.

Un problema importante dentro de la especificacin de un IC es la falta de un tiempo de


espera, que en ocasiones puede conducir a que los microcontroladores se bloqueen. Si un
esclavo se encuentra empujando la lnea de datos a "0" y el reset restablece al maestro,
esta lnea de datos permanece indefinidamente en "0". De este modo, todo el bus IC
permanece bloqueado con todos los microcontroladores conectados. A no ser que el
esclavo tenga un propio reset, este bloqueo puede ser resuelto nicamente por pulsos de
reloj generados manualmente, es decir, apagar o encender el suministro de energa.

Alternativas[editar]