Si te dedicas a la electrónica o cualquier rama de ella, probablemente te has visto en el dilema de ¿cómo conectar varios sensores o circuitos periféricos a tu placa principal o microcontrolador?. Imagínate que necesitas conectar 8 sensores de diferente tipo y algunos otros periféricos a tu microcontrolador, y simplemente en tu microcontrolador no cuentas con todos los pines I/O disponibles para atender a todos los sensores y periféricos, y en el mejor de los casos de si contar con ellos, te parece un gran desperdicio de pines hacerlo. Es por eso que protocolos como I2C llegaron para salvarnos la vida.  Con el bus I2C puedes conectar varios periféricos a tu microcontrolador utilizando solo 2 pines. Increíble pero cierto!

El bus I2C es utilizado comúnmente para ejercer comunicación entre dispositivos que se encuentran dentro del mismo circuito de la placa. A continuación presentamos una base del protocolo.

El nombre I2C es una abreviación de Inter-IC (IC = circuito integrado).

I2C proporciona buen soporte para comunicación entre dispositivos dentro de una placa electrónica los cuales se comunican entre ellos y no demandan muchos recursos de hardware. Es un protocolo simple, de corta distancia y de bajo acho de banda. La mayoría de dispositivos I2C operan a velocidades arriba de los 400Kbps, e incluso hay algunos que operan en el rango de los megahertz. I2C es fácil de usar para vincular múltiples dispositivos, ya que tiene incorporado un esquema de direccionamiento.

Existen una infinidad de dispositivos compatibles con I2C listos para conectarlos a tu microcontrolador, para dar una idea puedo mencionar algunos como el DS1624 (Termómetro digital), DS1307 (RTC), SRF08 (Sensor ultrasónico) e iclusive podemos encontrar buffers diferenciales I2C los cuales se integran en el bus y eliminan ruido en ambientes industriales.

Philips originalmente desarrolló I2C para la comunicación entre dispositivos dentro de un televisor. Ejemplos de simples dispositivos compatibles con I2C fueron encontrados en sistemas embebidos, incluyendo EEPROMs, sensores térmicos y relojes en tiempo real. I2C también se utiliza como una interfaz de control de dispositivos de procesamiento de señales que tienen interfaces de datos separados, específicos de la aplicación. Por ejemplo, es comúnmente usado en aplicaciones multimedia, donde los dispositivos típicos incluyen sincronizadores RF, codificadores de video, decodificadores y procesadores de audio. En total, Philips, National Semiconductor, Xicor, Siemens, y otros fabricantes ofrecen cientos de dispositivos compatibles con I2C .

I2C es apropiado para conectarse a dispositivos en una sola tarjeta y puede ser extendida a través de múltiples tarjetas dentro de un sistema cerrado, pero no más allá de eso. Un ejemplo es un CPU host en un tablero principal integrado usando I2C para comunicar con dispositivos de interfaz de usuario situados en un tablero separado del panel frontal.

I2C es un bus serial two-wire , como se muestra en la Figura. No hay necesidad de señal de selección de chip (chip select), haciéndolo barato y simple para implementarlo en el hardware.

i2c-diagram

Las dos señales I2C son serial data (SDA) y serial clock (SCL). Juntas, estas señales permiten apoyar la transmisión en serie de datos de 8 bits. El dispositivo que inicia una transacción en el bus I2C es denominado Maestro. El Maestro controla normalmente la señal del reloj. Un dispositivo siendo dirigido por el maestro es llamado esclavo.

El protocolo I2C tolera múltiples maestros, pero la mayoría de los diseños sistemáticos incluyen solo uno. Debe haber uno o más esclavos en el bus. Ambos, maestros y esclavos, pueden recibir y transmitir bytes de datos.

Cada dispositivo esclavo I2C viene con una dirección predefinida por hardware, los bits inferiores deben ser configurables al nivel de la placa. El maestro transmite la dirección del dispositivo del esclavo previsto en el comienzo de toda transacción. Cada esclavo es responsable de monitorear el bus y responder solamente a su misma dirección. Este esquema direccionado limita que se repitan el número de dispositivos idénticos que puedan existir en el bus I2C , con el límite fijado por el número de bits de la dirección user-configurable (normalmente dos bits, permitiendo arriba de cuatro dispositivos idénticos).

Un bus simple

Como hemos visto, el protocolo I2C provee la dirección del dispositivo, un indicador lectura/escritura, y un simple mecanismo de reconocimiento. Hay unos elementos más para el protocolo I2C , como el (broadcast) y una dirección extendida de 10-bit. Más allá de eso, cada dispositivo define su propia interfaz y esquema de direccionamiento.

Dispositivos estándar I2C operan arriba de los 100Kbps, mientras que otros dispositivos más rápidos operan arriba de los 400Kbps. La especificación (v. 2.0) liberada en 1998, agregó un modo de alta-velocidad corriendo arriba de los 3.4Mbps. La mayoría de los dispositivos I2C actuales, soportan una operación de 400Kbps. La operación alta-velocidad debe permitir alI2C continuar con la creciente demanda por el ancho de banda en multimedia y otras aplicaciones.

Normalmente, el maestro I2C es el CPU o microcontrolador en el sistema. Algunos controladores integran por hardware el protocolo I2C . Puedes también construir una implementación de software de todo usando un par de pines I/O para fines generales (una implementación de maestro solamente).

Como el maestro I2C controla la sincronización de la transacción, el protocolo no obliga a la CPU a gastar más tiempo de lo necesario para la aplicación. (Esto es en contraste con otros buses seriales que son timeslot-based, ya que provocan overhead en el bus ocupando recursos cuando no hay comunicaciones activas).

La elegancia de I2C

I2C ofrece buen soporte para la comunicación entre dispositivos dentro de una misma placa. La ventaja competitiva de I2C sobre otros esquemas de baja velocidad y corta distancia es que el costo y complejidad no escalan con el número de dispositivos en el bus. Por otro lado, la complejidad del soporte de los componentes del software puede ser significativamente mayor  que el de varios esquemas (ej. SPI y MicroWire) en una configuración simple. Con su esquema de direccionamiento por hardware y medios sencillos para transferir la cadena de bytes, I2C es una solución elegante y minimalista que satisfacen varias necesidades de comunicación.