Linux I2C - read()——它真的做到了吗?



我还没有看到任何关于这个的解释。

假设I2C主机没有启动任何操作。物理I2C从机没有发送任何东西。但在C代码的主人,我可以读取I2C。read()返回我在read()中调用的字节数。那么,到底发生了什么?

以下是我的观点。在C级,我们不应该随时读取总线。底层硬件/底层驱动程序应该只在有I2C起始位时对总线进行采样,并在内部缓冲数据。当缓冲区中有数据时,内核应该允许用户代码执行read()。如果缓冲区中没有数据,它不应该允许用户代码read()读取I2C。

但是我可以执行下面的代码。

我还没有看到任何关于这个的文档。了解吗?

…                                        //this is a master
fd = open("/dev/i2c-1", O_RDWR );        //let’s say there is no error
ioctl(fd, I2C_SLAVE, 0x2a);              //let’s say that there is no error
read(fd, buffer, 10);                    //this is where I have a question
…

谢谢,

鲍比。

据我所知,i2c内核驱动程序读取是非阻塞的,不应该知道任何从属内部缓冲区。然而,如果你只读取一个设备寄存器,它应该是安全的。当涉及到块读取时,您必须自己确保数据完整性。这可以通过轮询i2c从站的数据就绪位或手动处理来自设备的中断来实现。

如果可能的话,我还建议您使用smbus命令而不是i2c read。在i2c文档(https://www.kernel.org/doc/Documentation/i2c/dev-interface)和smbus规范中有一些示例- http://smbus.org/specs/smbus20.pdf。

最新更新