Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?

Рассмотрите сценарий, в котором два (или более) главных устройства (в данном случае NodeMCU) совместно используют шину I2C с одним (или более) ведомыми устройство(а), например:

Возможна ли такая установка? Другими словами, могут ли оба мастера запрашивать (не одновременно) у ведомого?

, 👍2

Обсуждение

Только если вы можете реализовать MultiMaster в библиотеке I2C ESP8266 (программной)., @Majenko

хочешь уточнить ответ? :), @tony gil


2 ответа


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

6

Описанная вами ситуация называется MultiMaster. Обычно это делается аппаратно с использованием периферийного устройства I2C в MCU. Однако у ESP8266 его нет (а если и есть, то он не используется), и для реализации I2C в программном обеспечении используется битовый взрыв. Если вы можете добавить функциональность MultiMaster в библиотеку проводов ESP8266, возможно, да, вы можете это сделать.

Еще один вариант — использовать какой-то другой канал связи между двумя ведущими устройствами (это может быть простой провод с подтягивающим резистором — см. ниже), чтобы одновременно обменивался данными только один ведущий.

С электрической точки зрения с вашей настройкой проблем нет — I2C — это система с полностью открытым стоком (или должна быть реализована как таковая — поэтому на выводах SCL и SDA необходимы подтягивающие резисторы), поэтому несколько устройств могут управлять линиями на одном уровне. в то же время. Просто если они это сделают, вы получите повреждение данных, и общение не произойдет.


Пример: реализация семафорного провода

  1. Соедините любые два контакта GPIO проводом. Добавьте к проводу подтягивающий резистор (должно быть достаточно 10 кОм).
  2. Оба контакта GPIO установлены на INPUT.

Когда мастер хочет отправить, он сначала считывает контакт GPIO:

  • Если значение ВЫСОКОЕ, то отправка разрешена. Поэтому он устанавливает GPIO на ВЫХОД и переводит линию в НИЗКИЙ уровень.
  • Если он НИЗКИЙ, то он ждет случайное количество времени и повторяет попытку.

После завершения связи мастер снова устанавливает контакт GPIO в положение INPUT.

,

обеспечит ли строгое расписание обходной путь?, @tony gil

@tonygil Только если у вас нулевой дрейф часов ... Проще иметь сигнал семафора. Я добавил больше деталей в свой ответ., @Majenko

Я стараюсь поддерживать дрейф в пределах 3 миллисекунд по всей системе (я синхронизирую мастер с сетевым сервером времени, а затем отправляю unixtime в своем запросе), и мои вызовы происходят по часам каждые 60 секунд (достаточно времени, чтобы избежать сбоев). Проверим ваш семафорный протокол, спасибо., @tony gil

ГЕНИЙ! Протокол/оснастка семафора работает отлично. будет вознагражден (как только мне будет разрешено открыть, а затем присудить награду (я думаю, через 3 дня)., @tony gil

Выдающийся ответ. (проголосовал). Какие (если есть) платы Arduino имеют аппаратное обеспечение, необходимое для поддержки MultiMaster? И какая библиотека/библиотеки нам нужны, чтобы воспользоваться этим?, @Duncan C

@DuncanC Большинство, но программное обеспечение - это то, чего не хватает (в большинстве, если не во всех) случаях., @Majenko

Как работает тактовый сигнал, когда у вас есть несколько мастеров и семафорный подход? Я думал, мастер генерирует тактовый сигнал? Разве несколько мастеров не будут бороться за то, кто устанавливает тактовый вывод, если вы не использовали какое-то переключение, чтобы включить тактовый сигнал на активном мастере и отключить его на других?, @Duncan C

@DuncanC Тактовый сигнал есть только тогда, когда мастер общается. Какой бы мастер ни общался, он контролирует обе линии ввода-вывода в любой момент времени., @Majenko

@Majenko, когда вы говорите «Добавьте подтягивающий резистор к проводу», означает ли это резистор 10 кОм на ЗАЗЕМЛЕНИЕ? Что-то вроде чтения геркона?, @tony gil

Нет, это будет откат. Вы хотите подтянуться. Подключите его к +3,3В., @Majenko

@Majenko, если Nano - 5 В, не должно ли быть преобразование уровня на SDA и SCL?, @Juraj

@Юрай Не нужно. Поскольку ESP8266 является мастером, шина работает при напряжении 3,3 В (ESP8266 обеспечивает подтягивание до 3,3 В). Arduino прекрасно считывает 3,3 В, а поскольку I2C является протоколом с открытым стоком, Arduino просто подключает сигналы к земле для 0 и отпускает их на подтягивания (3,3 В) для 1. Если бы было наоборот, это было бы сложнее. . Вам нужно будет отключить внутренние подтяжки Arduino и вручную подтянуть линии до 3,3 В., @Majenko

@Majenko, спасибо за объяснение, @Juraj


1

Изменена диаграмма после комментариев и принятого ответа:

,

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

адаптировано, чтобы отразить ваш комментарий выше, @tony gil