Edit online

功能描述

11 Jun 2024
Read time: 4 minute(s)

协议约定

1. 协议约定

类型

描述
数据帧 大小固定为 8 bits(一字节)
传输方向 高位先发
总线释放状态 SCL 和 SDA 均为高电平,其中 SCL 一直由 master 设备控制。
启动信号(START) SCL 高,SDA 由高转低
停止信号(STOP) SCL 高,SDA 由低转高
应答信号
  • ACK:master 设备控制 SCL,发送完 8 bits 后释放 SDA,在第九个 SCL 波形时,Slave 设备拉低 SDA。
  • NACK:master 设备控制 SCL,发送完 8 bits 后释放 SDA,在第九个 SCL 波形时,Slave 设备拉高 SDA。
Slave 设备地址
  • 含 CPU 的智能器件,地址由软件初始化时定义,但不能与其它的器件有冲突。
  • 不含 CPU 的非智能器件:
    • 高 4 bits 由厂家在器件内部固化,不可改变。
    • 低 3 bits 由引脚连接电平决定,例如 eeprom,三个引脚常用名字 A1、A2、A3。
读写位

1 bit,与 Slave 设备地址的 7 bits,组成读写数据帧的数据内容(Slave 设备 7 bits + 1 bit),0 表示写,1 表示读。

空闲检测

Master 设备检测到 SDA、 SCL 均为高电平。

Master & Slave 模式

I2C 协议:



Master & slave 关系图:



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 信号,可发送和接收。
注: I2C_DATA_CMD[8] 只能在 master 模式下配置,I2C 任何的通信行为都由 master 主动发起。

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,然后开始传输。

START BYTE 的过程:
  1. Master 先产生一个 START 条件

  2. Master 发送 byte(0000_0001),并发送 ACK 信号

  3. 在此过程中,不能有任何 slave 相应 ACK

  4. Master 生成 restart 信号。

START BYTE 时序:



通用广播地址

通用广播地址 (General call address) 是为了寻址总线上的所有设备。
  • 不需要使用广播功能的设备,可以不响应广播。
  • 需要使用广播功能的设备,则在检测到广播地址后发送响应,并作为 slave 接收读取总线上发送的数据。

    Master 不知道总线上发送响应的 slave 数量,总线上所有可以响应广播的 slave 读取广播地址后的第二个以及后面的字节,不能处理广播数据的 slave 不发送响应来忽略广播。因此 master 检测不到未响应的 slave。

广播信息的含义在第二个字节决定,如下所示:



GEN_CALL 格式有两种情况,详细说明如下:

  1. 第二个 Byte 最低位 B 为 0:
    • 0000_0110(06h):设备复位并通过硬件写数据到 slave 的可编程部分。所有可以响应此类广播的 slave,收到此两个字节后,进行复位并进入其地址的可编程部分。

    • 0000_0100(04h):通过硬件写内容到 slave 的可编程部分,作用类似 (06h),但设备不复位。

    • 0000_0000(00h):不允许作为第二个字节使用。

  2. 第二个 Byte 最低位 B 为 1:
    • 该两字节广播定义为硬件广播,由一个硬件 master 器件发送,例如键盘扫描器。硬件广播不能编程,无法发送一个期望的 slave 地址。由于硬件 master 预先不知道报文要传输给哪个器件,只能产生包含自身地址的硬件广播呼叫,便于系统识别。

    • 第二个字节中前 7 位是硬件 master 的地址,可由连接到总线的智能器件识别并指引硬件 master 的信息,例如,一个连接到总线的微控制器。如果硬件 master 也可以作为 slave,其 slave 地址和 master 地址相同。

    • 硬件广播格式:



总线挂死恢复机制

总线挂死恢复分为以下情况:
  • SDA 挂死恢复

    I2C 通信异常可能会造成总线挂死情况,例如 slave 设备应答 ACK 拉低 SDA 时出现异常。此时 slave 无法释放总线,造成 master 无法继续掌握总线进行通信。

    因此检测到 SDA 挂死条件,则触发恢复机制。原理如下:
    1. Master 尝试在 SDA 发送逻辑 1 并且检查 SDA 是否恢复,最多连续发送 9 个时钟周期。
    2. 如果 SDA 在九个时钟周期内恢复,master 则发送一个 STOP 信号释放总线。

      下图表示第九个时钟恢复:



      下图表示第七个时钟恢复



    3. 如果 SDA 在九个时钟周期内未恢复,则系统需要硬件复位。
  • SCL 挂死恢复

    通常只有在电路电气发生故障才存在 SCL 一直处于低电平,除了硬件复位系统外,没有有效的方法来解决此问题,若使能 SCL 挂死中断,可查看 I2C_INTR_STAT[14] 检查 SCL 状态。