Как отправить данные нескольким ведомым устройствам одновременно
У меня есть одно ведущее и три ведомых устройства, и мне нужно отправить данные на все ведомые устройства одновременно. Возможно ли это, если да, то как проверить, какое ведомое устройство получило данные первым
@PRASH, 👍1
2 ответа
В протоколе IP есть что-то, что называется "широковещательный адрес", когда пакет содержит этот адрес, и все устройства его читают. Вы можете сделать то же самое с i2c. Каждое ведомое устройство имеет свой собственный адрес, но вы можете запрограммировать их так, чтобы они также искали «широковещательный адрес» по вашему выбору. Затем один мастер может отправить одно сообщение i2c, которое будет прочитано всеми подчиненными устройствами одновременно.
Для этой цели в протоколе I2C используется общий адрес вызова/широковещания. Если вы отправляете данные на адрес 0
(ноль), это интерпретируется как общий вызов всеми ведомыми устройствами. Все ведомые устройства, которые могут получать данные, ответят, установив линию SDA в низкий уровень в цикле подтверждения (время устанавливается часами ведущего устройства, поэтому все ведомые устройства будут делать это одновременно, поэтому нет проблем с искаженными данными). Обратите внимание, что вы не можете читать с общего адреса вызова, так как тогда все ведомые могут передавать одновременно. Как указано в техническом описании Atmega328P
(микроконтроллер на Arduino Uno):
Обратите внимание, что передача общего адреса вызова с последующим битом чтения бессмысленно, так как это может привести к конфликтам, если несколько ведомых устройств начнут передавать разные данные.
Я думаю, что библиотека Wire
не выполняет никаких операций чтения для общего адреса вызова, чтобы предотвратить это, поэтому это не заблокировало бы шину I2C.
как проверить, какое подчиненное устройство получило первое
Нет, потому что все ведомые устройства получают данные одновременно. Шина I2C очень похожа на IP-протокол в этом разделе. Мастер/отправитель отправляет пакеты данных с адресом предполагаемой цели. Но подчиненные/получатели сами решают, по какому адресу они хотят слушать. Таким образом, при каждой передаче I2C вы отправляете данные по шине, которые могут быть прочитаны всеми ведомыми устройствами. Только то, что при нормальной работе ведомое устройство решит слушать шину только тогда, когда увидит свой собственный адрес (или общий адрес вызова).
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?
- Что означает в I2C «NACK получен»?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом