Aziz Bench

Adresses I²C et vérification des conflits

Ajoutez les puces et modules de votre bus : le plan montre les adresses qu’ils utilisent, signale ceux qui entrent en conflit et vous dit comment en déplacer un. Plus bas, les résistances de pull-up pour votre vitesse et votre câblage.

Conflits d’adresse
1
sur 0x68
Périphériques
4
Adresses utilisées
3
Adresses libres
109
Plan des adresses utilisée conflit réservée
0123456789ABCDEF
00000102030405060708090A0B0C0D0E0F
10101112131415161718191A1B1C1D1E1F
20202122232425262728292A2B2C2D2E2F
30303132333435363738393A3B3C3D3E3F
40404142434445464748494A4B4C4D4E4F
50505152535455565758595A5B5C5D5E5F
60606162636465666768696A6B6C6D6E6F
70707172737475767778797A7B7C7D7E7F
Périphériques sur votre bus
    Résistances de pull-up
    Tension du bus
    Vitesse
    pF

    Additionnez la capacité de chaque broche de puce sur le bus (10 pF au maximum chacune, selon la spécification I²C) et celle des fils.

    Ω

    Beaucoup de modules ont déjà les leurs, souvent de 4,7 kΩ ou 10 kΩ. Listez-les, par exemple 10k, 10k, 4k7 : ils se combinent en parallèle.

    Conflits et comment les résoudre

    Résistances de pull-up

    Comment régler chaque adresse

    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
    0x00Appel général (écriture) ou octet START (lecture)
    0x01Adresse CBUS
    0x02Réservée à un autre format de bus
    0x03Réservée pour un usage futur
    0x04–0x07Code de contrôleur en mode Hs
    0x78–0x7BAdressage sur 10 bits
    0x7C–0x7FDevice 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
    QMC5883Lmagnétomètre 3 axes0x0Dadresse fixe
    VEML6075capteur de lumière UVA/UVB0x10adresse fixe
    LIS2DH12accéléromètre 3 axes0x18, 0x19SA0: GND → 0x18 · VDD → 0x19
    MCP9808capteur de température numérique0x18–0x1FA2 A1 A0 → 0x18–0x1F
    MMA8451Qaccéléromètre 3 axes0x1C, 0x1DSA0: GND → 0x1C · VDD → 0x1D
    ADXL345accéléromètre 3 axes0x1D, 0x53ALT ADDRESS: GND → 0x53 · VDD → 0x1D
    MCP23008expandeur d’E/S 8 bits0x20–0x27A2 A1 A0 → 0x20–0x27
    MCP23017expandeur d’E/S 16 bits0x20–0x27A2 A1 A0 → 0x20–0x27
    PCF8574expandeur d’E/S 8 bits (modules I²C pour LCD)0x20–0x27A2 A1 A0 → 0x20–0x27
    PCF8575expandeur d’E/S 16 bits0x20–0x27A2 A1 A0 → 0x20–0x27
    TCA9555expandeur d’E/S 16 bits avec interruption0x20–0x27A2 A1 A0 → 0x20–0x27
    PN532contrôleur NFC/RFID (mode I²C)0x24adresse fixe
    BNO055capteur d’orientation absolue 9 axes avec fusion de capteurs intégrée0x28, 0x29COM3: GND → 0x28 · VDD → 0x29
    TCS34725capteur de couleur RGB0x29adresse fixe
    VL53L0Xcapteur de distance à temps de vol (ToF)0x29
    MLX90640caméra thermique 32×240x33
    AXP192circuit de gestion de l’alimentation (PMIC)0x34adresse fixe
    AXP2101circuit de gestion de l’alimentation (PMIC)0x34adresse fixe
    PCF8574Aexpandeur d’E/S 8 bits, autre plage d’adresses0x38–0x3FA2 A1 A0 → 0x38–0x3F
    VEML6070capteur de lumière UV0x38adresse fixe
    APDS-9960capteur de gestes, de proximité, de lumière ambiante et de couleur RGB0x39adresse fixe
    SH1106contrôleur d’écran OLED 132×640x3C, 0x3DSA0: GND → 0x3C · VDD → 0x3D
    SSD1306contrôleur d’écran OLED 128×64 / 128×320x3C, 0x3DSA0 (D/C#): GND → 0x3C · VDD → 0x3D
    SX1509expandeur d’E/S 16 canaux avec driver de LED et gestion de clavier0x3E, 0x3F, 0x70, 0x71ADDR1 ADDR0: 00 → 0x3E · 01 → 0x3F · 10 → 0x70 · 11 → 0x71
    HDC1080capteur de température et d’humidité0x40adresse fixe
    INA219moniteur de courant, de tension et de puissance0x40–0x4FA1, A0: GND · VS · SDA · SCL → 0x40–0x4F
    INA226moniteur de courant, de tension et de puissance0x40–0x4FA1, A0: GND · VS · SDA · SCL → 0x40–0x4F
    INA260moniteur de courant, de tension et de puissance avec shunt intégré0x40–0x4FA1, A0: GND · VS · SDA · SCL → 0x40–0x4F
    INA3221moniteur de courant et de tension 3 canaux0x40, 0x41, 0x42, 0x43A0: GND → 0x40 · VS → 0x41 · SDA → 0x42 · SCL → 0x43
    PCA9685driver PWM / servo 16 canaux, 12 bits0x40–0x77A5…A0 → 0x40–0x77 (0x70 = All Call)
    Si7021capteur de température et d’humidité0x40adresse fixe
    OPT3001capteur de lumière ambiante0x44, 0x45, 0x46, 0x47ADDR: GND → 0x44 · VDD → 0x45 · SDA → 0x46 · SCL → 0x47
    SHT30 / SHT31 / SHT35capteur de température et d’humidité0x44, 0x45ADDR: GND → 0x44 · VDD → 0x45
    SHT40 / SHT41 / SHT43 / SHT45 (SHT4x)capteur de température et d’humidité0x44, 0x45, 0x46
    ADS1015ADC 12 bits 4 canaux0x48, 0x49, 0x4A, 0x4BADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B
    ADS1115ADC 16 bits 4 canaux0x48, 0x49, 0x4A, 0x4BADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B
    ADS7830ADC 8 bits 8 canaux0x48, 0x49, 0x4A, 0x4BA1 A0 → 0x48–0x4B
    LM75Bcapteur de température numérique / thermostat0x48–0x4FA2 A1 A0 → 0x48–0x4F
    PCF8591ADC 8 bits 4 canaux + 1 DAC0x48–0x4FA2 A1 A0 → 0x48–0x4F
    TMP102capteur de température numérique0x48, 0x49, 0x4A, 0x4BADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B
    TMP117capteur de température numérique haute précision0x48, 0x49, 0x4A, 0x4BADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B
    24LC256 / 24AA256 / 24FC256EEPROM I²C 256 Kbit0x50–0x57A2 A1 A0 → 0x50–0x57
    AT24C32EEPROM I²C 32 Kbit0x50–0x57A2 A1 A0 → 0x50–0x57
    PCF85063Ahorloge temps réel (RTC)0x51adresse fixe
    ENS160capteur de qualité de l’air à oxydes métalliques (TVOC/eCO₂/AQI)0x52, 0x53ADDR: GND → 0x52 · VDD → 0x53
    BQ27441-G1jauge de batterie pour une cellule Li-ion0x55adresse fixe
    MAX30100oxymètre de pouls et capteur de fréquence cardiaque0x57adresse fixe
    SGP30capteur de gaz VOC et eCO₂0x58adresse fixe
    SGP40capteur de gaz, indice VOC0x59adresse fixe
    SGP41capteur de gaz, indices VOC et NOx0x59adresse fixe
    CCS811capteur de gaz eCO₂ / TVOC0x5A, 0x5BADDR: GND → 0x5A · VDD → 0x5B
    MLX90614thermomètre infrarouge sans contact0x5A
    MPR121contrôleur tactile capacitif 12 canaux0x5A, 0x5B, 0x5C, 0x5DADDR: GND → 0x5A · VDD → 0x5B · SDA → 0x5C · SCL → 0x5D
    LPS22HBcapteur de pression barométrique0x5C, 0x5DSA0: GND → 0x5C · VDD → 0x5D
    GT911contrôleur d’écran tactile capacitif 5 points0x5D, 0x14
    MCP4725DAC 12 bits avec EEPROM0x60–0x67A0 → 0x60/0x61 (MCP4725A0)
    MCP4728DAC 12 bits 4 canaux avec EEPROM0x60–0x67
    SCD30module CO₂ NDIR, température et humidité0x61adresse fixe
    SCD40 / SCD41capteur de CO₂ photoacoustique, température et humidité0x62adresse fixe
    BMI270IMU 6 axes0x68, 0x69SDO: GND → 0x68 · VDDIO → 0x69
    DS1307horloge temps réel (RTC)0x68adresse fixe
    DS3231horloge temps réel compensée en température0x68adresse fixe
    MPU-6050accéléromètre + gyroscope 6 axes0x68, 0x69AD0: GND → 0x68 · VDD → 0x69
    MPU-6886IMU 6 axes0x68, 0x69SA0: GND → 0x68 · VDD → 0x69
    MPU-9250IMU 9 axes (accéléromètre, gyroscope, magnétomètre AK8963)0x68, 0x69AD0: GND → 0x68 · VDD → 0x69
    SEN50 / SEN54 / SEN55module particules fines, VOC/NOx, température et humidité0x69adresse fixe
    SHTC3capteur de température et d’humidité0x70adresse fixe
    TCA9548Amultiplexeur I²C 8 canaux0x70–0x77A2 A1 A0 → 0x70–0x77
    IP5306SoC pour batterie externe (chargeur + boost), version I²C0x75adresse fixe
    BME280capteur de température, d’humidité et de pression0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BME680capteur de gaz (VOC), de température, d’humidité et de pression0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BME688capteur de gaz avec IA, de température, d’humidité et de pression0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BMP280capteur de pression et de température0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BMP388capteur de pression et de température0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    MS5611-01BAcapteur de pression barométrique (altimètre)0x76, 0x77CSB: VDD → 0x76 · GND → 0x77
    BMP180capteur de pression et de température0x77adresse 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.