You are on page 1of 9

COMUNICACIN I2C

I2c es un protocolo diseado por Phillips la cual, y se puede usar sin ningn tipo de problema
legal puesto que la patente ya ha expirado. Este protocolo se ejecuta sobre tres cables, un
cable base (GND), un cable con seal de reloj (SCL) y un tercero con datos (SDA). Todos
ellos se conectan en paralelo.

En este protocolo est contemplada la existencia de un dispositivo master, que inicia la
comunicacin, y dispositivos esclavos. Es posible que exista ms de un master, pero no al
mismo tiempo, es necesario detectar si el canal est libre para poder hacer cambio de master.
I2C es un bus de comunicaciones en serie que significa Inter-Integrated Circuit (Inter-Circuitos
Integrados). La versin 1.0 data del ao 1992 y la versin 2.1 del ao 2000, su diseador
es Philips. La velocidad es de 100 kbit/s en el modo estndar, aunque tambin permite
velocidades de 3.4 Mbit/s.
Es un bus muy usado en la industria, principalmente para comunicar microcontroladores y
sus perifricos en sistemas integrados (Embedded Systems) y generalizando ms para
comunicar circuitos integrados entre s que normalmente residen en un mismo circuito
impreso.
La principal caracterstica de I2C es que utiliza dos lneas para transmitir la informacin: una
para los datos y por otra la seal de reloj. Tambin es necesaria una tercera lnea, pero esta
slo es la referencia (masa). Como suelen comunicarse circuitos en una misma placa que
comparten una misma masa esta tercera lnea no suele ser necesaria.
Las lneas se llaman:
SDA: datos
SCL: reloj
GND: tierra
Las dos primeras lneas son drenador abierto, por lo que necesitan resistencias de pull-up.
Los dispositivos conectados al bus I2C tienen una direccin nica para cada uno. Tambin
pueden ser maestros o esclavos. El dispositivo maestro inicia la transferencia de datos y
adems genera la seal de reloj, pero no es necesario que el maestro sea siempre el mismo
dispositivo, esta caracterstica se la pueden ir pasando los dispositivos que tengan esa
capacidad. Esta caracterstica hace que al bus I2C se le denomine bus multimaestro.
Las transacciones en el bus I2C tienen este formato:
| start | A7 A6 A5 A4 A3 A2 A1 R/W | ACK | ... DATA ... | ACK | stop | idle |
El bus est libre cuando SDA y SCL estn en estado lgico alto.
En estado bus libre, cualquier dispositivo puede ocupar el bus I2C como maestro.
El maestro comienza la comunicacin enviando un patrn llamado "start condition". Esto
alerta a los dispositivos esclavos, ponindolos a la espera de una transaccin.
El maestro se dirige al dispositivo con el que quiere hablar, enviando un byte que contiene
los siete bits (A7-A1) que componen la direccin del dispositivo esclavo con el que se
quiere comunicar, y el octavo bit (A0) de menor peso se corresponde con la operacin
deseada (L/E), lectura=1 (recibir del esclavo) y escritura=0 (enviar al esclavo).
La direccin enviada es comparada por cada esclavo del bus con su propia direccin, si
ambas coinciden, el esclavo se considera direccionado como esclavo-transmisor o
esclavo-receptor dependiendo del bit R/W.
El esclavo responde enviando un bit de ACK que le indica al dispositivo maestro que el
esclavo reconoce la solicitud y est en condiciones de comunicarse.
Seguidamente comienza el intercambio de informacin entre los dispositivos.
El maestro enva la direccin del registro interno del dispositivo que se desea leer o
escribir.
El esclavo responde con otro bit de ACK
Ahora el maestro puede empezar a leer o escribir bytes de datos. Todos los bytes de
datos deben constar de 8 bits, el nmero mximo de bytes que pueden ser enviados en
una transmisin no est restringido, siendo el esclavo quien fija esta cantidad de acuerdo
a sus caractersticas.
Cada byte leido/escrito por el maestro debe ser obligatoriamente reconocido por un bit de
ACK por el dispositivo maestro/esclavo.
Se repiten los 2 pasos anteriores hasta finalizar la comunicacin entre maestro y esclavo.
Aun cuando el maestro siempre controla el estado de la lnea del reloj, un esclavo de baja
velocidad o que deba detener la transferencia de datos mientras efecta otra funcin,
puede forzar la lnea SCL a nivel bajo. Esto hace que el maestro entre en un estado de
espera, durante el cual, no transmite informacin esperando a que el esclavo est listo
para continuar la transferencia en el punto donde haba sido detenida.
Cuando la comunicacin finaliza, el maestro transmite una "stop condition" para dejar libre
el bus.

