I2C用户空间读/写问题

时间:2014-09-19 20:28:17

标签: c linux i2c

我正在编写一个用户空间程序,使用open(),ioctl(),read()和write()来读取和写入EEPROM,但它似乎没有以我期望的方式工作。

我想我首先要问的是,整个I2C protocol for read and write是通过使用I2C文件描述符调用read()和write()来处理的吗? According to the link here,整个事务由read()和write()处理。

如果是这样,那么read()和write()如何知道要读取哪个寄存器地址?我读过的大多数地方都说使用传递给read()和write()的数据缓冲区的第一个字节来存储要读取或写入的寄存器的地址。但是如果我正在与之通信的设备使用16位寄存器地址并注册数据呢? read()和write()如何知道地址是8位还是16位?

谢谢,如果需要,我可以提供一些代码段。

1 个答案:

答案 0 :(得分:2)

我认为底层协议是通过三个系统调用实现的:readwriteioctl,如in the kernel I²C documentation所述。但是,我建议您使用libi2c,这样您就不必担心这些细节了。我在这里写了关于如何使用该库的文章:

http://blog.davidegrayson.com/2012/06/using-ic-on-raspberry-pi.html

我成功地将它包装在C ++类中,您可以在此处看到:

https://github.com/DavidEGrayson/minimu9-ahrs/blob/master/I2CBus.cpp

此外,在I²C中,器件地址为7位。如果您的设备实现了某种16位地址,那么可能会在数据传输到设备的7位地址内部实现。