功能描述
协议约定
类型 |
描述 |
---|---|
数据帧 | 大小固定为 8 bits(一字节) |
传输方向 | 高位先发 |
总线释放状态 | SCL 和 SDA 均为高电平,其中 SCL 一直由 master 设备控制。 |
启动信号(START) | SCL 高,SDA 由高转低 |
停止信号(STOP) | SCL 高,SDA 由低转高 |
应答信号 |
|
Slave 设备地址 |
|
读写位 |
1 bit,与 Slave 设备地址的 7 bits,组成读写数据帧的数据内容(Slave 设备 7 bits + 1 bit),0 表示写,1 表示读。 |
空闲检测 |
Master 设备检测到 SDA、 SCL 均为高电平。 |
Master & Slave 模式
I2C 协议:
Master & slave 关系图:
- Master 发送操作:master 设备通过 I2C_DATA_CMD[8] 写 0 进行发送请求,将数据写进 I2C_DATA_CMD[7:0],然后发送到 I2C 总线,由响应的 slave 设备从总线接收数据。
- Master 接收操作:master 设备通过 I2C_DATA_CMD[8] 写 1 进行接收请求,由响应的 slave 设备将数据发送到 I2C 总线,然后 master 从 I2C_DATA_CMD[7:0]获取数据。
- Slave 发送操作:接收到 master 的接收请求,将数据写进 I2C_DATA_CMD[7:0],然后发送到 I2C 总线。
- Slave 接收操作:接收到 master 的发送请求,从 I2C_DATA_CMD[7:0] 获取数据
- Mater 发起寻址,发起 START 信号,生成 SCL,生成 STOP 信号,可发送和接收。Slave 作为被寻址的一方,发起 ACK 或 Not ACK 信号,可发送和接收。
7-bit & 10-bit 寻址
7-bit 寻址格式
I2C_TAR[6:0] 对应此 7 位地址,R/W 为 I2C_DATA_CMD[8]。
其中寻址模式存在一些 slave 设备支持 START 字节,即 master 先发起 0000 0001 字节(不需要 ACK),再发起 START 信号进行寻址。
10-bit 寻址格式
10-bit 寻址分为两个字节发送:第一个字节的 bit[7:3] 向 slave 指示这是一个 10bit 的地址。紧接着的 bit[2:1]为 I2C_TAR[9:8],R/W 为 I2C_DATA_CMD[8]。第二个字节为 I2C_TAR[7:0]。
Restart 说明
重复起始条件和起始条件类似,重复起始条件发生在停止条件之前。Master 想继续给 slave 发送消息时,在一个字节传输完成后可以发送重复起始条件来启动下一次传输,而不是产生停止条件。
Restart 也是在 SCL 高电平的时候产生一个 SDA 的下降沿。因此需要先令 SDA 和 SCL 都处于高电平状态,再令 SDA 拉低,本质操作和起始条件是一样的。
Restart 时序:
传输时序示例如下:
多次读数据:
多次写数据:
读数据转写数据:
写数据转读数据:
SDA_SETUP_TIME 和 SDA_HOLD_TIME 说明
SDA_SETUP_TIME 为 SCL 延迟时间,表示 SCL 上升沿相对 SDA 的延迟量,只有当 I2C 作为 slave 发送数据时使用。
SDA_HOLD_TIME 为 SDA 保持时间,表示 SCL 拉低之后 SDA 保持的时间。
SETUP 和 HOLD 说明:
START BYTE 机制
START BYTE 机制服务于当片上系统没有专用的 I2C 模块的情况。START BYTE 会将开始条件的过程延长,在生成 START 条件后,继续发送一个 Byte 信号 (0000_0001),master 持续的将 SDA 线拉低七个周期。
当 I2C 设为 slave 时,无需使用 START BYTE 机制。当 I2C 设为 master,启用 START BYTE 可以让轮询总线的处理器以较低的频率采样 SDA 线。当采样到起始字节中任意一个 0 时,切换到更快的频率,找到 0000_0001 后产生 restart,然后开始传输。
-
Master 先产生一个 START 条件
-
Master 发送 byte(0000_0001),并发送 ACK 信号
-
在此过程中,不能有任何 slave 相应 ACK
-
Master 生成 restart 信号。
START BYTE 时序:
通用广播地址
- 不需要使用广播功能的设备,可以不响应广播。
- 需要使用广播功能的设备,则在检测到广播地址后发送响应,并作为 slave
接收读取总线上发送的数据。
Master 不知道总线上发送响应的 slave 数量,总线上所有可以响应广播的 slave 读取广播地址后的第二个以及后面的字节,不能处理广播数据的 slave 不发送响应来忽略广播。因此 master 检测不到未响应的 slave。
广播信息的含义在第二个字节决定,如下所示:
GEN_CALL 格式有两种情况,详细说明如下:
- 第二个 Byte 最低位 B 为 0:
-
0000_0110(06h):设备复位并通过硬件写数据到 slave 的可编程部分。所有可以响应此类广播的 slave,收到此两个字节后,进行复位并进入其地址的可编程部分。
-
0000_0100(04h):通过硬件写内容到 slave 的可编程部分,作用类似 (06h),但设备不复位。
-
0000_0000(00h):不允许作为第二个字节使用。
-
- 第二个 Byte 最低位 B 为 1:
-
该两字节广播定义为硬件广播,由一个硬件 master 器件发送,例如键盘扫描器。硬件广播不能编程,无法发送一个期望的 slave 地址。由于硬件 master 预先不知道报文要传输给哪个器件,只能产生包含自身地址的硬件广播呼叫,便于系统识别。
-
第二个字节中前 7 位是硬件 master 的地址,可由连接到总线的智能器件识别并指引硬件 master 的信息,例如,一个连接到总线的微控制器。如果硬件 master 也可以作为 slave,其 slave 地址和 master 地址相同。
-
硬件广播格式:
-
总线挂死恢复机制
- SDA 挂死恢复
I2C 通信异常可能会造成总线挂死情况,例如 slave 设备应答 ACK 拉低 SDA 时出现异常。此时 slave 无法释放总线,造成 master 无法继续掌握总线进行通信。
因此检测到 SDA 挂死条件,则触发恢复机制。原理如下:- Master 尝试在 SDA 发送逻辑 1 并且检查 SDA 是否恢复,最多连续发送 9 个时钟周期。
- 如果 SDA 在九个时钟周期内恢复,master 则发送一个 STOP
信号释放总线。
下图表示第九个时钟恢复:
下图表示第七个时钟恢复
- 如果 SDA 在九个时钟周期内未恢复,则系统需要硬件复位。
- SCL 挂死恢复
通常只有在电路电气发生故障才存在 SCL 一直处于低电平,除了硬件复位系统外,没有有效的方法来解决此问题,若使能 SCL 挂死中断,可查看 I2C_INTR_STAT[14] 检查 SCL 状态。