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