При подключении по шине I²C часто используются уже вполне определенные адреса. Вот таблица основных зарезервированных и популярных адресных пространств на шине I²C (7-битный формат):
Таблица адресов на шине IIC
Адрес (HEX) | Устройство / Назначение | Примечание |
---|---|---|
0x00 | General Call Address | Широковещательный адрес |
0x01 – 0x03 | Reserved | |
0x04 – 0x07 | HS-mode master codes | |
0x08 – 0x0F | Reserved | |
0x10 – 0x17 | Устройства с адресацией "10-bit" | Редко используется |
0x18 – 0x1F | Reserved | |
0x20 – 0x27 | LCD (HD44780), PCF8574 (I/O expander) | Часто используется |
0x28 – 0x2F | EEPROM (24Cxx), датчики | |
0x30 – 0x37 | Reserved | |
0x38 – 0x3F | LCD (Nokia 5110), некоторые датчики | |
0x40 – 0x47 | Датчики (BME280, BMP280), PWM (PCA9685) | |
0x48 – 0x4F | АЦП (ADS1115), термометры (LM75) | |
0x50 – 0x57 | EEPROM (24C32/64), RTC (DS1307, китай) | DS1307 иногда тут |
0x58 – 0x5F | Reserved | |
0x60 – 0x67 | ЦАП (MCP4725), синтезаторы частот | |
0x68 – 0x6F | RTC (DS1307, DS3231), IMU (MPU6050) | DS1307 обычно тут (0x68) |
0x70 – 0x77 | I²C-мультиплексоры (TCA9548A) | |
0x78 – 0x7F | Reserved |
🔍 Популярные устройства и их адреса
Устройство | Адрес (HEX) | Описание |
---|---|---|
DS1307 | 0x68 | Часы реального времени (RTC) |
DS3231 | 0x68 | Более точный RTC |
MPU6050 | 0x68 (или 0x69) | Гироскоп/акселерометр |
OLED (SSD1306) | 0x3C или 0x3D | Дисплей 128x64 |
BME280 | 0x76 или 0x77 | Датчик температуры/влажности |
ADS1115 | 0x48–0x4B | 16-битный АЦП |
PCF8574 | 0x20–0x27 | Расширитель GPIO |
24C32 EEPROM | 0x50–0x57 | Внешняя память |
⚠️ Важные нюансы
-
Адреса 0x00–0x07 и 0x78–0x7F зарезервированы под системные нужды.
-
Некоторые устройства (например, MPU6050) позволяют менять адрес перемычкой (например, 0x68 → 0x69).
-
Китайские модули иногда используют нестандартные адреса (например, DS1307 на 0x57 вместо 0x68).
-
Если устройство не отвечает:
-
Проверьте подтяжку SCL/SDA (3.3-4.7 кОм к VCC).
-
Убедитесь, что не конфликтуют адреса (например, два устройства на 0x68).
-
🛠 Как просканировать шину I²C?
#include <Wire.h> void setup() { Serial.begin(115200); Wire.begin(); // SDA, SCL (по умолчанию 21, 22 для ESP32) Serial.println("Сканирование I2C..."); for (byte addr = 0x08; addr <= 0x77; addr++) { Wire.beginTransmission(addr); byte error = Wire.endTransmission(); if (error == 0) { Serial.print("Устройство найдено: 0x"); Serial.println(addr, HEX); } } } void loop() {}