0

我目前正在 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;
}
4

1 回答 1

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 操作。

于 2015-01-28T06:05:42.970 回答