Professional Documents
Culture Documents
Introducción
El protocolo I2C Inter-Integrated Circuit es un protocolo que permite la comunicación de múltiples dispositivos "Esclavos”
a uno o más dispositivos "Maestros".
Al igual que el protocolo SPI, sólo se diseñó para comunicaciones a corta distancia entre dispositivos. Y tal como las
Interface Serial Asíncrona RS-232 sólo requiere dos cables de señal para intercambiar información.
Debido a que los puertos seriales son asíncronos (sin línea de reloj transmitida), los dispositivos que utilizan este
protocolo deben estar de acuerdo previamente en la velocidad de intercambio de datos. Ambos dispositivos también
deben tener relojes cercanos a esa velocidad. Si existieran diferencias mayores al 4% en las frecuencias de reloj en cada
extremo, esto hará que los datos sean ilegibles.
El puerto serial asíncrono requiere de un hardware dedicado USART en cada extremo, el cual es relativamente complejo
y difícil de implementar con exactitud en software si es necesario. Por lo menos un bit de Inicio y bit de Parada forman
parte de cada trama de datos, lo que significa que se requieren un mínimo de10 bits de tiempo de transmisión para cada
8 bits de datos.
Otra falencia básica de los puertos serie asíncronos es que están pensados para una comunicación entre dos, y sólo dos,
dispositivos. Si bien es posible conectar múltiples dispositivos a un solo puerto serie, la Contención de bus (en el que dos
dispositivos intentan usar la misma línea al mismo tiempo) es siempre un problema y debe ser tratado con cuidado para
evitar daños en los dispositivos, generalmente a través de hardware adicional externo.
Por último, la velocidad de datos es un problema. Si bien no hay límite teórico a las comunicaciones serie asíncronas, la
mayoría de los dispositivos UART sólo admiten un cierto conjunto de velocidades de transmisión estándar fijas, y la más
alta de ellas está alrededor de 230400 Bauds (bits por segundo).
La desventaja más evidente del protocolo SPI es el número de pines requeridos. Conectar un solo Maestro a un solo
Esclavo con un bus SPI requiere cuatro líneas y cada esclavo adicional requiere un pin de Selección de Esclavo adicional
en el Maestro.
La rápida proliferación de las conexiones de pines hace que no sea óptimo en situaciones en las que una gran cantidad de
Esclavos deben estar conectados a un Maestro. Además, el gran número de conexiones para cada dispositivo puede
hacer más difícil el enrutamiento en el diseño de placas de circuito impreso PCB.
SPI sólo permite un maestro en el bus, pero es compatible con un número arbitrario de esclavos (sujeto solamente a la
capacidad de entrega de corriente de los dispositivos conectados al bus y al número de pines de Selección de Esclavo
disponibles).
SPI es bueno para conexiones full-duplex de alta velocidad de datos pues permite velocidades de reloj de hasta 10 MHz
(10 millones de bits por segundo). El hardware en cada extremo es muy simple ya que solo requiere un registro de
desplazamiento, lo que permite una fácil implementación en software.
I2C requiere tan sólo dos cables, al igual que el puerto serial asíncrono, pero esos dos cables pueden soportar hasta 1008
dispositivos esclavos. Además, a diferencia de SPI, I2C puede soportar un sistema Multi-Maestro, lo que permite más de
un maestro para comunicarse con todos los otros dispositivos del bus (aunque los dispositivos Maestros no pueden
comunicarse entre sí a través del bus y deben esperar su turno para utilizar las líneas del bus).
La Velocidad de datos esta entre la del Serial Asíncrono y SPI; la mayoría de los dispositivos I2C pueden comunicarse de
100 kHz a 400 kHz.
Existe algo de sobrecarga con I2C; por cada 8 bits de datos a enviar, se debe añadir un bit más ("ACK / NACK")
El hardware necesario para implementar I2C es más complejo que SPI pero menos que del Serial Asíncrono y puede ser
implementado fácilmente en software.
Cada bus I2C consta de dos señales: SCL y SDA. SCL es la señal de reloj, y SDA es la señal de datos. La señal de reloj se
genera siempre por el Maestro que controla el bus; algunos dispositivos Esclavos pueden forzar el reloj al nivel bajo para
retrasar el envío de más datos del Maestro. Esto se conoce como " estiramiento de reloj".
A diferencia de las conexiones UART o SPI, las líneas del bus I2C son colector abierto , lo que significa que pueden poner
la línea a nivel Bajo, pero no a nivel Alto. Por lo tanto, no puede ocurrir contención en el bus, donde un dispositivo trata
de establecer la línea a nivel Alto, mientras que otro trata establecerla a nivel Bajo, eliminando el daño potencial a los
puertos o excesiva disipación de potencia en el sistema. Cada línea de señal tiene una resistencia pull-up , para restaurar
la señal a nivel Alto cuando no exista ningún dispositivo poniéndola a nivel Bajo.
La selección del valor de las resistencias pull-up varía con los dispositivos en el bus, pero una buena regla general es
comenzar con 4.7k. I2C es un protocolo bastante robusto, y se puede utilizar con longitudes de cable de 2m a 3m. Para
distancias más largas, o sistemas con una gran cantidad de dispositivos, valores de resistencias más pequeñas son
mejores.
Protocolo
La comunicación a través de I2C es más compleja que con un USART o con SPI. La señalización debe adherirse a un
protocolo determinado.
Condición de inicio
Para iniciar la trama de dirección, estando SDA y SCL en 1, el Maestro pone SDA en 0 antes que SCL. Esto pone a todos los
dispositivos Esclavos sobre aviso de que una transmisión está a punto de comenzar. Si dos dispositivos Maestros desean
tomar posesión del autobús a la vez, el Maestro que pone SDA a Bajo primero gana el control del Bus.
Trama de Dirección
El Maestro siempre envía primeramente la trama de dirección en cualquier nueva secuencia de comunicación. Para una
dirección de 7 bits, se envía el bit más significativo (MSB) en primer lugar, seguido de un bit R/_W que indica si se trata
de una operación de Lectura (0) o Escritura (1).
El bit noveno de la trama es el bit ACK/NACK tanto para las tramas de datos como para las de dirección. Una vez que se
envían los primeros 8 bits de la trama, el Esclavo toma control de SDA. Si el Esclavo no pone SDA en 0 antes del noveno
pulso de reloj, el Esclavo receptor, o bien no ha recibido los datos o no pudo procesar la instrucción. En ese caso, el
intercambio se detiene, y el Maestro debe decidir cómo proceder.
Tramas de Datos
Después que la trama de Dirección ha sido enviada, los datos pueden comenzar a ser transmitidos. El Maestro
simplemente continuará generando pulsos de reloj a intervalos regulares, y los datos serán colocados en SDA por el
Maestro o el Esclavo, dependiendo de si el bit R/_W indica una lectura o escritura. El número de tramas de datos es
arbitrario, y la mayoría de los dispositivos esclavos auto-incrementan el registro interno, lo que significa que la lectura o
escritura posterior se realizará en el siguiente registro.
Condición de Parada
Una vez que se han enviado todas las tramas de datos, el Maestro generará una condición de Parada. La condiciones de
Parada se define por una transición de 0 a 1 en SDA después de una transición 0 a 1 en SCL, manteniéndose SCL en 1.
Direcciones de 10 bits
En un sistema de direccionamiento de 10 bits, se requieren dos tramas para transmitir la dirección del Esclavo. La
primera trama estará formada por el código b11110xyz, donde "x" es el bit MSB (bit 9) de la dirección del Esclavo, “y” es
el bit 8, y “z” es el bit de Lectura/Escritura como se describió anteriormente.
El bit ACK de la primera trama será respondida por todos los esclavos que poseen estos dos primeros bits de Dirección.
Al igual que con una transferencia normal de 7 bits, otra transferencia se inicia inmediatamente, y esta contiene los
restante bits 7:0 de la Dirección. En este punto, el esclavo direccionado debe responder con un bit de ACK. Si no lo hace,
el modo de fallo es el mismo que un sistema de 7 bits.
Tenga en cuenta que los dispositivos de dirección de 10 bits pueden coexistir con los dispositivos de dirección de 7 bits,
ya que la codificación '11110' no forma parte de ninguna de Dirección de 7 bits válida.
Los dígitos que aparecen después de 24C indican el tamaño en kilobits de la memoria.
Por ejemplo, el modelo 24LC256 de Microchip tiene una capacidad de memoria de 32kbyte.
Lectura de Datos
Diagrama Esquemático
Código MikroC