我目前正在使用Arch Linux Arm中的I2C,并且不太确定如何计算写入和读取之间所需的绝对最小延迟。如果我没有这种延迟,那么阅读自然不会通过。我刚刚在两个命令之间应用了usleep(1000)
,但是它只是凭经验完成并且必须优化到实际值(不知何故)。但是如何?。
以下是我正在使用的write_and_read
函数的代码示例:
int write_and_read(int handler, char *buffer, const int bytesToWrite, const int bytesToRead) {
write(handler, buffer, bytesToWrite);
usleep(1000);
int r = read(handler, buffer, bytesToRead);
if(r != bytesToRead) {
return -1;
}
return 0;
}
答案 0 :(得分:1)
通常没有必要等待。如果你的写作和阅读功能在后台以某种方式进行了操作(为什么你会这样做?)然后必须同步它们。
I2C是一种非常简单的线性通信,我使用的所有设备都能够在微秒内生成输出数据。
您使用的是100kHz,400kHz还是1MHz I2C?
编辑: 经过一番讨论,我建议你试试这个:
void dataRequest() {
Wire.write(0x76);
x = 0;
}
void dataReceive(int numBytes)
{
x = numBytes;
for (int i = 0; i < numBytes; i++) {
Wire.read();
}
}
其中x是标题中定义的全局变量,然后在setup()中赋值为0。您可以尝试将简单的if条件添加到主循环中,例如如果x> 0,然后在serial.print()中发送一些内容作为调试消息,然后将x重置为0.
通过这种方式,您不会阻止串行流量的I2C操作。