Как разрешить конфликты адресов I2C?


39

Я хочу подключить несколько подчиненных устройств I2C к микроконтроллеру на одном и том же наборе контактов, но все устройства I2C имеют один и тот же адрес. Адреса фиксируются в оборудовании.

Есть ли способ подключить несколько устройств с одинаковым адресом?

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

Ответы:


24

В I2C ничего встроенного для этого нет, обычно у ведомых устройств есть несколько внешних выводов, которые можно установить на 0 или 1, чтобы переключать пару бит адреса, чтобы избежать этой проблемы. В качестве альтернативы я имел дело с несколькими производителями, у которых есть 4 или 5 номеров деталей, единственное отличие состоит в их адресе I2C.

Большинство устройств имеют специальное оборудование, которое управляет связью I2C, то есть ведомый ACK находится в аппаратном обеспечении, поэтому вы действительно не сможете его обойти.

Что касается модуля перевода, вы можете купить PIC за $ 0,50 с 2-мя шинами I2C и написать небольшой код, чтобы они действовали как преобразователи адресов.


Спасибо. Да, у этих устройств есть выбор адреса, но только между двумя адресами, и я хочу подключить 5+ устройств, так что я все равно буду сталкиваться с конфликтами. Я не думал об использовании ПИК. Это должно работать. Нет ли в продаже ничего подобного?
Саймон П Стивенс

11
NXP делает несколько мультиплексоров / коммутаторов для I2C, вы можете создать что-то из них: ics.nxp.com/products/i2cmuxes, например, вы можете создать в своем случае 3 подветвия, каждое с двумя устройствами на нем. и используйте один из переключателей NXP для достижения своей цели.
Mark

Отлично, это именно то, что я искал. Я просто не знал имени. Спасибо.
Саймон П Стивенс

Этому ответу 7 лет, поэтому я считаю, что он мог быть лучшим в то время, когда его предлагали. Тем не менее, для других, получающих помощь сейчас, некоторые из гораздо более новых ответов (в настоящее время занимающих более низкое место в списке) предлагают потенциально лучшие подходы, основанные на более новых компонентах, которые сейчас доступны на рынке.
Кирпич

6

Я только что столкнулся с этой проблемой с несколькими устройствами I2C с фиксированным адресом. Наше решение состояло в том, чтобы использовать линии ввода / вывода на микроконтроллере, чтобы заставить линии SDA располагаться высоко на устройствах, к которым мы не хотим обращаться, в то время как линия ввода / вывода для устройства, на которое мы нацелены, задается как вход (высокий импеданс ). Это означает, что только целевое устройство соответствует его адресу I2C, а другие игнорируют любые последующие данные.

Несколько устройств I2C с одним адресом

Резисторы на линии SDA для неактивных устройств в конечном итоге действуют как подтягивания для шины, поэтому точное значение будет зависеть от того, сколько у вас устройств и какое подтягивание вам нужно для вашей шины. Таким образом, если вы выбираете резисторы 10К, то 3 неактивных устройства дают подтягивание 3К3.

Диоды Шоттки гарантируют, что устройство все еще может тянуть линию SDA достаточно низко при передаче данных обратно на хост.


Я ценю, что вы подписались и опубликовали это. Это довольно изобретательное решение, я уверен, что оно будет полезно для других.
Саймон П Стивенс

Хорошая ниша, которую можно использовать в некоторых приложениях. Мне это очень нравится.
Гарри Свенссон

5

Если ни одно из устройств I2C не использует растягивание тактовой частоты (квитирование), и если вы бьете по мастеру I2C, просто взломайте, чтобы некоторые устройства поменялись местами между тактами и выводами данных. Во время передачи байта устройство, у которого поменялись тактовые импульсы и выводы данных, будет видеть каждый бит «0» как не-событие (данные растут и падают без тактовых импульсов) и будет видеть каждый бит «1» как остановку I2C и начало (часы поднимаются, когда данные низкие, сопровождаются ростом и падением данных, после чего следуют падения часов). Преднамеренные условия остановки и запуска для одного устройства могут восприниматься другим как биты данных, но если одно устройство не имеет чрезмерного количества условий запуска и останова между битами «1», маловероятно, что какое-либо устройство «случайно»


