最新的SMBus规范2014年12月20日只显示了一种块写/读类型(不包括块进程调用):
6.5.7 Block Write/Read
Write: Address(Wr), Command, Count = N, Byte 1, Byte 2, ..., Byte N [, PEC]
Read: Address(Wr), Command, Address(Rd), Count = N, Byte 1, Byte 2, ..., Byte N [, PEC]但是,查看Linux用户空间界面,有3种块事务类型可用于来自uapi/linux/i2c.h的ioctl uapi/linux/i2c.h:
#define I2C_SMBUS_BLOCK_DATA 5
#define I2C_SMBUS_I2C_BLOCK_BROKEN 6
#define I2C_SMBUS_I2C_BLOCK_DATA 8按照*下的代码,它将委托给i2c_algorithm中的smbus_xfer/master_xfer(如果模拟的话),这是特定于适配器/设备的。
1.所有这些事务类型是否都遵循SMBus 3.0的块线规范?
2.我如何决定我需要使用哪一种?
我正在Raspbian /Linux 10上创建一个Java JNA接口(buster)
发布于 2021-03-16 17:16:15
目前,我正在编写答案,Linux内核中的I2C模块仍然不支持SMBus 3.0/3.1。它实现了SMBus 2.0通信。
对于这三种类型-这是无法回答的。我想不会吧。要了解这些命令是如何工作的,请查看KMD源代码。例如,通过以下注释将I2C_SMBUS_I2C_BLOCK_BROKEN转换为I2C_SMBUS_I2C_BLOCK_DATA:
/* Convert old I2C block commands to the new
convention. This preserves binary compatibility. */以及I2C_SMBUS_I2C_BLOCK_DATA是否遵循块数据协议--这取决于用户。执行协议的命令是I2C_SMBUS_BLOCK_DATA。
如果您只想使用块协议,那么只需使用I2C_SMBUS_BLOCK_DATA。
如果您想要更多的控制,或者想要克服SMBus 2.0的限制,就必须使用I2C_SMBUS_I2C_BLOCK_DATA。尽管在这些情况下,您可能不得不手动构造SMBus消息,因为I2C_SMBUS_I2C_BLOCK_DATA仍然对您有很大的限制--您将得到一个最大消息长度的字节,但它仍远未达到255。
如果您是按照SMBus 1规范编写的,则在适当时使用I2C_SMBUS_I2C_BLOCK_BROKEN。
https://stackoverflow.com/questions/61604053
复制相似问题