Как подключить два одинаковых датчика I2C к одной шине?
Обновлено Редакция GAW
У каждого устройства на шине I2C свой адрес, и два датчика с одинаковым адресом отвечают одновременно — данные портятся. Решений три, от простого к сложному.
1. Вывод выбора адреса
Многие датчики позволяют сменить младшие биты адреса выводом. У BMP280 (и у BME280 — у него та же схема адресации) вывод SDO на земле даёт адрес 0x76, на питании — 0x77. Два датчика с разными SDO работают на одной шине без дополнительных деталей. Висящим SDO оставлять нельзя: Bosch предупреждает, что адрес тогда не определён.
2. Коммутатор TCA9548A
TCA9548A разветвляет одну шину на восемь каналов и подключает к основной шине только выбранные. TI в даташите прямо приводит пример — восемь одинаковых датчиков, по одному на канал. Адрес самого коммутатора — 0x70–0x77 (выводы A2–A0), на шину можно поставить до восьми коммутаторов.
Наш расчёт числа датчиков с двумя адресами (как BMP280):
| Схема | Датчиков на шине |
|---|---|
| Без коммутатора | 2 |
| Один TCA9548A | 8 × 2 = 16 |
| Шесть TCA9548A с адресами 0x70–0x75 | 6 × 16 = 96 |
Почему шесть, а не восемь: когда канал выбран, его датчики оказываются на той же шине, что и коммутаторы, и адреса 0x76 и 0x77 у коммутаторов совпали бы с датчиками (наш вывод).
3. Вторая шина
Если у микроконтроллера два аппаратных I2C, одинаковые датчики разносят по ним. Учтите, что каждая шина — отдельная линия со своими подтяжками и своим пределом ёмкости 400 пФ по UM10204. Как убедиться, что все устройства отвечают, рассказано в ответе «Как проверить шину I2C»; устройство шины — в статье «Шина I²C».
Похожие вопросы
Нужны ли подтяжки на каждом канале TCA9548A?
Да. TI прямо пишет, что каждый канал подтягивается внешними резисторами к своему напряжению — так коммутатор заодно согласует уровни 1,8, 3,3 и 5 В. На модулях с датчиками подтяжки обычно уже стоят, и тогда отдельные резисторы на канал не нужны.
Почему датчик за TCA9548A не отвечает?
Скорее всего, не выбран канал: после включения все каналы TCA9548A отключены. Сначала по адресу коммутатора записывают байт, в котором единицей отмечен нужный канал, и только потом обращаются к датчику по его обычному адресу.
Можно ли вместо коммутатора взять второй I2C микроконтроллера?
Да, если он есть: у ESP32, например, два аппаратных контроллера I2C, и на каждой шине может быть свой датчик с тем же адресом. Это дешевле коммутатора, но занимает ещё два вывода.
Источники
- Bosch Sensortec. BMP280 Digital Pressure Sensor, Data sheet (BST-BMP280-DS001-26, revision 1.26, October 2021) — разд. 5.2 I²C Interface: 7-битный адрес 111011x, младший бит задаёт вывод SDO — на земле 0x76, на VDDIO 0x77; SDO нельзя оставлять свободным, иначе адрес не определён
- Texas Instruments. TCA9548A Low-Voltage 8-Channel I2C Switch with Reset (SCPS207H, revised September 2024) — 8 двунаправленных каналов, любой канал или их комбинация выбирается записью в управляющий регистр; при включении все каналы отключены; три вывода адреса — до восьми коммутаторов на шине, адрес 1110 A2 A1 A0; пример применения — восемь одинаковых датчиков температуры по одному на канал; внешние подтяжки на каждом канале до нужного напряжения, каналы 1,8–5 В, входы допускают 5 В; частота до 400 кГц; вход RESET для выхода из зависания
- NXP. UM10204 I2C-bus specification and user manual (Rev. 7.0, 1 October 2021) — разд. 3.1.12, табл. 4 — зарезервированные адреса 0000 XXX и 1111 XXX; табл. 11 — ёмкость каждой линии не больше 400 пФ
- Bosch Sensortec. BME280 Combined humidity and pressure sensor: Data sheet (BST-BME280-DS001-24, revision 1.24, February 2024) — разд. I²C Interface: та же адресация 111011x — SDO на земле 0x76, на VDDIO 0x77
- Espressif. ESP32 Series Datasheet v5.3 — два интерфейса I2C, каждый может работать ведущим или ведомым
Нашли ошибку?
Смотрите также
- Адрес I²C7-битный адрес ведомого и байт адреса с битом R/W
- BMP280Барометр I²C и SPI: питание, адреса, точность, шум, режимы, отличие от BME280
- I²CSDA и SCL, START/STOP, ACK, адреса, скорости, расчёт подтяжек
- Подтягивающие резисторы I²CДиапазон Rp по напряжению, скорости и ёмкости шины
- Как проверить шину I2C?Уровни SDA и SCL в покое, сканер адресов и девять тактов