Допустим, вам нужно подключить к одной шине I2C несколько устройств с одинаковым адресом. Это могут быть термометры, датчики газа, АЦП и прочие однотипные устройства без возможности смены адреса. В таком случае вам пригодится микросхема TCA9548А.

TCA9548A представляет собой двунаправленный мультиплексор 1-в-8, который управляется регистром состояния.  Расширитель имеет три входа выбора собственного адреса, которые позволяют задать адрес микросхемы в диапазоне 0x70…0x77.

Это значит, что мы можем подключить на одну шину I2C восемь расширителей, к каждому из которых подключено по восемь устройств, итого 8×8=64 устройства с одинаковым адресом. Более того, мы ведь можем подключить к портам не одиночные устройства, а группы устройств. Например, группа может состоять из различных датчиков лабораторной установки. Допустим, вы подключили несколько одинаковых установок к портам TCA9548A. Несмотря на то, что в этих установках одинаковые наборы датчиков, установки не мешают друг другу, потому что подключены к разным портам, и в каждый момент времени микроконтроллер общается только с одной установкой.

Принцип работы расширителя:

  1. Микроконтроллер обращается по адресу расширителя и записывает в регистр конфигурации расширителя номер активного порта. Номер активного порта определяется единицей в соответствующем разряде регистра. Можно сделать активными несколько портов одновременно.
  2. Далее микроконтроллер обращается по адресу периферийного устройства, а физическое соединение происходит только с устройством, которое подключено к активному порту.
  3. Поочередно записывая в регистр состояния номера портов, можно опрашивать периферийные устройства с одинаковыми адресами.

Содержимое регистра состояния можно прочитать, чтобы уточнить, какой порт мультиплексора активен в данный момент.

Если адрес какого-либо периферийного устройства совпадает с адресом расширителя, не забудьте при помощи перемычек на плате изменить адрес расширителя.

Согласование логических уровней

Расширитель шины может работать как преобразователь логических уровней независимо по каждому каналу. К выводам SCL/SDA и выводам портов мультиплексора должны быть подключены подтягивающие резисторы. Например, общие выводы SCL/SDA можно подтягивать к линии питания +5 вольт, а выводы портов SC0/SD0…SC7/SD7 подтягивать к линии питания +3,3 вольт. Это удобно, если вы подключаете трехвольтовые периферийные модули к пятивольтовой плате Arduino. Причем не обязательно, чтобы рабочее напряжение всех портов расширителя было одинаковое.

Вход RESET

Вход RESET предназначен в основном для сброса расширителя в случае аварийной ситуации или “горячей” перезагрузки устройства. Подача низкого логического уровня на вход RESET приводит к обнулению регистра конфигурации (все порты отключены). В таком же состоянии по умолчанию регистр находится после подачи питания.

Демонстрационный скетч Arduino

#include <Wire.h>

void setup() {
Wire.begin();
Serial.begin(9600);

for (byte i=0; i<8; i++) {
// Записываем номер порта в регистр конфигурации
Wire.beginTransmission(0x70);
Wire.write(i);
Wire.endTransmission();

// Читаем номер активного порта из регистра
Wire.requestFrom(0x70, 1);
byte j = Wire.read();
Serial.println(j);

delay(300);
}
}

void loop() {
}