Я хочу подключить несколько подчиненных устройств I2C к микроконтроллеру на одном и том же наборе контактов, но все устройства I2C имеют один и тот же адрес. Адреса фиксируются в оборудовании.
Есть ли способ подключить несколько устройств с одинаковым адресом?
Возможно, какой-то модуль преобразования адресов I2C для каждого устройства с настраиваемым адресом, чтобы я мог назначать свои собственные адреса каждому.
Я только что столкнулся с этой проблемой с несколькими устройствами I2C с фиксированным адресом. Наше решение состояло в том, чтобы использовать линии ввода / вывода на микроконтроллере, чтобы заставить линии SDA располагаться высоко на устройствах, к которым мы не хотим обращаться, в то время как линия ввода / вывода для устройства, на которое мы нацелены, задается как вход (высокий импеданс ). Это означает, что только целевое устройство соответствует его адресу I2C, а другие игнорируют любые последующие данные.
Резисторы на линии SDA для неактивных устройств в конечном итоге действуют как подтягивания для шины, поэтому точное значение будет зависеть от того, сколько у вас устройств и какое подтягивание вам нужно для вашей шины. Таким образом, если вы выбираете резисторы 10К, то 3 неактивных устройства дают подтягивание 3К3.
Диоды Шоттки гарантируют, что устройство все еще может тянуть линию SDA достаточно низко при передаче данных обратно на хост.
источник
Если ни одно из устройств I2C не использует растягивание тактовой частоты (квитирование), и если вы бьете по мастеру I2C, просто взломайте, чтобы некоторые устройства поменялись местами между тактами и выводами данных. Во время передачи байта устройство, у которого поменялись тактовые импульсы и выводы данных, будет видеть каждый бит «0» как не-событие (данные растут и падают без тактовых импульсов) и будет видеть каждый бит «1» как остановку I2C и начало (часы поднимаются, когда данные низкие, сопровождаются ростом и падением данных, после чего следуют падения часов). Преднамеренные условия остановки и запуска для одного устройства могут восприниматься другим как биты данных, но если одно устройство не имеет чрезмерного количества условий запуска и останова между битами «1», маловероятно, что какое-либо устройство «случайно»
источник
Я хотел бы рассмотреть возможность использования шинных коммутаторов для мультиплексирования шины I2C среди устройств с конфликтующими адресами. Коммутаторы шины имеют очень низкую емкость и сопротивление, и, в отличие от буферов / драйверов, они являются настоящими коммутаторами, которые соединяют или отключают два узла цепи.
Шинные выключатели обычно имеют одну странную характеристику, которая не имеет значения для I2C, потому что она использует устройства с открытым стоком: у шинного выключателя низкое сопротивление при включении напряжений около 0 (Vss), но сопротивление резко возрастает с приближением напряжений Блок питания Vdd. (Это потому, что они в основном MOSFET с затворными напряжениями на источнике питания при включении, так что переключаемые напряжения приближаются к Vdd, доступные Vgs намного ниже)
источник
У меня было два датчика цветного света TCS3414, которые я хотел сравнить (пакеты FN и CS, которые имеют разные фильтры). Адрес I2C является аппаратным. После рассмотрения того, как I2C работает с точки зрения линий SCL (тактовая частота) и SDA (данные), оказалось, что отключение линии SDA не позволит чипу получить стартовый или стоповый бит и, таким образом, оставит его в неактивном состоянии. Поэтому использовали аналоговый переключатель CMOS (4066B) для включения или выключения линии SDA для каждого устройства. Это прекрасно работало для переключения между двумя устройствами. Я знаю, что это взлом, и PCA9548 был бы намного лучше, но у меня не было ни одной под рукой.
источник
Теперь есть ответ - у Linear Tech есть переводчики адресов серии LTC4316 / 17/18. Они относительно новы, и доступность сомнительна.
источник
Несколько производителей предлагают интегральные микросхемы и коммутаторы шины I2C.
Мультиплексор может активировать один канал одновременно; Коммутатор может включить несколько параллельно.
Посмотрите, например, предложения NXP , TI и Maxim .
Для экспериментов у Adafruit есть плата TCA9548a .
Если у вас есть 8 целевых чипов с одинаковыми адресами, выберите 8-к-один MUX. Прежде чем получить доступ к любому из целевых чипов, настройте MUX для активации правильной шины I2C.
преимущества
источник
Используйте простой демультиплексор (например, 74HC139 afaik) и подключите вывод I2C CLK к входу (поскольку вывод I2C CLK является только выходным). Используйте контакты GPIO для управления желаемым выходом. Тогда контакт данных I2C может быть разделен между всеми ведомыми.
источник