3.23. Conceptos básicos de I2C

I2C (Inter-Integrated Circuit, pronunciado «I-cuadrado-C» o «I-dos-C») es un bus serie de dos hilos diseñado para enlaces de corta distancia entre chips de una misma placa. Se sitúa entre SPI y UART en prioridades: más lento que SPI pero más ahorrativo en pines, y direccionado (varios dispositivos en los mismos dos hilos) allí donde SPI necesita una línea CS dedicada por dispositivo.

I2C es el bus preferido para sensores de baja velocidad – acelerómetros, sensores de temperatura, sensores de humedad, magnetómetros, relojes de tiempo real, EEPROM – donde ahorrar pines y complejidad del bus importa más que el rendimiento bruto.

3.23.1. Dos hilos, ambos de drenador abierto

Un bus I2C tiene solo dos señales:

  • SCL (reloj serie). Accionada por el controlador (la mayor parte del tiempo).

  • SDA (datos serie). Accionada por el dispositivo que esté hablando en ese momento – el controlador durante la dirección y los datos salientes, el periférico durante las lecturas y los bits ACK.

Ambas líneas son de drenador abierto: cualquier dispositivo del bus puede llevar la línea a tierra pero nunca la lleva a alto. Dos resistencias de pull-up en el bus (normalmente de 2.2 a 10 al riel de alimentación) llevan las líneas a alto cuando nadie las está llevando a bajo. El comportamiento de OR cableado se deriva de esto – cualquier dispositivo que lleve la línea a bajo gana, y el estado alto es simplemente «nadie está hablando».

Los pull-ups internos del MCU en sus pines SCL y SDA normalmente no son lo bastante fuertes para actuar por sí solos como pull-ups del bus; suelen necesitarse resistencias externas en el bus. Muchas placas de adaptación de sensores ya las incluyen; consulta la hoja de datos antes de añadir más.

3.23.2. La transacción

Toda transacción I2C sigue la misma forma:

Trazas de SCL y SDA. SDA cae mientras SCL está en alto (START), luego SCL marca el reloj de los bytes en SDA -- un byte de dirección de 7 bits con un bit de lectura/escritura y un ACK, luego un byte de registro y un ACK, luego un byte de datos y un NACK, luego SDA sube mientras SCL está en alto (STOP).

Una transacción I2C: START, dirección de 7 bits + R/W, ACK, registro, ACK, datos, NACK, STOP.

El intercambio se desarrolla bit a bit:

  • START. El controlador lleva SDA a bajo mientras SCL sigue en alto. Este flanco inusual indica a todos los dispositivos del bus que está a punto de comenzar una transacción.

  • Dirección + R/W. El controlador envía por reloj una dirección de periférico de 7 bits seguida de un bit de lectura/escritura (0 para escritura, 1 para lectura).

  • ACK / NACK. Tras cada byte, el receptor acciona SDA durante un ciclo de reloj para hacer ACK (bajo) o NACK (alto). En el byte de dirección, el periférico hace ACK si reconoce su propia dirección; si ningún dispositivo hace ACK, el controlador ve un NACK y sabe que la dirección no está en el bus.

  • Bytes de datos. Cada uno seguido de un ACK del receptor. En una escritura, el periférico hace ACK de cada byte; en una lectura, el controlador hace ACK de cada byte que quiere recibir y NACK del último byte para indicar al periférico que se detenga.

  • STOP. El controlador libera SDA a alto mientras SCL está en alto, finalizando la transacción.

Un start repetido es un segundo START emitido sin un STOP intermedio – el controlador cambia de dirección (dirección de escritura, luego dirección de lectura) en el mismo periférico sin ceder el bus.

3.23.3. Direccionamiento

El espacio de direcciones de 7 bits abarca de 0x08 a 0x77; los valores de los extremos están reservados para fines especiales. La dirección de cada dispositivo la fija el diseñador del chip; muchos componentes permiten cambiar algunos de los bits bajos a nivel de placa (conectando un pin a alto o bajo) para que dos sensores iguales puedan estar en el mismo bus.

Si dos dispositivos comparten dirección no hay forma de hablar con uno sin que el otro interfiera, así que consulta la hoja de datos antes de emparejar componentes. i2c.scan() (descrito en I2C en código) recorre el espacio de direcciones e informa de qué direcciones responden, que es la forma estándar de averiguar qué hay en el bus.

3.23.4. Fortalezas y debilidades

Las fortalezas y debilidades del bus definen su nicho:

  • Dos pines para muchos dispositivos. Un único par SCL/SDA puede llevar una docena de sensores. SPI necesitaría un pin CS adicional por dispositivo.

  • Velocidades estándar. 100 kHz («modo estándar») y 400 kHz («modo rápido») cubren casi todos los sensores. 1 MHz es alcanzable pero empieza a exigir más a la capacidad del bus y al dimensionado de los pull-ups.

  • Lento en comparación con SPI. Cualquier cosa que mueva más de unos pocos cientos de kilobits por segundo prefiere SPI.

  • Conflictos de direcciones. Dos dispositivos con la misma dirección en un bus es un error de hardware que el protocolo no puede sortear.