Cómo funcionan las direcciones I²C
Cada dispositivo de un bus I²C responde a una dirección de 7 bits, de 0x08 a 0x77. Muchos chips permiten elegir entre dos, cuatro u ocho direcciones conectando pines a masa o a la alimentación; otros tienen una sola dirección fija. Dos dispositivos en la misma dirección responden a la vez, y las lecturas de ambos no sirven.
Algunas hojas de datos dan valores de 8 bits, es decir, la dirección desplazada a la izquierda con el bit de lectura/escritura añadido: el VL53L0X aparece como 0x52/0x53, el BMP180 como 0xEE/0xEF. Desplazando un bit a la derecha obtienes la dirección de 7 bits que usan las bibliotecas y los escáneres: 0x29 y 0x77.
Direcciones reservadas
| Dirección | |
|---|---|
| 0x00 | Llamada general (escritura) o byte de START (lectura) |
| 0x01 | Dirección CBUS |
| 0x02 | Reservada para otro formato de bus |
| 0x03 | Reservada para usos futuros |
| 0x04–0x07 | Código de controlador en modo Hs |
| 0x78–0x7B | Direccionamiento de 10 bits |
| 0x7C–0x7F | Device ID |
Según la especificación del bus I²C de NXP (UM10204). Usa para tus dispositivos solo las direcciones de 0x08 a 0x77.
Cuando dos dispositivos chocan
Busca primero un pin de dirección: mover un dispositivo es la solución más limpia. Si los dos tienen dirección fija, como un reloj DS3231 y un DS1307, o necesitas dos sensores iguales sin pin de dirección, usa un multiplexor TCA9548A, que da ocho ramas separadas detrás de una sola dirección, o pon el segundo dispositivo en otro bus I²C. El ESP32, el ESP32-S3 y el RP2040 tienen dos controladores I²C; el ESP32-C3 tiene uno.
Ver qué hay en el bus
En ESPHome, el componente i2c escanea el bus al arrancar y escribe en el log las direcciones que encuentra. En Arduino, el sketch I2C scanner hace lo mismo en el monitor serie. Si un dispositivo no aparece, revisa la alimentación, SDA y SCL, las pull-ups y su pin de dirección.
Resistencias de pull-up
Las líneas I²C son de drenador abierto: los chips solo las bajan y las resistencias las vuelven a subir. Con una pull-up demasiado fuerte los chips no pueden bajar lo suficiente la línea; con una demasiado débil la línea sube demasiado despacio para la velocidad elegida. La especificación da los dos límites.
Rmin = (VDD − 0,4 V) ÷ 3 mA (VDD > 2 V; 20 mA a 1 MHz) Rmax = tr ÷ (0,8473 × Cbus) tr = 1000 ns a 100 kHz, 300 ns a 400 kHz, 120 ns a 1 MHz
Todos los dispositivos de la lista
| Dirección | |||
|---|---|---|---|
| QMC5883L | magnetómetro de 3 ejes | 0x0D | dirección fija |
| VEML6075 | sensor de luz UVA/UVB | 0x10 | dirección fija |
| LIS2DH12 | acelerómetro de 3 ejes | 0x18, 0x19 | SA0: GND → 0x18 · VDD → 0x19 |
| MCP9808 | sensor de temperatura digital | 0x18–0x1F | A2 A1 A0 → 0x18–0x1F |
| MMA8451Q | acelerómetro de 3 ejes | 0x1C, 0x1D | SA0: GND → 0x1C · VDD → 0x1D |
| ADXL345 | acelerómetro de 3 ejes | 0x1D, 0x53 | ALT ADDRESS: GND → 0x53 · VDD → 0x1D |
| MCP23008 | expansor de E/S de 8 bits | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| MCP23017 | expansor de E/S de 16 bits | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| PCF8574 | expansor de E/S de 8 bits (módulos I²C para LCD) | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| PCF8575 | expansor de E/S de 16 bits | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| TCA9555 | expansor de E/S de 16 bits con interrupción | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| PN532 | controlador NFC/RFID (modo I²C) | 0x24 | dirección fija |
| BNO055 | sensor de orientación absoluta de 9 ejes con fusión de sensores integrada | 0x28, 0x29 | COM3: GND → 0x28 · VDD → 0x29 |
| TCS34725 | sensor de color RGB | 0x29 | dirección fija |
| VL53L0X | sensor de distancia de tiempo de vuelo (ToF) | 0x29 | |
| MLX90640 | cámara térmica 32×24 | 0x33 | |
| AXP192 | circuito de gestión de la alimentación (PMIC) | 0x34 | dirección fija |
| AXP2101 | circuito de gestión de la alimentación (PMIC) | 0x34 | dirección fija |
| PCF8574A | expansor de E/S de 8 bits, direcciones alternativas | 0x38–0x3F | A2 A1 A0 → 0x38–0x3F |
| VEML6070 | sensor de luz UV | 0x38 | dirección fija |
| APDS-9960 | sensor de gestos, proximidad, luz ambiental y color | 0x39 | dirección fija |
| SH1106 | controlador de pantallas OLED 132×64 | 0x3C, 0x3D | SA0: GND → 0x3C · VDD → 0x3D |
| SSD1306 | controlador de pantallas OLED 128×64 / 128×32 | 0x3C, 0x3D | SA0 (D/C#): GND → 0x3C · VDD → 0x3D |
| SX1509 | expansor de E/S de 16 canales con driver de LED y controlador de teclado | 0x3E, 0x3F, 0x70, 0x71 | ADDR1 ADDR0: 00 → 0x3E · 01 → 0x3F · 10 → 0x70 · 11 → 0x71 |
| HDC1080 | sensor de temperatura y humedad | 0x40 | dirección fija |
| INA219 | monitor de corriente, tensión y potencia | 0x40–0x4F | A1, A0: GND · VS · SDA · SCL → 0x40–0x4F |
| INA226 | monitor de corriente, tensión y potencia | 0x40–0x4F | A1, A0: GND · VS · SDA · SCL → 0x40–0x4F |
| INA260 | monitor de corriente, tensión y potencia con shunt integrado | 0x40–0x4F | A1, A0: GND · VS · SDA · SCL → 0x40–0x4F |
| INA3221 | monitor de corriente y tensión de 3 canales | 0x40, 0x41, 0x42, 0x43 | A0: GND → 0x40 · VS → 0x41 · SDA → 0x42 · SCL → 0x43 |
| PCA9685 | controlador PWM / servos de 16 canales, 12 bits | 0x40–0x77 | A5…A0 → 0x40–0x77 (0x70 = All Call) |
| Si7021 | sensor de temperatura y humedad | 0x40 | dirección fija |
| OPT3001 | sensor de luz ambiental | 0x44, 0x45, 0x46, 0x47 | ADDR: GND → 0x44 · VDD → 0x45 · SDA → 0x46 · SCL → 0x47 |
| SHT30 / SHT31 / SHT35 | sensor de temperatura y humedad | 0x44, 0x45 | ADDR: GND → 0x44 · VDD → 0x45 |
| SHT40 / SHT41 / SHT43 / SHT45 (SHT4x) | sensor de temperatura y humedad | 0x44, 0x45, 0x46 | |
| ADS1015 | ADC de 12 bits y 4 canales | 0x48, 0x49, 0x4A, 0x4B | ADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B |
| ADS1115 | ADC de 16 bits y 4 canales | 0x48, 0x49, 0x4A, 0x4B | ADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B |
| ADS7830 | ADC de 8 bits y 8 canales | 0x48, 0x49, 0x4A, 0x4B | A1 A0 → 0x48–0x4B |
| LM75B | sensor de temperatura digital / termostato | 0x48–0x4F | A2 A1 A0 → 0x48–0x4F |
| PCF8591 | ADC de 8 bits y 4 canales + 1 DAC | 0x48–0x4F | A2 A1 A0 → 0x48–0x4F |
| TMP102 | sensor de temperatura digital | 0x48, 0x49, 0x4A, 0x4B | ADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B |
| TMP117 | sensor de temperatura digital de alta precisión | 0x48, 0x49, 0x4A, 0x4B | ADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B |
| 24LC256 / 24AA256 / 24FC256 | EEPROM I²C de 256 Kbit | 0x50–0x57 | A2 A1 A0 → 0x50–0x57 |
| AT24C32 | EEPROM I²C de 32 Kbit | 0x50–0x57 | A2 A1 A0 → 0x50–0x57 |
| PCF85063A | reloj en tiempo real (RTC) | 0x51 | dirección fija |
| ENS160 | sensor de calidad del aire de óxido metálico (TVOC/eCO₂/AQI) | 0x52, 0x53 | ADDR: GND → 0x52 · VDD → 0x53 |
| BQ27441-G1 | indicador de carga para una celda Li-ion | 0x55 | dirección fija |
| MAX30100 | pulsioxímetro y sensor de pulso | 0x57 | dirección fija |
| SGP30 | sensor de gas VOC y eCO₂ | 0x58 | dirección fija |
| SGP40 | sensor de gas, índice VOC | 0x59 | dirección fija |
| SGP41 | sensor de gas, índices VOC y NOx | 0x59 | dirección fija |
| CCS811 | sensor de gas eCO₂ / TVOC | 0x5A, 0x5B | ADDR: GND → 0x5A · VDD → 0x5B |
| MLX90614 | termómetro de infrarrojos sin contacto | 0x5A | |
| MPR121 | controlador táctil capacitivo de 12 canales | 0x5A, 0x5B, 0x5C, 0x5D | ADDR: GND → 0x5A · VDD → 0x5B · SDA → 0x5C · SCL → 0x5D |
| LPS22HB | sensor de presión barométrica | 0x5C, 0x5D | SA0: GND → 0x5C · VDD → 0x5D |
| GT911 | controlador de pantalla táctil capacitiva de 5 puntos | 0x5D, 0x14 | |
| MCP4725 | DAC de 12 bits con EEPROM | 0x60–0x67 | A0 → 0x60/0x61 (MCP4725A0) |
| MCP4728 | DAC de 12 bits y 4 canales con EEPROM | 0x60–0x67 | |
| SCD30 | módulo de CO₂ NDIR, temperatura y humedad | 0x61 | dirección fija |
| SCD40 / SCD41 | sensor de CO₂ fotoacústico, temperatura y humedad | 0x62 | dirección fija |
| BMI270 | IMU de 6 ejes | 0x68, 0x69 | SDO: GND → 0x68 · VDDIO → 0x69 |
| DS1307 | reloj en tiempo real (RTC) | 0x68 | dirección fija |
| DS3231 | reloj en tiempo real compensado en temperatura | 0x68 | dirección fija |
| MPU-6050 | acelerómetro + giroscopio de 6 ejes | 0x68, 0x69 | AD0: GND → 0x68 · VDD → 0x69 |
| MPU-6886 | IMU de 6 ejes | 0x68, 0x69 | SA0: GND → 0x68 · VDD → 0x69 |
| MPU-9250 | IMU de 9 ejes (acelerómetro, giroscopio, magnetómetro AK8963) | 0x68, 0x69 | AD0: GND → 0x68 · VDD → 0x69 |
| SEN50 / SEN54 / SEN55 | módulo de partículas en suspensión, VOC/NOx, temperatura y humedad | 0x69 | dirección fija |
| SHTC3 | sensor de temperatura y humedad | 0x70 | dirección fija |
| TCA9548A | multiplexor I²C de 8 canales | 0x70–0x77 | A2 A1 A0 → 0x70–0x77 |
| IP5306 | SoC para power bank (cargador + elevador), versión I²C | 0x75 | dirección fija |
| BME280 | sensor de temperatura, humedad y presión | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BME680 | sensor de gas (VOC), temperatura, humedad y presión | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BME688 | sensor de gas con IA, temperatura, humedad y presión | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BMP280 | sensor de presión y temperatura | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BMP388 | sensor de presión y temperatura | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| MS5611-01BA | sensor de presión barométrica (altímetro) | 0x76, 0x77 | CSB: VDD → 0x76 · GND → 0x77 |
| BMP180 | sensor de presión y temperatura | 0x77 | dirección fija |
Preguntas frecuentes
¿Por qué la hoja de datos dice 0x52 y el escáner encuentra 0x29?
La hoja de datos da la dirección de escritura de 8 bits, que es la de 7 bits desplazada un bit a la izquierda. 0x52 ÷ 2 = 0x29. Las bibliotecas y los escáneres usan la forma de 7 bits.
¿Pueden dos sensores iguales compartir el bus?
Sí, si el sensor tiene un pin de dirección: configúralo distinto en cada uno. Si no lo tiene, usa un multiplexor TCA9548A o un segundo bus I²C.
Mi LCD I²C está en 0x3F y no en 0x27: ¿por qué?
El módulo lleva un PCF8574AT en lugar de un PCF8574T. La versión A usa 0x38–0x3F en lugar de 0x20–0x27: con todos los pines de dirección en alto queda en 0x3F en vez de 0x27.
¿Necesito pull-ups si mis módulos ya las llevan?
Normalmente no: basta con un juego por bus. Con muchos módulos sus pull-ups se suman en paralelo y pueden quedar demasiado fuertes; la calculadora de arriba lo comprueba.