I2C 在 Arduino 恰好 7 个请求后停止传输

I2C Stops Transmitting After Exactly 7 Requests with Arduino

我正在使用 ATTiny85 运行 TinyWire 库通过 I2C 连接与 Arduino Uno 运行 Wire 库通信。我可以一次传输一个字节来满足我想要的任意多个请求,但是当我尝试一次发送两个字节时出现问题。下面是我正在使用的代码(注意——我使用的是 TinyWire 库的一个流行的修改版本,它实现了 OnRequest 方法)。这是我的奴隶代码:

    #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();
}

感谢您的帮助。

据此Issue, you can only send one byte from the onRequest callback function. It is called from the ISR, so it really shouldn't do very much. He suggests remembering which byte has been sent, then send the next one when another request event happens. See this example