Несколько подчиненных устройств I2C на Arduino — Pull-up значения

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

Мне непонятно одно: что, если устройства I2C включаются из разных источников и в разное время? В следующей схеме я использовал подтягивающие резисторы для обоих устройств I2C. Учитывая, что устройства могут включаться и выключаться в разное время или даже одно устройство может отсутствовать, можно ли удалить вторые подтягивающие резисторы (второе устройство I2C) и подключить их непосредственно к контактам SDA/SCL на uC? В этом случае (удаление подтягивающих резисторов со второго устройства), что произойдет, если устройство 1 недоступно и подключено только второе устройство?

---изменить:

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

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

  • Устройства I2C — это датчики (BME280 здесь и емкостную влажность почвы Chirp, здесь), а не на секционных панелях. с предустановленными подтягивающими резисторами.

  • Можно ли просто подключить резисторы на главной стороне, а не на ведомой стороне? В этом случае подойдет ли это обоим датчикам?

schematic

, 👍0

Обсуждение

Подтягивающий резистор находится между sda (или scl) и vcc. Подтягивающий резистор повышает уровень сигнала. У вас в сигнале есть резисторы, их там быть не должно. Невозможно выключить устройство i2c и сохранить работу шины i2c., @Jot

@ Джот, упс. Это была моя ошибка в проводке. Я исправил это. Спасибо за упоминание., @Nima Sajedi

