- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一个用户空间程序,使用 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 位长?
最佳答案
我认为底层协议(protocol)是通过三个系统调用实现的: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 位地址的数据传输中实现。
关于c - I2C 用户空间读/写问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25941917/
我是一名优秀的程序员,十分优秀!