(Wikipedia)


LIBRERA WIRE ()

Principales funciones
Como se acaba de comentar, esta librera permite la comunicacin de una placa Arduino
con dispositivos I2C y TWI. En la mayora de las placas Arduino, la lnea de datos (SDA)
se encuentra en el pin analgico 4, y la lnea de reloj (SCL) se encuentra en el pin
analgico 5.

Las principales funciones que nos ofrece esta librera son las siguientes:
Wire.begin () y Wire.begin (direccin). Esta funcin inicializa la librera Wire y
conecta Arduino al bus. Si no se especifica la direccin, Arduino se conectar al bus como
maestro, mientras que si sta se indica lo har como esclavo y asumiendo la direccin
que se la ha proporcionado. En ambos casos, esta funcin no devuelve ningn valor.

Wire.requestFrom (direccin, cantidad). Solicita bytes desde otros dispositivos. Los
bytes pueden ser recibidos con las funciones available() (que nos indica si hay datos
disponibles para ser ledos en el bus) y receive() (que realiza la lectura de los datos). Esta
funcin no devuelve nada.

El parmetro direccin es la direccin de 7 bits del dispositivo al que le
queremos pedir los datos
El parmetro cantidad es el nmero de bytes a pedir.

Wire.beginTransmission (direccin). Comienza una transmisin a un dispositivo
I2C esclavo con la direccin que se especifique en el parmetro direccin.
Posteriormente, prepara los bytes a transmitir con la funcin send() y los transmite
llamando a la funcin endTransmision(). Esta funcin no devuelve nada.

El parmetro direccin es la direccin de 7 bits del dispositivo al que le
queremos pedir los datos.

Wire.endTransmission(). Finaliza una transmisin a un esclavo que fue empezada
por beginTransmission(), y realmente lo que hace es transmitir los bytes que fueron
preparados por send(). Esta funcin tampoco devuelve nada.

Wire.Send (valor), Wire.Send (string) o Wire.Send (dato, cantidad). Enva datos desde
un esclavo como respuesta a una peticin de un maestro, o prepara los bytes para
transmitir desde un maestro a un esclavo (entre llamadas a beginTransmission() y
endTransmission()).

El parmetro valor es un byte que se desee enviar.
El parmetro string es una cadena de tipo (char *) que se desee enviar.
El parmetro dato es un vector de datos para enviar (byte *).
El parmetro cantidad es el nmero de bytes que se desea transmitir

Wire.available(). Devuelve el nmero de bytes disponibles para recuperar con
receive(). Debera ser llamada por un maestro despus de llamar a requestFrom() o por
un esclavo dentro de la funcin a ejecutar por onReceive(), que ser lo que nosotros
hagamos al recibir datos del NXT. Esta funcin devuelve el nmero de bytes disponibles
para leer.

Wire.receive(). Recupera un byte que fue transmitido desde un dispositivo esclavo a
un maestro despus de una llamada a requestFrom() o que fue transmitido desde un
maestro a un esclavo. Devuelve el byte recibido.

Wire.onReceive(handler). Registra una funcin que ser llamada cuando un
dispositivo esclavo reciba una transmisin desde un maestro. Esta funcin no devuelve
nada.

El parmetro handler corresponde a la funcin que ser llamada cuando el
esclavo recibe datos. Esta funcin debera coger un nico parmetro entero (el nmero
de bytes recibidos desde un maestro) y no devolver nada, por
ejemplo: void myManejador(int numBytes).

Wire.onRequest(handler). Registra una funcin que ser llamada por el
dispositivo esclavo cuando un maestro solicite datos. No devuelve nada.

El parmetro handler es la funcin que tiene que ser llamada.
A modo de ejemplo se muestra a continuacin el cdigo de un maestro y de un esclavo
que hacen uso de esta librera. El esclavo enva datos, y el maestro los recibe y los
imprime por puerto serie, con lo que se pueden monitorizar desde el PC.










