0

2014 年 12 月 20 日的最新 SMBus 规范V3.0仅显示一种类型的块写入/读取(不包括块进程调用):

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 中的 ioctlI2C_SMBUS一起使用

#define I2C_SMBUS_BLOCK_DATA        5
#define I2C_SMBUS_I2C_BLOCK_BROKEN  6
#define I2C_SMBUS_I2C_BLOCK_DATA    8

drivers/i2c/*下的代码之后,它委托给smbus_xfer/ master_xfer(如果模拟) in i2c_algorithm,这是特定于适配器/设备的。

1. 所有这些事务类型最终都遵循 SMBus 3.0 的块连线规范吗?
2. 我将如何决定我需要使用哪一个?

我正在 Raspbian GNU/Linux 10 (buster) 上创建 Java JNA 接口

4

1 回答 1

1
  1. 所有这些事务类型最终都遵循 SMBus 3.0 的块连线规范吗?

在我写答案的那一刻,Linux 内核中的 I2C 模块仍然不支持 SMBus 3.0/3.1。它实现了 SMBus 2.0 通信。

而对于 3 种类型 - 这是无法回答的。我觉得不是。要了解这些命令的工作原理,请查看 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。

  1. 我将如何决定我需要使用哪一个?

如果您只想使用块协议,则只需使用 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。

于 2021-03-16T17:16:15.873 回答