I2C使用Arduino在7次请求后停止传输

时间:2015-12-13 21:55:54

标签: arduino avr arduino-uno i2c attiny

我正在使用运行TinyWire库的ATTiny85与运行Wire库的Arduino Uno通过I2C连接进行通信。我可以一次传输一个字节,完全可以满足我想要的任意数量的请求,但是当我尝试一次发送两个字节时会出现问题。下面是我正在使用的代码(注意 - 我使用的是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();
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

根据此Issue,您只能从onRequest回调函数发送一个字节。它是从ISR调用的,所以它真的不应该做很多事情。他建议记住已发送的字节,然后在发生另一个request事件时发送下一个字节。请参阅此example