En primer lugar el cdigo del maestro:





Y a continuacin el del esclavo:


(Lopez)




Programa Arduino master:
#include <Wire.h> //Incluimos la librera para comunicacin I2C
int estado = 0; //Asignamos el valor 0 a la variable estado
int pulsador = 9; //Asignamos el valor 9 a la variable pulsador
void setup() {
Wire.begin();
//Empezamos la comunicacin I2C, el parntesis est vaco porque es el master
}
void loop()
{
estado = digitalRead(pulsador); //Comprobamos el estado del pulsador
if(estado == 1){ //Si el estado del botn es igual a 1
Wire.beginTransmission(4); //Empezamos la transmisin con el dispositivo 4
Wire.write(1); //Escribimos un 1 a este dispositivo
Wire.endTransmission(); //Paramos la transmisin
}
else{ //de lo contrario
Wire.beginTransmission(4); //Empezamos la transmisin con el dispositivo 4
Wire.write(2); //Escribimos un 1 a este dispositivo
Wire.endTransmission(); //Paramos la transmisin
}
}
Programa Arduino Slave:
#include <Wire.h> //Incluimos la librera para comunicacin I2C
int led = 10; //Asignamos el valor 10 a la variable led
void setup()
{
Wire.begin(4); //Empezamos la comunicacin I2C con direccin 4 (dispositivo slave)
Wire.onReceive(receiveEvent); //Ira a la funcin receiveEvent cuando entre dato
}
void loop()
{
}
void receiveEvent(int howMany) {
int x = Wire.read(); //Leemos el dato recibido
switch (x) { //select case de la variable x
case 1: //si es 1
digitalWrite(led, HIGH); //enciende el led
break;
case 2: //si es 2
digitalWrite(led, LOW); //apaga el led
break;
}
}





















Memorias I2C

Las memorias EEPROM que funcionan bajo el protocolo I2C han ganando poco a poco
un espacio en el hardware de los equipos electrnicos hasta transformarse en uno de los
medios de almacenamiento de informacin ms populares por su practicidad y sencillez
de manejo. Tener la posibilidad de almacenar datos de diversa ndole en una memoria no
voltil, es una caracterstica importante de los equipos que les permite la desconexin
prolongada de cualquier suministro energtico y conservar durante mucho tiempo
informacin valiosa que de otro modo, se perdera al desconectar un sistema. Tambin
conocidas como memorias de protocolo serie las 24CXX son infaltables en cualquier
equipo electrnico de consumo masivo y aqu te ayudaremos a comprender su
funcionamiento.
Estos diminutos circuitos integrados poseen la capacidad de almacenar datos
organizados, los que deben ser grabados de manera apropiada en su interior y adems
tienen particularidades que los hacen sobresalir y destacar dentro de su gnero. Algunas
de las caractersticas dignas de mencionar, pueden ser las que a continuacin
enumeramos:
Pueden ser escritas y borradas de forma elctrica
= Electrically Erasable Programable Read OnlyMemory
Estn garantizadas para 1 milln de ciclos de escritura/lectura.
Pueden llegar a retener la informacin sin ser alimentadas durante cientos de aos.
Se organizan por pginas para facilitar su direccionamiento y almacenamiento de la
informacin.
Utilizan para su funcionamiento una tensin nica (5Volts o 3,3Volts)
Son compatibles con el protocolo serial I2C (Marca registrada de Philips)
Bajsimo costo.
Amplia variedad de encapsulados para adaptar el modelo necesario, de acuerdo al
tamao de la aplicacin.
(Neoteo)





(Taller Arduino)

Bibliografa
Lopez, A. (s.f.). Blog Personal. Obtenido de http://blog.alvarolopez.net/2012/10/comunicacion-i2c-
con-arduino/
Neoteo. (s.f.). Neoteo. Obtenido de http://www.neoteo.com/memorias-eeprom-i2c-24cxx/
Taller Arduino. (s.f.). Taller Arduino. Obtenido de http://tallerarduino.com/2012/04/27/arduino-
tutorials-cap-6-i2c-comunication/
Wikipedia. (s.f.). Wikipedia Enciclopedia Libre. Obtenido de
http://es.wikipedia.org/wiki/I%C2%B2C

You might also like