Aziz Bench

Indirizzi I²C e verifica dei conflitti

Aggiungi i chip e i moduli del tuo bus: la mappa mostra quali indirizzi usano, segnala quelli in conflitto e ti dice come spostarne uno. Sotto, le resistenze di pull-up per la tua velocità e i tuoi collegamenti.

Conflitti di indirizzo
1
su 0x68
Dispositivi
4
Indirizzi usati
3
Indirizzi liberi
109
Mappa degli indirizzi usato conflitto riservato
0123456789ABCDEF
00000102030405060708090A0B0C0D0E0F
10101112131415161718191A1B1C1D1E1F
20202122232425262728292A2B2C2D2E2F
30303132333435363738393A3B3C3D3E3F
40404142434445464748494A4B4C4D4E4F
50505152535455565758595A5B5C5D5E5F
60606162636465666768696A6B6C6D6E6F
70707172737475767778797A7B7C7D7E7F
Dispositivi sul tuo bus
    Resistenze di pull-up
    Tensione del bus
    Velocità
    pF

    Somma la capacità di ogni pin dei chip sul bus (al massimo 10 pF ciascuno, secondo la specifica I²C) e quella dei fili.

    Ω

    Molti moduli hanno le loro, spesso da 4,7 kΩ o 10 kΩ. Elencale, per esempio 10k, 10k, 4k7: si sommano in parallelo.

    Conflitti e come risolverli

    Resistenze di pull-up

    Come impostare ogni indirizzo

    Come funzionano gli indirizzi I²C

    Ogni dispositivo su un bus I²C risponde a un indirizzo a 7 bit, da 0x08 a 0x77. Molti chip permettono di scegliere tra due, quattro o otto indirizzi collegando alcuni pin a massa o all’alimentazione; altri hanno un solo indirizzo fisso. Due dispositivi sullo stesso indirizzo rispondono insieme, e le letture di entrambi sono inutilizzabili.

    Alcuni datasheet danno valori a 8 bit, cioè l’indirizzo spostato a sinistra con in più il bit di lettura/scrittura: il VL53L0X è indicato come 0x52/0x53, il BMP180 come 0xEE/0xEF. Spostando a destra di un bit ottieni l’indirizzo a 7 bit usato da librerie e scanner: 0x29 e 0x77.

    Indirizzi riservati

    Indirizzo
    0x00Chiamata generale (scrittura) o byte di START (lettura)
    0x01Indirizzo CBUS
    0x02Riservato a un formato di bus diverso
    0x03Riservato a usi futuri
    0x04–0x07Codice del controller in modalità Hs
    0x78–0x7BIndirizzamento a 10 bit
    0x7C–0x7FDevice ID

    Dalla specifica del bus I²C di NXP (UM10204). Per i tuoi dispositivi usa solo gli indirizzi da 0x08 a 0x77.

    Quando due dispositivi sono in conflitto

    Prima cerca un pin di indirizzo: spostare un dispositivo è la soluzione più pulita. Se entrambi hanno l’indirizzo fisso, come un orologio DS3231 e un DS1307, o ti servono due sensori uguali senza pin di indirizzo, usa un multiplexer TCA9548A, che dà otto rami separati dietro un unico indirizzo, oppure metti il secondo dispositivo su un altro bus I²C. ESP32, ESP32-S3 e RP2040 hanno due controller I²C; l’ESP32-C3 ne ha uno.

    Scoprire cosa c’è sul bus

    In ESPHome il componente i2c scansiona il bus all’avvio e scrive nel log gli indirizzi che trova. In Arduino lo sketch I2C scanner fa lo stesso sul monitor seriale. Se un dispositivo non compare, controlla alimentazione, SDA e SCL, le pull-up e il suo pin di indirizzo.

    Resistenze di pull-up

    Le linee I²C sono open-drain: i chip le portano solo verso il basso e le resistenze le riportano in alto. Con una pull-up troppo forte i chip non riescono ad abbassare abbastanza la linea; con una troppo debole la linea sale troppo lentamente per la velocità scelta. La specifica dà entrambi i limiti.

    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

    Tutti i dispositivi dell’elenco

    Indirizzo
    QMC5883Lmagnetometro a 3 assi0x0Dindirizzo fisso
    VEML6075sensore di luce UVA/UVB0x10indirizzo fisso
    LIS2DH12accelerometro a 3 assi0x18, 0x19SA0: GND → 0x18 · VDD → 0x19
    MCP9808sensore di temperatura digitale0x18–0x1FA2 A1 A0 → 0x18–0x1F
    MMA8451Qaccelerometro a 3 assi0x1C, 0x1DSA0: GND → 0x1C · VDD → 0x1D
    ADXL345accelerometro a 3 assi0x1D, 0x53ALT ADDRESS: GND → 0x53 · VDD → 0x1D
    MCP23008espansore di I/O a 8 bit0x20–0x27A2 A1 A0 → 0x20–0x27
    MCP23017espansore di I/O a 16 bit0x20–0x27A2 A1 A0 → 0x20–0x27
    PCF8574espansore di I/O a 8 bit (moduli I²C per LCD)0x20–0x27A2 A1 A0 → 0x20–0x27
    PCF8575espansore di I/O a 16 bit0x20–0x27A2 A1 A0 → 0x20–0x27
    TCA9555espansore di I/O a 16 bit con interrupt0x20–0x27A2 A1 A0 → 0x20–0x27
    PN532controller NFC/RFID (modalità I²C)0x24indirizzo fisso
    BNO055sensore di orientamento assoluto a 9 assi con fusione dei sensori integrata0x28, 0x29COM3: GND → 0x28 · VDD → 0x29
    TCS34725sensore di colore RGB0x29indirizzo fisso
    VL53L0Xsensore di distanza a tempo di volo (ToF)0x29
    MLX90640termocamera 32×240x33
    AXP192integrato di gestione dell’alimentazione (PMIC)0x34indirizzo fisso
    AXP2101integrato di gestione dell’alimentazione (PMIC)0x34indirizzo fisso
    PCF8574Aespansore di I/O a 8 bit, indirizzi alternativi0x38–0x3FA2 A1 A0 → 0x38–0x3F
    VEML6070sensore di luce UV0x38indirizzo fisso
    APDS-9960sensore di gesti, prossimità, luce ambiente e colore0x39indirizzo fisso
    SH1106controller per display OLED 132×640x3C, 0x3DSA0: GND → 0x3C · VDD → 0x3D
    SSD1306controller per display OLED 128×64 / 128×320x3C, 0x3DSA0 (D/C#): GND → 0x3C · VDD → 0x3D
    SX1509espansore di I/O a 16 canali con driver LED e gestione tastierino0x3E, 0x3F, 0x70, 0x71ADDR1 ADDR0: 00 → 0x3E · 01 → 0x3F · 10 → 0x70 · 11 → 0x71
    HDC1080sensore di temperatura e umidità0x40indirizzo fisso
    INA219monitor di corrente, tensione e potenza0x40–0x4FA1, A0: GND · VS · SDA · SCL → 0x40–0x4F
    INA226monitor di corrente, tensione e potenza0x40–0x4FA1, A0: GND · VS · SDA · SCL → 0x40–0x4F
    INA260monitor di corrente, tensione e potenza con shunt integrato0x40–0x4FA1, A0: GND · VS · SDA · SCL → 0x40–0x4F
    INA3221monitor di corrente e tensione a 3 canali0x40, 0x41, 0x42, 0x43A0: GND → 0x40 · VS → 0x41 · SDA → 0x42 · SCL → 0x43
    PCA9685driver PWM / servo a 16 canali, 12 bit0x40–0x77A5…A0 → 0x40–0x77 (0x70 = All Call)
    Si7021sensore di temperatura e umidità0x40indirizzo fisso
    OPT3001sensore di luce ambiente0x44, 0x45, 0x46, 0x47ADDR: GND → 0x44 · VDD → 0x45 · SDA → 0x46 · SCL → 0x47
    SHT30 / SHT31 / SHT35sensore di temperatura e umidità0x44, 0x45ADDR: GND → 0x44 · VDD → 0x45
    SHT40 / SHT41 / SHT43 / SHT45 (SHT4x)sensore di temperatura e umidità0x44, 0x45, 0x46
    ADS1015ADC a 12 bit e 4 canali0x48, 0x49, 0x4A, 0x4BADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B
    ADS1115ADC a 16 bit e 4 canali0x48, 0x49, 0x4A, 0x4BADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B
    ADS7830ADC a 8 bit e 8 canali0x48, 0x49, 0x4A, 0x4BA1 A0 → 0x48–0x4B
    LM75Bsensore di temperatura digitale / termostato0x48–0x4FA2 A1 A0 → 0x48–0x4F
    PCF8591ADC a 8 bit e 4 canali + 1 DAC0x48–0x4FA2 A1 A0 → 0x48–0x4F
    TMP102sensore di temperatura digitale0x48, 0x49, 0x4A, 0x4BADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B
    TMP117sensore di temperatura digitale ad alta precisione0x48, 0x49, 0x4A, 0x4BADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B
    24LC256 / 24AA256 / 24FC256EEPROM I²C da 256 Kbit0x50–0x57A2 A1 A0 → 0x50–0x57
    AT24C32EEPROM I²C da 32 Kbit0x50–0x57A2 A1 A0 → 0x50–0x57
    PCF85063Aorologio in tempo reale (RTC)0x51indirizzo fisso
    ENS160sensore di qualità dell’aria a ossidi metallici (TVOC/eCO₂/AQI)0x52, 0x53ADDR: GND → 0x52 · VDD → 0x53
    BQ27441-G1indicatore di carica per una cella Li-ion0x55indirizzo fisso
    MAX30100pulsossimetro e sensore di battito0x57indirizzo fisso
    SGP30sensore di gas VOC ed eCO₂0x58indirizzo fisso
    SGP40sensore di gas, indice VOC0x59indirizzo fisso
    SGP41sensore di gas, indici VOC e NOx0x59indirizzo fisso
    CCS811sensore di gas eCO₂ / TVOC0x5A, 0x5BADDR: GND → 0x5A · VDD → 0x5B
    MLX90614termometro a infrarossi senza contatto0x5A
    MPR121controller touch capacitivo a 12 canali0x5A, 0x5B, 0x5C, 0x5DADDR: GND → 0x5A · VDD → 0x5B · SDA → 0x5C · SCL → 0x5D
    LPS22HBsensore di pressione barometrica0x5C, 0x5DSA0: GND → 0x5C · VDD → 0x5D
    GT911controller touch screen capacitivo a 5 punti0x5D, 0x14
    MCP4725DAC a 12 bit con EEPROM0x60–0x67A0 → 0x60/0x61 (MCP4725A0)
    MCP4728DAC a 12 bit e 4 canali con EEPROM0x60–0x67
    SCD30modulo CO₂ NDIR, temperatura e umidità0x61indirizzo fisso
    SCD40 / SCD41sensore di CO₂ fotoacustico, temperatura e umidità0x62indirizzo fisso
    BMI270IMU a 6 assi0x68, 0x69SDO: GND → 0x68 · VDDIO → 0x69
    DS1307orologio in tempo reale (RTC)0x68indirizzo fisso
    DS3231orologio in tempo reale compensato in temperatura0x68indirizzo fisso
    MPU-6050accelerometro + giroscopio a 6 assi0x68, 0x69AD0: GND → 0x68 · VDD → 0x69
    MPU-6886IMU a 6 assi0x68, 0x69SA0: GND → 0x68 · VDD → 0x69
    MPU-9250IMU a 9 assi (accelerometro, giroscopio, magnetometro AK8963)0x68, 0x69AD0: GND → 0x68 · VDD → 0x69
    SEN50 / SEN54 / SEN55modulo polveri sottili, VOC/NOx, temperatura e umidità0x69indirizzo fisso
    SHTC3sensore di temperatura e umidità0x70indirizzo fisso
    TCA9548Amultiplexer I²C a 8 canali0x70–0x77A2 A1 A0 → 0x70–0x77
    IP5306SoC per power bank (caricatore + boost), versione I²C0x75indirizzo fisso
    BME280sensore di temperatura, umidità e pressione0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BME680sensore di gas (VOC), temperatura, umidità e pressione0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BME688sensore di gas con IA, temperatura, umidità e pressione0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BMP280sensore di pressione e temperatura0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BMP388sensore di pressione e temperatura0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    MS5611-01BAsensore di pressione barometrica (altimetro)0x76, 0x77CSB: VDD → 0x76 · GND → 0x77
    BMP180sensore di pressione e temperatura0x77indirizzo fisso

    Domande frequenti

    Perché il datasheet dice 0x52 ma lo scanner trova 0x29?

    Il datasheet dà l’indirizzo di scrittura a 8 bit, cioè quello a 7 bit spostato a sinistra di un bit. 0x52 ÷ 2 = 0x29. Librerie e scanner usano la forma a 7 bit.

    Due sensori uguali possono stare sullo stesso bus?

    Sì, se il sensore ha un pin di indirizzo: impostalo diversamente su ciascuno. Se non ce l’ha, usa un multiplexer TCA9548A o un secondo bus I²C.

    Il mio LCD I²C è a 0x3F e non a 0x27: perché?

    Il modulo monta un PCF8574AT invece di un PCF8574T. La versione A usa 0x38–0x3F invece di 0x20–0x27: con tutti i pin di indirizzo alti diventa 0x3F invece di 0x27.

    Servono le pull-up se i moduli le hanno già?

    Di solito no: basta una coppia di pull-up per bus. Con molti moduli le loro pull-up si sommano in parallelo e possono diventare troppo forti: il calcolatore qui sopra lo verifica.