【问题标题】:I2C user-space read/write issuesI2C 用户空间读/写问题
【发布时间】:2014-09-19 20:28:16
【问题描述】:

我正在编写一个用户空间程序,以使用 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 位长?

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

【问题讨论】:

  • 寄存器地址不是 I2C 协议的一部分,它们是消息的一部分。每个设备都可以为消息定义自己的协议和格式,并且您可以根据所使用的设备执行适合的操作。 readwrite 不需要需要知道寄存器地址有多长,或者是什么,它们只是在移动位。
  • 您设备的规格/数据表应包含用于对其进行编程的信息。
  • 你一定漏掉了second link you posted:ioctl( fd, I2C_SLAVE, ADDRESS )中的这行代码
  • @david-grayson,这不是设备地址,不是设备上的寄存器地址吗?
  • 如果有人想回答最后一个问题:在执行ioctl(file_descriptor, I2C_SLAVE, device_address) 时,设备地址是否应该向左移位 1 位,因为地址只有 7 位,并考虑到读取/写位?

标签: c linux i2c


【解决方案1】:

我认为底层协议是通过三个系统调用实现的: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 位地址中实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多