I2C между Ардуинами - команда запроса данных со Slave

Нет ответов
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Столкнулся с непоняткой.

Нужно обмениваться данными между двумя Ардуинами. При этом Мастер может как передавать данные (команды) для Слейва, так и запрашивать у Слейва данные.

Наиболее естественным в этом случае мне представляется начать передачу с того, что Мастер посылает Слейву код команды, после чего Слейв понимает, следует ему принимать данные или передавать, и если передавать, то какие именно.

 

Т.е. запрос данных от слейва выглядит так:

 

1. Мастер передает Слейву код команды.

2. Слейв передает Мастеру нужные данные.

 

Или в коде:

    Wire.beginTransmission(4); // transmit to device #4
    Wire.write(0x43);          // sends command - Get Velocity
    Wire.endTransmission();    // stop transmitting

    delayMicroseconds(171);
    Wire.requestFrom(4, 4);    // request 4 bytes from slave device #4

    LeftVelocity = Wire.read() + ((long)Wire.read() << 8);
    RightVelocity = Wire.read() + ((long)Wire.read() << 8);

Вопрос в том, что без delay не работает: requestEvent() на Слейве не вызывается, а Wire.read() возвращает "левые" данные.

При величине delayMicroseconds около 165 часть запросов проходит нормально (и requestEvent() на Слейве вызывается), а часть - нет.

В опубликованных примерах мне использование delay не попадалось. Правда, в коде этих примеров, как правило, активно используется Serial, поэтому, возможно, такая задержка формируется обменом с последовательным портом.

Но все равно непонятно: мне кажется, что используемый мною алгоритм обмена является стандартным. Если Слейв не готов, почему это не отслеживается Wire.requestFrom? Почему Wire.read выдает "левые" данные вместо того, чтобы ждать готовности правильных?

 

Версия среды 1.6.5, линковшик заменен на более раннюю версию.