Interfaz de comunicación I2C
20 de octubre de 2023
En el mundo de los sistemas integrados y la electrónica, es fundamental que exista una comunicación eficaz entre los componentes. Entre los numerosos protocolos de comunicación disponibles en la actualidad, el I2C (Inter-Integrated Circuit) destaca como una opción muy popular entre muchos ingenieros y desarrolladores debido a su sencillez, flexibilidad y bajo consumo energético.
En este artículo:
¿Qué es I2C?
Inter-Integrated Circuit, abreviado como I²C (que se pronuncia «I al cuadrado C» o «I dos C»), es un protocolo de comunicación en serie ampliamente utilizado que se caracteriza por su diseño de bus en serie de un solo extremo, con múltiples maestros y múltiples esclavos, adecuado para la comunicación a corta distancia. La característica única de I²C es que utiliza solo dos hilos para la comunicación, SDA (datos en serie) y SCL (reloj en serie), lo que simplifica las conexiones y ahorra espacio.
Aunque la notación oficial es «I²C», que se pronuncia «eye-squared-see», por simplicidad nos referiremos a ella como «I2C». El símbolo ² es un 2 en superíndice, lo que significa que la I se multiplica por sí misma dos veces. Esto hace referencia a los dos cables que se utilizan para la comunicación.
Características de I2C:
- I2C es un protocolo de comunicación de datos en serie y síncrono.
- Utiliza solo dos cables para la comunicación: datos en serie y reloj en serie.
- Admite varios dispositivos maestros y varios dispositivos esclavos en el mismo bus.
- Transmisión semidúplex: la comunicación entre el dispositivo maestro y el esclavo puede producirse en ambas direcciones, pero no simultáneamente.
- Ampliación del reloj: un dispositivo esclavo puede mantener la línea de reloj activa para disponer de más tiempo para procesar los datos.
- Arbitraje: en caso de que dos maestros inicien la transmisión al mismo tiempo, I2C cuenta con un método integrado para decidir cuál de ellos continúa y cuál debe esperar, garantizando así la integridad de los datos.
- Sistema de direccionamiento de 7 bits, aunque también admite direcciones de 10 bits.
- Admite diferentes velocidades: la especificación estándar I2C define cuatro niveles de velocidad: modo estándar (100 kbps), modo rápido (400 kbps), modo rápido Plus (1 Mbps) y modo de alta velocidad (3,4 Mbps).
Más información:Comunicación en serie frente a comunicación en paralelo
¿Cómo funciona el I2C?
I2C es un bus serie de dos hilos que utiliza dos líneas bidireccionales de drenaje abierto, SDA y SCL, ambas con nivel alto.
- SDA (línea de datos en serie): Esta línea transmite datos.
- SCL (línea de reloj en serie): Esta línea proporciona la sincronización.
Los dispositivos conectados al bus I2C pueden actuar como maestro o como esclavo:
- Maestro (controlador): Inicia y controla la transferencia de datos en el bus.
- Esclavo (periférico): Responde al maestro.
Los términos «maestro» y «esclavo» se han utilizado históricamente para describir las funciones de los dispositivos en el bus I2C, pero en muchos contextos han sido sustituidos principalmente por «controlador» y «periférico».
Proceso de comunicación de datos I2C
- Condición de inactividad del bus (bus libre):
- Antes de que comience cualquier comunicación, tanto la SDA (línea de datos en serie) como la SCL (línea de reloj en serie) permanecen en nivel alto, lo que indica que el bus está inactivo.
- Condición de inicio:
- A iniciativa del maestro, se produce una condición de inicio cuando la línea SDA pasa de estado alto a bajo mientras la línea SCL se encuentra en estado alto. Esto indica a todos los dispositivos esclavos que la comunicación está a punto de comenzar.
- Envío de la dirección:
- El dispositivo maestro envía una dirección de 7 bits al esclavo con el que desea comunicarse. A continuación, se envía un octavo bit, el bit de lectura/escritura (R/W), que indica la dirección de la operación:
0para la escritura y1para leer. - Esta secuencia combinada de 8 bits se denomina «trama de dirección».
- En el caso particular de las direcciones de 10 bits, el maestro envía 2 bytes. El primer byte comienza con 11110, seguido de los bits 9 y 8 de la dirección de 10 bits, y a continuación del bit R/W. El segundo byte contendrá los bits 7-0 de la dirección de 10 bits.
- El dispositivo maestro envía una dirección de 7 bits al esclavo con el que desea comunicarse. A continuación, se envía un octavo bit, el bit de lectura/escritura (R/W), que indica la dirección de la operación:
- Bit de acuse de recibo (ACK):
- Una vez enviados la dirección y los bits de lectura/escritura, el maestro libera la línea SDA. El dispositivo esclavo al que se ha dirigido la dirección pone la línea SDA en nivel bajo (bit de confirmación) para confirmar que ha recibido correctamente su dirección y que está listo para la comunicación.
- Transferencia de datos:
- En una operación de escritura, el maestro envía un byte de datos al esclavo. El esclavo confirma la recepción poniendo la línea SDA a nivel bajo durante un pulso de reloj.
- En una operación de lectura, el esclavo envía un byte de datos al maestro. El maestro confirma la recepción, pero liberará la línea SDA (un NACK o ninguna confirmación) tras el último byte de la operación de lectura, lo que indica al esclavo que deje de enviar datos.
- Condición de parada:
- Para finalizar una sesión de comunicación, el maestro genera una condición de parada haciendo que la línea SDA pase de bajo a alto mientras la línea SCL está en alto. Tras la condición de parada, el bus vuelve al estado de reposo.
- El maestro también puede generar una condición de inicio repetida para mantener el control del bus durante otra operación de lectura o escritura. Esto se utiliza a menudo en operaciones más complejas, como cambiar la dirección de los datos sin liberar el bus.
Más información:¿Qué es la velocidad de transmisión?
Cómo dirigirse a varios esclavos
Si hay varios dispositivos esclavos, el maestro se comunica con cada uno de ellos utilizando sus direcciones únicas. Solo el esclavo con la dirección correspondiente responde y se comunica, mientras que los demás ignoran los mensajes.
Alargamiento del reloj
Un esclavo puede mantener activada la línea SCL (un proceso conocido como «clock stretching») si necesita más tiempo para procesar una instrucción o recuperar datos. El maestro debe esperar a que se libere la línea SCL para continuar.
Arbitraje de bus (para sistemas multimaster)
El arbitraje es el proceso mediante el cual se determina qué dispositivo maestro obtiene el control del bus cuando varios maestros intentan iniciar la comunicación simultáneamente o en un intervalo de tiempo muy breve. El protocolo I2C admite múltiples maestros, lo que significa que más de un maestro puede intentar controlar el bus en un momento dado sin que se corrompa el mensaje.
Procedimiento de arbitraje I2C:
- Cuando un maestro inicia una transmisión, da por hecho que tiene el control del bus.
- A medida que envía los bits de dirección y de datos, comprueba la línea SDA tras escribir cada bit. Si escribe un
0y devuelve un1, sabe que otro maestro tiene el control y se retira, con lo que pierde el arbitraje. - El maestro que ha perdido el arbitraje deja de transmitir inmediatamente y espera a que la línea SCL (reloj serie) pase a estado ALTO, lo que indica el final de la transferencia actual, antes de volver a intentarlo.
Gracias a su eficiente transferencia de datos mediante solo dos hilos, el protocolo I2C se ha convertido en una interfaz de comunicación en serie muy utilizada en sistemas que buscan una comunicación fiable y rentable.
Más información:Código de ejemplo para implementar I2C en una pantalla LCD COG de 16x2
Ventajas del I2C:
- Sencillez: Solo se necesitan dos cables, independientemente del número de dispositivos conectados.
- Flexibilidad: Admite múltiples maestros y esclavos.
- Eficiencia energética: los periféricos I2C pueden desconectarse cuando no se utilizan sin que ello afecte al bus.
- Direccionamiento integrado: cada dispositivo del bus tiene una dirección única.
- Amplia compatibilidad: muchos microcontroladores y dispositivos periféricos incorporan interfaces de hardware I2C, lo que facilita su integración.
- Modos de velocidad flexibles: I2C admite varios modos de velocidad.
Desventajas de I2C:
- Limitaciones de velocidad: Por lo general, es más lento que otros protocolos como el SPI.
- Limitaciones de distancia: El protocolo I2C está diseñado para distancias cortas. En distancias más largas, la integridad de la señal y el ruido pueden suponer un problema.
- Complejidad en redes grandes: a medida que se añaden más dispositivos, la asignación de direcciones puede volverse complicada.
- Sin comprobación de errores: carece de un mecanismo integrado de comprobación de errores.
- De un solo extremo: no hay señalización diferencial, lo que podría mejorar la inmunidad al ruido.
I2C frente a otros protocolos de comunicación en serie
A la hora de elegir un protocolo de comunicación en serie para tu proyecto, es importante tener en cuenta las necesidades específicas de tu aplicación. Aunque I2C es una opción muy habitual, existen otros protocolos disponibles, como SPI, RS-232, CAN y UART. Cada protocolo tiene sus propias ventajas e inconvenientes, por lo que es importante sopesarlos antes de tomar una decisión.
I2C frente a SPI (Interfaz Periférica en Serie):
- Cables: El protocolo SPI requiere más cables: SCLK (reloj serie), MOSI (salida del maestro, entrada del esclavo), MISO (entrada del maestro, salida del esclavo) y un SS (selección de esclavo) específico para cada dispositivo. Por el contrario, el protocolo I2C solo requiere SDA y SCL.
- Velocidad: El SPI puede ser más rápido que el I2C, ya que no hay fase de direccionamiento en la transmisión de datos.
- Flexibilidad: Mientras que I2C admite de forma nativa la configuración multimaster, SPI no lo hace.
I2C frente a UART (Receptor-Transmisor Asíncrono Universal):
- Complejidad del protocolo: El UART es más sencillo, ya que solo implica la comunicación entre dos dispositivos mediante dos líneas (TX y RX). El I2C permite conectar varios dispositivos utilizando únicamente dos líneas.
- Sincronización: el UART es asíncrono (no tiene línea de reloj), mientras que el I2C es síncrono (requiere una línea de reloj).
I2C frente a CAN (Controller Area Network):
- Caso de uso: El protocolo CAN está diseñado para vehículos y sistemas industriales en los que la fiabilidad en condiciones de interferencias es fundamental. El protocolo I2C se utiliza más bien para la comunicación a corta distancia entre circuitos integrados dentro de un mismo sistema.
- Fiabilidad: CAN cuenta con mecanismos integrados de detección y corrección de errores, mientras que I2C no.
I2C frente a RS232:
- RS232 utiliza tres cables y solo admite dos dispositivos (un transmisor y un receptor), mientras que I2C admite varios dispositivos con solo dos cables.
- El RS-232 es adecuado para la comunicación a larga distancia.
| Protocolo | Número de cables | Velocidad | Complejidad | Consumo energético | Aplicaciones habituales |
|---|---|---|---|---|---|
| I2C | 2 | Lento | Medio | Bajo | Sistemas embebidos, sensores, pantallas, actuadores, periféricos. |
| SPI | 4 | Rápido | Medio | Medio | Comunicación de alta velocidad, chips de memoria. |
| UART | 2 | Lento | Bajo | Bajo | Comunicación asíncrona, comunicación en serie a larga distancia. |
| CAN | 2 | Rápido | Medio | Medio | Aplicaciones en el sector de la automoción y el sector industrial. |
| RS-232 | 3 | Lento | Medio | Medio | Ordenadores, impresoras, módems. |
Conclusión
I2C es un protocolo de comunicación indispensable que cuenta con décadas de eficacia demostrada en el mundo de la electrónica. Su sencillez, unida a su capacidad para conectar múltiples dispositivos utilizando tan solo dos líneas, lo convierte en una opción muy popular para numerosas aplicaciones. Sin embargo, como cualquier protocolo, tiene sus limitaciones y no es ideal para todos los casos. A la hora de diseñar un sistema, conviene evaluar las necesidades específicas de la aplicación y elegir el protocolo de comunicación que mejor se adapte a ellas.
