我正在编写一个用户空间程序,使用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位?
谢谢,如果需要,我可以提供一些代码段。
答案 0 :(得分:2)
我认为底层协议是通过三个系统调用实现的:read
,write
和ioctl
,如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位地址内部实现。