Несколько подчиненных (отправителей) одному ведущему (получателю)

i2c

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

//мастер



#include <Wire.h>


void setup() {
  Wire.begin();        // подключаемся к шине i2c (адрес для ведущего необязателен)
  Serial.begin(9600);  // запускаем последовательный порт для вывода

}

void loop() {
  Wire.requestFrom(8, 1);    // запрос 6 байт от ведомого устройства №8

  while (Wire.available()) { // подчиненное устройство может отправить меньше, чем запрошено
    char c= Wire.read(); // получаем байт как символ
    char q= Wire.read();

  Serial.print(c);         // печатаем символ
  Serial.print(q);
  }

  delay(1500);
}

////ведомый 1

#include <Wire.h>

void setup() {
  Serial.begin(9600); // Запуск последовательного терминала
  Wire.begin(8);                // подключаемся к шине i2c по адресу №8
}

void loop(){
  Wire.onRequest(requestEvent); // регистрируем событие

  delay(1500);
}
void requestEvent() {

  Wire.write('Q'); 
  Serial.println("Sent");
}

////ведомый 2

#include <Wire.h>

void setup() {
  Serial.begin(9600); // Запуск последовательного терминала
  Wire.begin(8);                // подключаемся к шине i2c по адресу №8
}

void loop() {
  Wire.onRequest(requestEvent); // регистрируем событие

  delay(1500);
}
void requestEvent() {

  Wire.write('Y'); 
  Serial.println("Sent");
}

, 👍0

Обсуждение

Я думаю, что оба подчиненных устройства имеют один и тот же адрес, поэтому вы сталкиваетесь с этими проблемами, потому что главный общается с обоими подчиненными устройствами с одинаковым адресом и получает только одни данные, которые могут быть подчиненными 1 или 2. Вам необходимо изменить адрес подчиненного устройства и синхронизировать связь обоих раб с господином., @Vaibhav

Какое оборудование, например микроконтроллер, вы используете?, @MichaelT


1 ответ


3

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

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


Кроме того, код чтения не очень хорош. Вы тестируете условие цикла while, есть ли что-нибудь для чтения (это может быть только 1 байт), но затем вы читаете 2 байта. В вашем случае вам нужно прочитать только 1 байт, поскольку вы также запрашиваете только 1 байт. В случае, когда вы запрашиваете более 1 байта, вы можете либо проверить, достаточно ли байтов в буфере (с помощью чего-то вроде if(Wire.available()>=2) ), или вы можете просто работать с буфером побайтно (с помощью while(Wire.available()){ data = Wire.read(); , обратите внимание на одно чтение в цикле while).< /п>

,