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()
实现。
它们与上述事务类似,但是发送起始条件 S 而不是停止条件 P,并且事务继续。 例如,读取一个字节,然后写入一个字节
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 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)需要这样做。 通常,您真的不希望在一个传输的消息之间被打断。