Я использую ATTiny85, работающий с библиотекой TinyWire, для связи с Arduino Uno, использующим библиотеку Wire, из соединения I2C. Я могу передать один байт за один раз отлично, так как столько запросов, сколько я хочу, однако проблема возникает, когда я пытаюсь отправить два байта за раз. Ниже приведен код, который я использую (обратите внимание - я использую популярную модифицированную версию библиотеки TinyWire, в которой реализован метод OnRequest). Вот мой код для ведомого устройства:I2C прекращает передачу через 7 запросов с Arduino
#include "TinyWireS.h" // wrapper class for I2C slave routines
#define I2C_SLAVE_ADDR 0x27 // i2c slave address
void setup()
{
TinyWireS.begin(I2C_SLAVE_ADDR); // init I2C Slave mode
TinyWireS.onRequest(requestEvent);
}
void loop()
{
}
void requestEvent()
{
int16_t bigNum = analogRead(3);
byte myArray[2];
myArray[0] = (bigNum >> 8) & 0xFF;
myArray[1] = bigNum & 0xFF;
TinyWireS.send(myArray[0]);
TinyWireS.send(myArray[1]);
}
и для мастера:
#include <Wire.h>
#define DEVICE_2 0x27
void setup()
{
Wire.begin();
Serial.begin(9600);
}
void loop()
{
delay(2000);
int16_t bigNum;
byte a,b;
// read 2 bytes, from address 0x27
Serial.println("Request Start");
Wire.requestFrom(DEVICE_2, 2);
a = Wire.read();
b = Wire.read();
bigNum = a;
bigNum = bigNum << 8 | b;
Serial.print(bigNum);
Serial.print("\n");
}
Независимо от времени задержки, я всегда могу получить только ровно 7 запросов. Я пробовал много значений без задержки до 5 секундных задержек между вызовами. Если я отключу ATTiny, то снова подайте питание, пока Uno все еще подключен к последовательному порту, я могу получить еще 7 запросов перед остановкой снова. Серийный монитор всегда показывает, что основной цикл Uno каким-то образом приостанавливается сразу после вызова requestFrom(), что делает его похожим на то, что он чего-то ждет, но я не могу понять, что. Когда я отсоединяю ATTiny, Uno печатает на последовательном порту -28412. Я также пробовал поместить следующее перед чтением из буфера:
if(Wire.available() > 0) {
a = Wire.read();
b = Wire.read();
}
Спасибо за помощь.
Спасибо, отличный ответ. –