The I2C Protocol
本文档概述了基本 I2C 事务以及执行这些事务的内核 API。
1. Key to symbols
| S | 启动条件 |
| P | 停止条件 |
| Rd/Wr (1 bit) | 读/写位。 Rd 等于 1,Wr 等于 0 |
| A, NA (1 bit) | 应答 (ACK) 和不应答 (NACK) 位 |
| Addr (7 bits) | I2C 7 位地址。 请注意,这可以扩展以获得 10 位 I2C 地址 |
| Data (8 bits) | 一个纯数据字节 |
| [..] | I2C 设备发送的数据,而不是主机适配器发送的数据 |
2. Simple send transaction
由i2c_master_send()实现:
S Addr Wr [A] Data [A] Data [A] ... [A] Data [A] P
3. Simple receive transaction
由i2c_master_recv()实现:
S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
4. Combined transactions
由 i2c_transfer() 实现。
它们与上述事务类似,但发送的不是停止条件 P,而是发送启动条件 S,并且事务继续。 字节读取后跟字节写入的示例:
S Addr Rd [A] [Data] NA S Addr Wr [A] Data [A] P
5. Modified transactions
还可以通过为 I2C 消息设置这些标志来生成对 I2C 协议的以下修改。 除了 I2C_M_NOSTART 之外,它们通常只需要解决设备问题:
I2C_M_IGNORE_NAK:
通常,如果客户端发出[NA],消息会立即中断。 设置此标志会将任何 [NA] 视为 [A],并且发送所有消息。 这些消息可能仍无法达到 SCL lo->hi 超时。
I2C_M_NO_RD_ACK:
在读取消息中,主 A/NA 位被跳过。
I2C_M_NOSTART:
在组合事务中,在某个时刻不会生成“S Addr Wr/Rd [A]”。 例如,在第二部分消息上设置 I2C_M_NOSTART 会生成类似以下内容的内容:
S Addr Rd [A] [Data] NA Data [A] P
如果您为第一个部分消息设置 I2C_M_NOSTART 变量,我们不会生成 Addr,但会生成启动条件 S。这可能会使总线上的所有其他客户端感到困惑,因此不要尝试此操作。
这通常用于将系统内存中多个数据缓冲区的传输收集到显示为到 I2C 设备的单次传输中,但也可以在某些罕见设备的方向更改之间使用。
I2C_M_REV_DIR_ADDR:
这会切换 Rd/Wr 标志。 也就是说,如果您想要执行写入操作,但需要发出 Rd 而不是 Wr,反之亦然,则可以设置此标志。 例如:
S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P
I2C_M_STOP:
消息后强制停止条件 (P)。 一些 I2C 相关协议(例如 SCCB)需要这样做。 通常,您确实不希望在一次传输的消息之间被打断。