Arduino I2C Timout на пустых каналах - PullRequest
0 голосов
/ 09 мая 2019

Я использую библиотеку Arduino Wire.h для устройств i2c, однако я не знаю точно, сколько или какие адреса будут использоваться в любой момент времени (модульный).Предполагая 4-битное число возможностей, адреса 0-15, как мне отправить команду на адрес x, но двигаться дальше через определенное время, если нет ответа?Это должно будет постоянно проходить через каждый адрес, так как некоторые устройства будут подключаться и отключаться между циклами.

Я подумал об использовании некоторого времени прерывания.Внешние прерывания не будут работать, потому что они должны быть быстрыми и универсальными, работать с другим кодом.Я не хочу, чтобы тайм-аут слишком рано, потому что я хочу дать достаточно времени для ответа подчиненного устройства, но я также не хочу тратить время на ожидание.

void loop() {

    // Cycle through all possible addresses

    for (int i = 0; i <= 15; i++) {

        // Request data from slave
        Wire.requestFrom(i,1);
        byte MasterReceive = Wire.read(); 

        // Print data from slave
        Serial.println("Master Received From Slave");
        Serial.println(MasterReceive);

        // Send data to slave
        Wire.beginTransmission(i);                       
        Wire.write(1);
        Wire.endTransmission();
    }
}

В идеале этот код отправляет "Wire.requestfrom", и если это не закончится через 10 мс, перейдите к следующему элементу цикла for.Вместо этого это просто зависает, потому что он никогда не получает ответ.

...