6
Я не против, но это кажется мне немного рискованным. Мой опыт работы с I2C заключается в том, что он достаточно подвержен шуму при обычном подключении. Однако вы используете слово «взломать» и упоминаете предостережение «если ни одно из устройств i2c не использует растяжение часов», так что, если оно может работать для кого-то, тогда больше энергии для него.
Джейсон С

5

Я хотел бы рассмотреть возможность использования шинных коммутаторов для мультиплексирования шины I2C среди устройств с конфликтующими адресами. Коммутаторы шины имеют очень низкую емкость и сопротивление, и, в отличие от буферов / драйверов, они являются настоящими коммутаторами, которые соединяют или отключают два узла цепи.

Шинные выключатели обычно имеют одну странную характеристику, которая не имеет значения для I2C, потому что она использует устройства с открытым стоком: у шинного выключателя низкое сопротивление при включении напряжений около 0 (Vss), но сопротивление резко возрастает с приближением напряжений Блок питания Vdd. (Это потому, что они в основном MOSFET с затворными напряжениями на источнике питания при включении, так что переключаемые напряжения приближаются к Vdd, доступные Vgs намного ниже)


1
Ссылка не работает. fairchildsemi.com/product-technology/bus-switches работает лучше.
Флорисла,

4

У меня было два датчика цветного света TCS3414, которые я хотел сравнить (пакеты FN и CS, которые имеют разные фильтры). Адрес I2C является аппаратным. После рассмотрения того, как I2C работает с точки зрения линий SCL (тактовая частота) и SDA (данные), оказалось, что отключение линии SDA не позволит чипу получить стартовый или стоповый бит и, таким образом, оставит его в неактивном состоянии. Поэтому использовали аналоговый переключатель CMOS (4066B) для включения или выключения линии SDA для каждого устройства. Это прекрасно работало для переключения между двумя устройствами. Я знаю, что это взлом, и PCA9548 был бы намного лучше, но у меня не было ни одной под рукой.


На самом деле, это совсем не хак, и я бы сказал, что это должен быть принятый ответ. Я видел, как это используется в нескольких коммерческих продуктах, и я не могу придумать лучшего решения (если у вас нет GPIO и вам не нужно чистое решение I2C, такое как специфичные для I2C муксы). Хорошие аналоговые мультиплексоры имеют большую пропускную способность и безумно дешевы.
Джей Карлсон

4

Теперь есть ответ - у Linear Tech есть переводчики адресов серии LTC4316 / 17/18. Они относительно новы, и доступность сомнительна.


Очень интересный компонент. Большинство устройств I2C имеют 2 фиксированных адреса, и это может LTC4316 потенциально удвоить адресацию при разумной стоимости.
Мехрад

4

Несколько производителей предлагают интегральные микросхемы и коммутаторы шины I2C.

Мультиплексор может активировать один канал одновременно; Коммутатор может включить несколько параллельно.

Посмотрите, например, предложения NXP , TI и Maxim .

Для экспериментов у Adafruit есть плата TCA9548a .

Если у вас есть 8 целевых чипов с одинаковыми адресами, выберите 8-к-один MUX. Прежде чем получить доступ к любому из целевых чипов, настройте MUX для активации правильной шины I2C.

преимущества

  • Не требует программирования (против подхода на основе микроконтроллера)
  • Может поддерживать необходимые функции и скорости I2C (по сравнению с обычными мультиплексорами аналоговой / цифровой шины). Например, обычный (не I2C) MUX не будет передавать общие адреса вызовов на все свои каналы.

-1

Используйте простой демультиплексор (например, 74HC139 afaik) и подключите вывод I2C CLK к входу (поскольку вывод I2C CLK является только выходным). Используйте контакты GPIO для управления желаемым выходом. Тогда контакт данных I2C может быть разделен между всеми ведомыми.


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

Вы можете использовать аналоговый мультиплексор (который является двунаправленным), но декодер может не работать по причине, указанной Стивеном. Если вы используете мультиплексор, вам понадобится слабая пульпа на ведомой стороне, чтобы обеспечить ее неактивность. Также изменяйте выбор мультиплексора, только когда шина не используется.
Кевин Уайт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.