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();
}
感谢您的帮助。
我正在使用 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();
}
感谢您的帮助。