Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
Рассмотрите сценарий, в котором два (или более) главных
устройства (в данном случае NodeMCU) совместно используют шину I2C
с одним (или более) ведомыми
устройство(а), например:
Возможна ли такая установка? Другими словами, могут ли оба мастера
запрашивать (не одновременно) у ведомого
?
@tony gil, 👍2
Обсуждение2 ответа
Лучший ответ:
Описанная вами ситуация называется MultiMaster. Обычно это делается аппаратно с использованием периферийного устройства I2C в MCU. Однако у ESP8266 его нет (а если и есть, то он не используется), и для реализации I2C в программном обеспечении используется битовый взрыв. Если вы можете добавить функциональность MultiMaster в библиотеку проводов ESP8266, возможно, да, вы можете это сделать.
Еще один вариант — использовать какой-то другой канал связи между двумя ведущими устройствами (это может быть простой провод с подтягивающим резистором — см. ниже), чтобы одновременно обменивался данными только один ведущий.
С электрической точки зрения с вашей настройкой проблем нет — I2C — это система с полностью открытым стоком (или должна быть реализована как таковая — поэтому на выводах SCL и SDA необходимы подтягивающие резисторы), поэтому несколько устройств могут управлять линиями на одном уровне. в то же время. Просто если они это сделают, вы получите повреждение данных, и общение не произойдет.
Пример: реализация семафорного провода
- Соедините любые два контакта GPIO проводом. Добавьте к проводу подтягивающий резистор (должно быть достаточно 10 кОм).
- Оба контакта 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
Изменена диаграмма после комментариев и принятого ответа:
Да, за исключением того, что верхняя и нижняя заземляющие шины на макетной плате не соединены между собой, кроме как через внутренности Arduino., @Majenko
адаптировано, чтобы отразить ваш комментарий выше, @tony gil
- Сброс адреса I2c — MLX90614
- Подключение двух Arduino через I2C, когда контакты I2C A4/A5 уже используются.
- Протокол I2C не работает должным образом
- Отправка 4 аналоговых значений от одного arduino к другому с помощью I2C
- I2C master/slave максимальный размер сообщения requestEvent
- Код I2C работает на Mega 2560, но не на Uno и nano
- Сколько соединений может создать метод Arduino I2C?
- Занимают ли комментарии место в скомпилированном скетче C++? Ардуино / узел микроконтроллера
Только если вы можете реализовать MultiMaster в библиотеке I2C ESP8266 (программной)., @Majenko
хочешь уточнить ответ? :), @tony gil