bus-i2c-sda-scl-direcciones

El bus I2C: conectando muchos chips con solo dos cables

  • 5 min

El bus I2C es un protocolo serie síncrono que permite conectar varios dispositivos compartiendo solo dos líneas. Su gran ventaja es que reduce muchísimo el cableado y hace muy cómodo encadenar sensores, memorias o pantallas.

Si el UART era una llamada privada entre dos personas, el I2C es más bien una sala compartida donde un maestro pregunta y los demás responden cuando les toca. Por eso es uno de los buses más usados en electrónica embebida.

Los cables: SDA y SCL

Físicamente, el bus I2C consta de dos líneas (más la masa/GND común):

  1. SDA (Serial Data): Por aquí viajan los datos (los ceros y unos). Es bidireccional (el maestro pregunta, el esclavo responde).
  2. SCL (Serial Clock): Es la señal de reloj.
  • A diferencia del UART, el I2C es Síncrono.
  • El controlador genera el reloj y los datos se leen a ese ritmo. Todos los dispositivos deben admitir la frecuencia utilizada; algunos periféricos pueden alargar un nivel bajo del reloj mediante clock stretching.

Controladores y periféricos

  • Controlador: Generalmente tu microcontrolador (Arduino/ESP32). Es quien tiene el control del reloj (SCL) y quien inicia todas las conversaciones.
  • Peiféricos: Los periféricos (Sensor, Pantalla OLED, Memoria EEPROM). Se quedan callados escuchando el bus hasta que el Maestro los llama por su nombre.

El concepto de dirección (address)

Si todos los sensores están conectados a los mismos dos cables, ¿cómo sabe el sensor de temperatura que le hablo a él y no a la pantalla?

Gracias a las direcciones hexadecimales. Cada chip I2C sale de fábrica con un “número de identificación” único de 7 bits.

  • Pantalla OLED típica: 0x3C
  • Sensor MPU6050 (Acelerómetro): 0x68
  • Reloj RTC DS3231: 0x68 (¡Ojo, conflictos!)

El protocolo funciona así:

El Controlador grita en la línea SDA: “¡Atención dirección 0x3C!”

Todos los sensores escuchan.

El acelerómetro (0x68) dice: “Ese no soy yo” y se vuelve a dormir.

La pantalla (0x3C) dice: “¡Soy yo!” y envía una señal de confirmación (ACK).

A partir de ahí, el Controlador y la Pantalla intercambian datos mientras los demás callan.

I2C Scanner: Si no sabes la dirección de un chip (o crees que está roto), existe un código básico para Arduino llamado “I2C Scanner” que prueba todas las direcciones posibles y te dice en cuáles recibe respuesta. Es la herramienta de diagnóstico número 1.

La física del bus: open-drain y pull-ups

En el artículo de GPIO vimos la configuración Open-Drain (Drenador Abierto). El I2C usa esta topología.

Esto significa que los chips solo saben conectar el cable a Tierra (GND) para crear un “0”. Pero no saben conectar el cable a 5V para crear un “1”. Simplemente “sueltan” el cable.

¿Por qué? Porque si un chip intentara poner 5V y otro intentara poner 0V al mismo tiempo, haríamos un cortocircuito. Con Open-Drain, lo peor que pasa es que gana el 0.

Las resistencias pull-up

Como nadie “empuja” hacia 5V, necesitamos ayuda externa. El bus necesita dispositivos de pull-up en SDA y SCL, ya estén en la placa principal, en un módulo o añadidos externamente.

  • Cuando nadie habla, las resistencias “tiran” del voltaje hacia arriba → La línea está en HIGH.
  • Cuando alguien quiere enviar un “0”, conecta la línea a tierra y vence a la resistencia → La línea baja a LOW.

Muchos módulos comerciales (breakout boards) ya traen estas resistencias soldadas. Pero si usas chips sueltos y se te olvidan las resistencias, el I2C no funcionará. Valores típicos: 4.7kΩ (para 5V) o 2.2kΩ (para 3.3V y alta velocidad).

La conversación (la trama)

Una transmisión típica tiene estos pasos:

  1. Start Condition: El Maestro baja SDA mientras SCL sigue alto.
  2. Address Frame: El Maestro envía los 7 bits de la dirección + 1 bit indicando si quiere Leer (1) o Escribir (0).
  3. ACK/NACK: El Esclavo responde bajando la línea SDA un instante (ACK) para decir “Te he oído”. Si nadie responde, la línea se queda alta (NACK) y el Maestro sabe que hay error.
  4. Data Frames: Se envían los bytes de datos (8 bits), confirmados cada uno por un ACK.
  5. Stop Condition: El Maestro libera la línea.

Ventajas y desventajas

CaracterísticaI2CUART
Cables2 (para muchos dispositivos)2 (por cada pareja)
VelocidadMedia (100kHz - 400kHz estándar)Baja/Media
ComplejidadMedia (Direcciones, Pull-ups)Baja
DistanciaMuy Corta (PCB, < 30cm)Corta
RobustezSensible al ruido eléctricoMás robusto

El I2C es genial, pero es “lento” para mover grandes cantidades de datos (como vídeo o audio) y sensible al ruido.

Si necesitamos velocidad bruta y robustez para hablar con una tarjeta SD o una pantalla a color rápida, necesitamos el Ferrari de los protocolos: el SPI.