英语

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)需要这样做。 通常,您真的不希望在一个传输的消息之间被打断。