我还没有看到任何解释。
说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
…
谢谢,
波比。
答案 0 :(得分:0)
据我所知,i2c内核驱动程序读取是非阻塞的,不应该知道任何从内部缓冲区。但是,如果您只读取一个设备寄存器,则应该是安全的。在块读取时,您必须自己确保数据完整性。这可以通过轮询i2c从站的数据就绪位或手动处理来自设备的中断来实现。
另外,如果可能,我建议您使用smbus命令而不是i2c读取。 i2c doc(https://www.kernel.org/doc/Documentation/i2c/dev-interface)中有一些示例,也就是smbus规范 - http://smbus.org/specs/smbus20.pdf。