I2C 协议¶
本文档概述了基本的 I2C 事务和执行这些事务的内核 API。
符号说明¶
S |
起始条件 |
P |
停止条件 |
Rd/Wr (1 位) |
读/写位。Rd 等于 1,Wr 等于 0。 |
A, NA (1 位) |
确认 (ACK) 和未确认 (NACK) 位 |
Addr (7 位) |
I2C 7 位地址。请注意,可以将其扩展以获得 10 位 I2C 地址。 |
Data (8 位) |
纯数据字节。 |
[..] |
由 I2C 设备发送的数据,与主机适配器发送的数据相反。 |
简单发送事务¶
由 i2c_master_send()
实现
S Addr Wr [A] Data [A] Data [A] ... [A] Data [A] P
简单接收事务¶
由 i2c_master_recv()
实现
S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
组合事务¶
由 i2c_transfer()
实现。
它们与上述事务类似,但是不是发送停止条件 P,而是发送起始条件 S,并且事务继续进行。一个字节读取的示例,后跟一个字节写入
S Addr Rd [A] [Data] NA S Addr Wr [A] Data [A] P
修改后的事务¶
还可以通过为 I2C 消息设置这些标志来生成以下对 I2C 协议的修改。除了 I2C_M_NOSTART 之外,它们通常仅在解决设备问题时才需要
- I2C_M_IGNORE_NAK
通常,如果客户端返回 [NA],则消息会立即中断。设置此标志会将任何 [NA] 视为 [A],并发送所有消息。这些消息仍然可能无法通过 SCL 低电平 -> 高电平超时。
- 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)需要这样做。通常,您真的不希望在一个传输的消息之间被打断。