Возможна горячая замена устройств I2C с помощью специальной схемы (например, TCA4311A, http://www.ti.com/product/TCA4311A#)., @Mikael Patel

Что делать, если оба устройства подключены и постоянно включены, от разных источников питания? Нужны ли мне резисторы на обоих устройствах?, @Nima Sajedi

Вы можете использовать одну пару подтягивающих резисторов или несколько в любой части вашей схемы, если общее значение подтягивания соответствует спецификациям шины i2c., @Jot

Расскажите, пожалуйста, почему вы хотите управлять обоими регуляторами напряжения с помощью контакта включения. Вы читали техническое описание bme280, чтобы узнать о минимальном энергопотреблении? Вы пытаетесь сэкономить 100 нА? (то есть 100 наноампер). При выключении устройства i2c шина i2c перестает работать, поскольку большинство датчиков имеют внутренние защитные диоды на vcc., @Jot

@ Джот, ты прав. Что касается BME280, я положу его на ту же шину питания, что и MCU. Но такой вопрос был больше вызван моим любопытством узнать, как можно управлять этими двумя по отдельности., @Nima Sajedi


3 ответа


Лучший ответ:

2

Вам следует рассмотреть возможность добавления некоторой изоляции шины между каждым подчиненным и ведущим устройством. Причина в том, что диоды ESD на выводах SCL/SDA выключенного ведомого устройства могут мешать работе шины I2C, поскольку они поглощают энергию из шины для подачи через внутренние части ведомого устройства. Учитывая низкий ток, создаваемый подтягивающими резисторами, являющимися единственным источником питания, это не должно привести к повреждению ведомого устройства, но вполне может привести к тому, что шина I2C будет восприниматься как НИЗКАЯ, хотя это не должно, что приведет к сбою связи. /п>

Вам следует добавить буфер с собственным контактом «включения» между каждым подчиненным устройством и шиной. Мой выбор — PCA9306 от Texas Instruments. Это также означает, что ведомое устройство имеет свои собственные отдельные подтягивающие резисторы, питаемые от собственной шины 3,3 В, что обеспечивает раздельное питание.

Тогда у вас будут такие последовательности, как:

  1. Включить подчиненное устройство
  2. Дайте короткую задержку включения (при необходимости)
  3. Включить PCA9306
  4. Выполнять транзакции I2C
  5. Отключить PCA9306
  6. Выключить подчиненное устройство

При необходимости PCA9306 также можно использовать для подключения ведомых устройств с напряжением 3,3 В к микроконтроллеру с напряжением 5 В.

schematic

,

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перенесен в чат](https://chat.stackexchange.com/rooms/87321/discussion-on-answer-by-majko-multiple-i2c-slave-devices-on-arduino-pull-up) ., @Majenko


1

Я бы включил по одному резистору на каждую линию ведущего устройства, питаемого от ведущего устройства. Это не единственный вариант, я считаю его более чистым и простым.

Сопротивление необходимо для обеспечения максимума, видимого на линии. Величина сопротивления может варьироваться. Не существует единственного правильного значения. Сопротивление подтягиванию должно обеспечивать максимум в требуемое время. Для этого есть технические характеристики.

https://www.i2c-bus.org/specification/

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

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

Многие устройства I2C, установленные на коммутационной плате, имеют подтягивающие резисторы. Обычно это около 5 кОм. Таким образом, если есть два устройства, каждое из которых имеет свои собственные резисторы, общее общее сопротивление все равно будет находиться в пределах минимально допустимого сопротивления.

Одно замечание. В спецификации не указано минимальное сопротивление, которое можно использовать. Вместо этого он определяет минимальные требования к потреблению устройства, которому необходимо снизить напряжение до достаточно низкого уровня. Таким образом, задается ток, и этот ток можно использовать для расчета минимального сопротивления линии.

Текущая спецификация (я думаю, где-то около 3 мА, или, может быть, 2 мА??) рассчитана на сопротивление 1 к6 при использовании с источником питания 5 В. При напряжении питания 3,3 В расчетное значение составит около 1 кОм. (опять же, это приблизительный расчет, достаточно близкий к ручным гранатам)

Этого ответа достаточно, учитывая вопрос. Существуют разные режимы/скорости и разные комбинации, которые можно применять, и все может оказаться очень сложным. А потом надо потратить время и посмотреть характеристики. Но для большинства работ с Arduino это приблизительное руководство должно охватывать большинство «нормальных» ситуаций.

Это действительно очень интересная технология.

,

Для обычной шины i2c (от 100 до 400 кГц) каждое устройство должно потреблять как минимум 3 мА, но допускается и больше. Некоторые производители производят устройства, которые едва могут выдавать ток 3 мА, поэтому подтягивающий резистор должен поддерживать ток, чтобы снизить сигнал до 3 мА или меньше., @Jot

Спасибо. По вашему предложению я подключил пару подтягивающих резисторов к основному источнику питания (U3) вместо того, чтобы подключать их к U1 и U2. Это правильно? Одна из моих загадок заключалась в том, какой стороной подключать резисторы? господин или раб? а если ведомый, то что будет, если одно из устройств отсутствует., @Nima Sajedi

Да, подключите к основному источнику питания. Какие бы поставки там ни были. Я считаю, что это питание, на котором работает мастер. Для питания 5 В я буду использовать 2 к2 для подтягиваний. На 3,3 вольта использую 1К-1К5. Я сделал много продуктов таким образом, тысячи продуктов были доставлены без проблем. Один продукт имеет 14 модулей, работающих по I2C., @Rudy


1

Я хотел добавить это как комментарий, но у меня закончились символы, так что это не ответ, а просто еще один комментарий.

@Majko «Я бы никогда не предложил использовать I2C для чего-либо, кроме коротких дорожек печатной платы. i2C + провода = нет, спасибо».

И это побудило меня написать следующее.

У нас был один продукт, которому требовался внешний радиомодуль. Я подключил разъем для расширения шины I2C. Общая длина дополнительного кабеля составила около 4 футов. Достаточно вывести его за пределы коробки и смонтировать радио рядом.

Много позже меня попросили разобраться, почему связь не работает. Инженер-менеджер распорядился удлинить кабель до 20 футов. У него это сработало на стенде, когда он его тестировал. Нет проверки осциллограммы сигналов. Никаких расчетов. (он был программистом прошивки и имел достаточные знания аппаратного обеспечения для выполнения своей работы)

Я посмотрел на формы сигналов с помощью осциллографа и был шокирован тем, что это вообще работает. Линии I2C были от процессора к процессору. В радиоприемнике был микроконтроллер, действовавший как подчиненное устройство I2C.

Я установил пару буферов на оба конца, и все вернулось в норму, и после этого все работало надежно, в полевых условиях, а не только на скамейке запасных.

У нас есть более крупный блок управления, который использует I2C для связи с модулями в задней части блока. У меня есть буфер на стороне процессора. На процессоре 3,3В, на модулях 5В. Буфер выполняет преобразование уровней и обеспечивает более сильный привод, чем может выдержать процессор. Задняя часть коробок показана ниже. Место для 14 модулей. Большая коробка имеет ширину около 2 футов и высоту 3 фута. Линии I2C проходят вертикально вниз по центру каждого столбца на задней стороне платы.

Также может быть предусмотрен дополнительный подчиненный блок для дополнительных 14 модулей. Тот самый задний борт. Я использовал второй порт I2C с изолированным буфером I2C для управления линиями. Рабский ящик должен был быть установлен рядом с основным ящиком. Я снова указал короткий кабель, на этот раз длиной шесть футов.

Однажды меня спросили, можно ли продлить кабель. Подрядчик, устанавливающий панели, хотел разместить рабскую усадьбу на другой стороне зала рядом с другой электрической панелью. Я спрашиваю, сколько времени им нужно. Мне сказали, что это в десяти футах отсюда. Да, десять футов прямой видимости. Как только кабель был протянут к потолку, через зал, а затем вниз к другой коробке, 10 футов превратились в 30 футов.

Я проверил с помощью прицела. Время нарастания все еще было в пределах нормы, казалось, что оно работает, поэтому мы сделали кабель и сказали им, что он может работать, а может и не работать. Используйте на свой страх и риск. Я сказал им, что это исключение и оно не должно быть частью предложения продукта. Но я уверен, что исключений будет больше.

И хотя он может работать на таких расстояниях, ниже показано, как I2C может дать сбой на коротких расстояниях.

То же оборудование. Меньшая коробка на картинке была расширена дополнительной коробкой большего размера. Меньшая коробка была установлена на восемь дюймов выше большей. (дисплей и главный процессор на передней панели изделия) В модули меньшего размера подаются только данные о температуре. В большую коробку были загружены модули с реле управления. Четыре реле на 17 А на модуль. Та же электроника, что и в описанном выше исключении. Но у них было много спорадического поведения. Фотографии проводки и установки выглядели чистыми и хорошо выполненными. Я понятия не имел, почему это не удалось.

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

Таким образом, I2C может работать на больших расстояниях и может дать сбой на более коротких расстояниях. Необходимо учитывать всю картину. Проблема в том, что зачастую сложно увидеть всю картину.

,