在 Linux 中计算 I2C 上写入和读取之间的延迟
Calculating the delay between write and read on I2C in Linux
我目前在 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;
}
一般不用等。如果你的写作和阅读功能以某种方式在后台线程化(你为什么要这样做???)那么同步它们是强制性的。
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 是在 header 中定义的全局变量,然后在 setup() 中赋值为 0。您可以尝试在主循环中添加一个简单的 if 条件,例如如果 x > 0,则在 serial.print() 中发送一些内容作为调试消息,然后将 x 重置为 0。
有了这个,您就不会阻止串行流量的 I2C 操作。
我目前在 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;
}
一般不用等。如果你的写作和阅读功能以某种方式在后台线程化(你为什么要这样做???)那么同步它们是强制性的。
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 是在 header 中定义的全局变量,然后在 setup() 中赋值为 0。您可以尝试在主循环中添加一个简单的 if 条件,例如如果 x > 0,则在 serial.print() 中发送一些内容作为调试消息,然后将 x 重置为 0。
有了这个,您就不会阻止串行流量的 I2C 操作。