Comment fonctionnent les adresses I²C
Chaque périphérique d’un bus I²C répond à une adresse sur 7 bits, de 0x08 à 0x77. Beaucoup de puces permettent de choisir une adresse parmi deux, quatre ou huit en reliant des broches à la masse ou à l’alimentation ; d’autres ont une seule adresse fixe. Deux périphériques sur la même adresse répondent en même temps, et les deux lectures sont inutilisables.
Certaines datasheets donnent des valeurs sur 8 bits, c’est-à-dire l’adresse décalée vers la gauche avec le bit de lecture/écriture ajouté : le VL53L0X est indiqué en 0x52/0x53, le BMP180 en 0xEE/0xEF. Décalez d’un bit vers la droite pour obtenir l’adresse sur 7 bits qu’utilisent les bibliothèques et les scanners : 0x29 et 0x77.
Adresses réservées
| Adresse | |
|---|---|
| 0x00 | Appel général (écriture) ou octet START (lecture) |
| 0x01 | Adresse CBUS |
| 0x02 | Réservée à un autre format de bus |
| 0x03 | Réservée pour un usage futur |
| 0x04–0x07 | Code de contrôleur en mode Hs |
| 0x78–0x7B | Adressage sur 10 bits |
| 0x7C–0x7F | Device ID |
D’après la spécification du bus I²C de NXP (UM10204). N’utilisez que les adresses 0x08 à 0x77 pour vos périphériques.
Quand deux périphériques entrent en conflit
Cherchez d’abord une broche d’adresse : changer l’adresse d’un périphérique est la solution la plus propre. Si les deux adresses sont fixes, comme avec une horloge DS3231 et un DS1307, ou s’il vous faut deux capteurs identiques sans broche d’adresse, utilisez un multiplexeur TCA9548A, qui donne huit branches séparées derrière une seule adresse, ou mettez le second périphérique sur un autre bus I²C. L’ESP32, l’ESP32-S3 et le RP2040 ont deux contrôleurs I²C ; l’ESP32-C3 en a un.
Trouver ce qu’il y a sur votre bus
Dans ESPHome, le composant i2c scanne le bus au démarrage et liste dans le log les adresses trouvées. Sous Arduino, le classique sketch I2C scanner fait la même chose sur le moniteur série. Si un périphérique n’apparaît pas, vérifiez l’alimentation, SDA et SCL, les pull-up et sa broche d’adresse.
Résistances de pull-up
Les lignes I²C sont à drain ouvert : les puces ne font que les tirer vers le bas, et des résistances les ramènent vers le haut. Avec un pull-up trop fort, les puces ne peuvent pas tirer la ligne assez bas ; trop faible, la ligne monte trop lentement pour la vitesse. La spécification donne les deux limites.
Rmin = (VDD − 0,4 V) ÷ 3 mA (VDD > 2 V; 20 mA à 1 MHz) Rmax = tr ÷ (0,8473 × Cbus) tr = 1000 ns à 100 kHz, 300 ns à 400 kHz, 120 ns à 1 MHz
Tous les composants de la liste
| Adresse | |||
|---|---|---|---|
| QMC5883L | magnétomètre 3 axes | 0x0D | adresse fixe |
| VEML6075 | capteur de lumière UVA/UVB | 0x10 | adresse fixe |
| LIS2DH12 | accéléromètre 3 axes | 0x18, 0x19 | SA0: GND → 0x18 · VDD → 0x19 |
| MCP9808 | capteur de température numérique | 0x18–0x1F | A2 A1 A0 → 0x18–0x1F |
| MMA8451Q | accéléromètre 3 axes | 0x1C, 0x1D | SA0: GND → 0x1C · VDD → 0x1D |
| ADXL345 | accéléromètre 3 axes | 0x1D, 0x53 | ALT ADDRESS: GND → 0x53 · VDD → 0x1D |
| MCP23008 | expandeur d’E/S 8 bits | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| MCP23017 | expandeur d’E/S 16 bits | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| PCF8574 | expandeur d’E/S 8 bits (modules I²C pour LCD) | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| PCF8575 | expandeur d’E/S 16 bits | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| TCA9555 | expandeur d’E/S 16 bits avec interruption | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| PN532 | contrôleur NFC/RFID (mode I²C) | 0x24 | adresse fixe |
| BNO055 | capteur d’orientation absolue 9 axes avec fusion de capteurs intégrée | 0x28, 0x29 | COM3: GND → 0x28 · VDD → 0x29 |
| TCS34725 | capteur de couleur RGB | 0x29 | adresse fixe |
| VL53L0X | capteur de distance à temps de vol (ToF) | 0x29 | |
| MLX90640 | caméra thermique 32×24 | 0x33 | |
| AXP192 | circuit de gestion de l’alimentation (PMIC) | 0x34 | adresse fixe |
| AXP2101 | circuit de gestion de l’alimentation (PMIC) | 0x34 | adresse fixe |
| PCF8574A | expandeur d’E/S 8 bits, autre plage d’adresses | 0x38–0x3F | A2 A1 A0 → 0x38–0x3F |
| VEML6070 | capteur de lumière UV | 0x38 | adresse fixe |
| APDS-9960 | capteur de gestes, de proximité, de lumière ambiante et de couleur RGB | 0x39 | adresse fixe |
| SH1106 | contrôleur d’écran OLED 132×64 | 0x3C, 0x3D | SA0: GND → 0x3C · VDD → 0x3D |
| SSD1306 | contrôleur d’écran OLED 128×64 / 128×32 | 0x3C, 0x3D | SA0 (D/C#): GND → 0x3C · VDD → 0x3D |
| SX1509 | expandeur d’E/S 16 canaux avec driver de LED et gestion de clavier | 0x3E, 0x3F, 0x70, 0x71 | ADDR1 ADDR0: 00 → 0x3E · 01 → 0x3F · 10 → 0x70 · 11 → 0x71 |
| HDC1080 | capteur de température et d’humidité | 0x40 | adresse fixe |
| INA219 | moniteur de courant, de tension et de puissance | 0x40–0x4F | A1, A0: GND · VS · SDA · SCL → 0x40–0x4F |
| INA226 | moniteur de courant, de tension et de puissance | 0x40–0x4F | A1, A0: GND · VS · SDA · SCL → 0x40–0x4F |
| INA260 | moniteur de courant, de tension et de puissance avec shunt intégré | 0x40–0x4F | A1, A0: GND · VS · SDA · SCL → 0x40–0x4F |
| INA3221 | moniteur de courant et de tension 3 canaux | 0x40, 0x41, 0x42, 0x43 | A0: GND → 0x40 · VS → 0x41 · SDA → 0x42 · SCL → 0x43 |
| PCA9685 | driver PWM / servo 16 canaux, 12 bits | 0x40–0x77 | A5…A0 → 0x40–0x77 (0x70 = All Call) |
| Si7021 | capteur de température et d’humidité | 0x40 | adresse fixe |
| OPT3001 | capteur de lumière ambiante | 0x44, 0x45, 0x46, 0x47 | ADDR: GND → 0x44 · VDD → 0x45 · SDA → 0x46 · SCL → 0x47 |
| SHT30 / SHT31 / SHT35 | capteur de température et d’humidité | 0x44, 0x45 | ADDR: GND → 0x44 · VDD → 0x45 |
| SHT40 / SHT41 / SHT43 / SHT45 (SHT4x) | capteur de température et d’humidité | 0x44, 0x45, 0x46 | |
| ADS1015 | ADC 12 bits 4 canaux | 0x48, 0x49, 0x4A, 0x4B | ADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B |
| ADS1115 | ADC 16 bits 4 canaux | 0x48, 0x49, 0x4A, 0x4B | ADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B |
| ADS7830 | ADC 8 bits 8 canaux | 0x48, 0x49, 0x4A, 0x4B | A1 A0 → 0x48–0x4B |
| LM75B | capteur de température numérique / thermostat | 0x48–0x4F | A2 A1 A0 → 0x48–0x4F |
| PCF8591 | ADC 8 bits 4 canaux + 1 DAC | 0x48–0x4F | A2 A1 A0 → 0x48–0x4F |
| TMP102 | capteur de température numérique | 0x48, 0x49, 0x4A, 0x4B | ADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B |
| TMP117 | capteur de température numérique haute précision | 0x48, 0x49, 0x4A, 0x4B | ADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B |
| 24LC256 / 24AA256 / 24FC256 | EEPROM I²C 256 Kbit | 0x50–0x57 | A2 A1 A0 → 0x50–0x57 |
| AT24C32 | EEPROM I²C 32 Kbit | 0x50–0x57 | A2 A1 A0 → 0x50–0x57 |
| PCF85063A | horloge temps réel (RTC) | 0x51 | adresse fixe |
| ENS160 | capteur de qualité de l’air à oxydes métalliques (TVOC/eCO₂/AQI) | 0x52, 0x53 | ADDR: GND → 0x52 · VDD → 0x53 |
| BQ27441-G1 | jauge de batterie pour une cellule Li-ion | 0x55 | adresse fixe |
| MAX30100 | oxymètre de pouls et capteur de fréquence cardiaque | 0x57 | adresse fixe |
| SGP30 | capteur de gaz VOC et eCO₂ | 0x58 | adresse fixe |
| SGP40 | capteur de gaz, indice VOC | 0x59 | adresse fixe |
| SGP41 | capteur de gaz, indices VOC et NOx | 0x59 | adresse fixe |
| CCS811 | capteur de gaz eCO₂ / TVOC | 0x5A, 0x5B | ADDR: GND → 0x5A · VDD → 0x5B |
| MLX90614 | thermomètre infrarouge sans contact | 0x5A | |
| MPR121 | contrôleur tactile capacitif 12 canaux | 0x5A, 0x5B, 0x5C, 0x5D | ADDR: GND → 0x5A · VDD → 0x5B · SDA → 0x5C · SCL → 0x5D |
| LPS22HB | capteur de pression barométrique | 0x5C, 0x5D | SA0: GND → 0x5C · VDD → 0x5D |
| GT911 | contrôleur d’écran tactile capacitif 5 points | 0x5D, 0x14 | |
| MCP4725 | DAC 12 bits avec EEPROM | 0x60–0x67 | A0 → 0x60/0x61 (MCP4725A0) |
| MCP4728 | DAC 12 bits 4 canaux avec EEPROM | 0x60–0x67 | |
| SCD30 | module CO₂ NDIR, température et humidité | 0x61 | adresse fixe |
| SCD40 / SCD41 | capteur de CO₂ photoacoustique, température et humidité | 0x62 | adresse fixe |
| BMI270 | IMU 6 axes | 0x68, 0x69 | SDO: GND → 0x68 · VDDIO → 0x69 |
| DS1307 | horloge temps réel (RTC) | 0x68 | adresse fixe |
| DS3231 | horloge temps réel compensée en température | 0x68 | adresse fixe |
| MPU-6050 | accéléromètre + gyroscope 6 axes | 0x68, 0x69 | AD0: GND → 0x68 · VDD → 0x69 |
| MPU-6886 | IMU 6 axes | 0x68, 0x69 | SA0: GND → 0x68 · VDD → 0x69 |
| MPU-9250 | IMU 9 axes (accéléromètre, gyroscope, magnétomètre AK8963) | 0x68, 0x69 | AD0: GND → 0x68 · VDD → 0x69 |
| SEN50 / SEN54 / SEN55 | module particules fines, VOC/NOx, température et humidité | 0x69 | adresse fixe |
| SHTC3 | capteur de température et d’humidité | 0x70 | adresse fixe |
| TCA9548A | multiplexeur I²C 8 canaux | 0x70–0x77 | A2 A1 A0 → 0x70–0x77 |
| IP5306 | SoC pour batterie externe (chargeur + boost), version I²C | 0x75 | adresse fixe |
| BME280 | capteur de température, d’humidité et de pression | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BME680 | capteur de gaz (VOC), de température, d’humidité et de pression | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BME688 | capteur de gaz avec IA, de température, d’humidité et de pression | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BMP280 | capteur de pression et de température | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BMP388 | capteur de pression et de température | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| MS5611-01BA | capteur de pression barométrique (altimètre) | 0x76, 0x77 | CSB: VDD → 0x76 · GND → 0x77 |
| BMP180 | capteur de pression et de température | 0x77 | adresse fixe |
Questions fréquentes
Pourquoi la datasheet indique-t-elle 0x52 alors que le scanner trouve 0x29 ?
La datasheet donne l’adresse d’écriture sur 8 bits, c’est-à-dire l’adresse sur 7 bits décalée d’un bit vers la gauche. 0x52 ÷ 2 = 0x29. Les bibliothèques et les scanners utilisent la forme sur 7 bits.
Deux capteurs identiques peuvent-ils partager un bus ?
Oui, si le capteur a une broche d’adresse : réglez-la différemment sur chacun. Sinon, utilisez un multiplexeur TCA9548A ou un second bus I²C.
Mon LCD I²C est en 0x3F, pas en 0x27 : pourquoi ?
Le module porte un PCF8574AT au lieu d’un PCF8574T. La version A utilise 0x38–0x3F au lieu de 0x20–0x27 ; avec toutes les broches d’adresse à l’état haut, cela donne 0x3F au lieu de 0x27.
Faut-il des pull-up si mes modules en ont déjà ?
En général non : un jeu par bus suffit. Avec beaucoup de modules, leurs pull-up s’additionnent en parallèle et peuvent devenir trop forts ; le calculateur ci-dessus le vérifie.