计算Linux中I2C写入和读取之间的延迟

时间:2015-01-22 20:32:11

标签: c linux archlinux i2c archlinux-arm

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

1 个答案:

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