我正在编写一个用户空间程序,使用open(),ioctl(),read()和write()来读写EEPROM,但是它看起来并没有像我期望的那样工作。
我想首先我要问的是,整个I2C协议的读写是通过调用read()和write()来处理I2C文件描述符的吗? 根据这里的链接 ,整个事务由read()和write()处理。
如果是这样,那么read()和write()如何知道从哪个寄存器地址读取? 我读过的大多数地方都说使用传递给read()和write()的数据缓冲区的第一个字节来存储要读取或写入的寄存器的地址。 但是,如果我正在使用的设备使用16位寄存器地址和寄存器数据呢? read()和write()如何知道地址是8位还是16位?
谢谢,我可以提供一些代码片段,如果需要的话。
我认为底层协议是通过三个系统调用实现的: read
, write
和ioctl
,如内核I²C文档中所述 。 不过,我建议使用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位地址的情况下实现。