Edit online

功能描述

9 Dec 2024
Read time: 5 minute(s)

协议约定

I2C 协议是一种应用广泛的串行通信协议,主要用于低速外设与处理器之间的数据传输。以下是对 I2C 协议中一些关键特性和机制的详细解析:

1. 协议约定

类型

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

1 bit,以7位地址模式为例,与 从设备地址的 7 bits,组成读写数据帧的数据内容(从设备 7 bits + 1 bit),0 表示写,1 表示读。

空闲检测

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

主和从 模式

I2C 协议:



主设备和从设备关系图:



主设备和从设备详细行为描述如下:
  • 主设备发送操作:
    • 发起寻址:主设备通过 I2C_DATA_CMD[8] 写 0 进行发送请求。
    • 数据写入:主设备将数据写进 I2C_DATA_CMD[7:0],然后发送到 I2C 总线。
    • 应答信号:响应的从设备从总线接收数据后,会向主设备发送 ACK 或 NACK 信号,以确认数据是否成功接收。
  • 主设备接收操作:
    • 发起寻址:主设备通过 I2C_DATA_CMD[8] 写 1 进行接收请求。
    • 数据读取:响应的 从设备将数据发送到 I2C 总线,由主设备从 I2C_DATA_CMD[7:0] 获取数据。
    • 应答信号:主设备在接收到数据后,会向从设备发送 ACK 或 NACK 信号。
  • 从设备发送操作:
    • 接收请求:接收到主设备的接收请求后,从设备将数据写进 I2C_DATA_CMD[7:0],然后发送到 I2C 总线。
    • 等待应答:从设备发送完数据后,等待主设备设备的应答信号。
  • 从设备接收操作:
    • 接收数据:接收到 主设备的发送请求后,从设备从 I2C_DATA_CMD[7:0] 获取数据。
    • 应答信号:从设备在接收数据后,向主设备发送 ACK 或 NACK 信号。
  • 主设备发起寻址,发起 START 信号,生成 SCL,生成 STOP 信号,可发送和接收。从设备作为被寻址的一方,发起 ACK 或NACK信号,可发送和接收。
注: I2C_DATA_CMD[8] 只能在主模式下配置,I2C 任何的通信行为都由主设备主动发起。

7-bit & 10-bit 寻址

I2C 协议的寻址方式主要分为7 位寻址和 10 位寻址,两种方式各有其特点和应用场景,以适应不同规模和复杂度的系统需求。了解寻址方式有助于正确配置和使用 I2C 设备,实现高效的数据传输和通信。

7-bit 寻址格式:允许主设备通过发送一个字节来寻址从设备,进行数据的读写操作。

在 7 位寻址模式下,I2C 设备的从机地址由 7 位组成,第 8 位是读写位(R/W),用于指示数据的方向:0 表示写操作,1 表示读操作。具体来说,I2C_TAR[6:0] 对应此 7 位地址,而 I2C_DATA_CMD[8] 则作为 R/W 位。

这种模式



注:

在某些情况下,从机设备可能支持 START 字节,即主设备先发起 0000 0001 字节(不需要 ACK),再发起 START 信号进行寻址。

10-bit 寻址格式

在 10 位寻址模式下,寻址过程分为两个字节发送,确保了即使地址空间扩大到 10 位,也能保持与 7 位寻址的兼容性:
  • 第一个字节:该字节的 bit[7:3] 向从设备指示这是一个 10bit 的地址。紧接着的 bit[2:1]为 I2C_TAR[9:8],而 R/W 为 I2C_DATA_CMD[8]。

    这个字节用于告诉从机接下来的是一个 10 位地址。

  • 第二个字节:这个字节直接包含 I2C_TAR[7:0],即从机的后 8 位地址。


Restart 说明

在 I2C 通信协议中,Restart(重复起始条件)是一种重要的信号,允许主设备在不产生停止条件的情况下继续与从设备进行通信。这种机制使得数据传输更加高效和连贯,尤其是在需要连续执行多次读写操作的场景中。

与起始条件类似,重复起始条件发生在停止条件之前。主设备在一个字节传输完成后,不产生停止条件而是发送重复起始条件来启动下一次传输,以便继续给从设备发送消息。

Restart 的时序要求与起始条件类似,都是在 SCL (串行时钟线)为高电平时,产生一个 SDA (串行数据线)的下降沿。具体来说,需要先令 SDA 和 SCL 都处于高电平状态,再令 SDA 拉低,以形成重复起始条件的时序。在 Restart 过程中,SDA 的下降沿必须在 SCL 为高电平时发生,这是判断是否为有效 Restart 的关键。

Restart 时序:



Restart 传输时序具有多种应用场景,示例如下:

多次读数据
  • 当主设备需要从从设备的多个寄存器中读取数据时,可以使用 Restart 来避免在每次读取之间产生停止条件。
  • 主设备首先发送起始条件和从设备地址,然后发送要读取的第一个寄存器的地址。在接收到从设备返回的数据后,主设备不产生停止条件,而是直接发起 Restart,再次发送起始条件和从设备地址,以及下一个要读取的寄存器的地址。如此重复,直到所有需要的数据都被读取完毕。


多次写数据
  • 当主设备需要从从设备的多个寄存器中写入数据时,可以使用 Restart 来避免在每次写入之间产生停止条件。
  • 主设备首先发送起始条件和从设备地址,然后发送要写入的第一个寄存器的地址和数据。在完成这次写入后,主设备不产生停止条件,而是直接发起 Restart,再次发送起始条件和从设备地址,以及下一个要写入的寄存器的地址和数据。如此重复,直到所有需要的数据都被写入完毕。


读数据转写数据
  • 在某些情况下,主设备可能需要先从从设备读取数据,然后根据读取到的数据来决定是否需要写入新的数据。
  • 主设备首先发送起始条件和从设备地址,然后发送要读取的寄存器的地址。在接收到从设备返回的数据后,主设备可以根据需要决定是否发起 Restart 并切换到写模式。如果需要写入新的数据,则主设备再次发送起始条件和从设备地址,以及要写入的寄存器的地址和数据。


写数据转读数据
  • 某些情况下,主设备可能需要先向从设备写入数据,然后再读取从设备的状态或响应。
  • 主设备首先发送起始条件和从设备地址,然后发送要写入的寄存器的地址和数据。在完成这次写入后,如果主设备需要读取从设备的状态或响应,则可以发起 Restart 并切换到读模式。具体来说,主设备再次发送起始条件和从设备地址,然后发送要读取的寄存器的地址。从设备会根据请求返回相应的数据或状态信息给主设备。


SDA_SETUP_TIME 和 SDA_HOLD_TIME 说明

在 I2C 通信协议中,SDA_SETUP_TIME 和 SDA_HOLD_TIME 是两个至关重要的时序参数,确保了数据在传输过程中的准确性和稳定性。这两个参数主要涉及到 SDA(串行数据线)在 SCL(串行时钟线)上升沿或下降沿前后的状态保持时间。
  • SDA_SETUP_TIME:SCL 延迟时间,表示 SDA 在 SCL 上升沿到来之前需要保持稳定的时间,仅当 I2C 作为 从设备发送数据时使用。

    SDA_SETUP_TIME 确保了接收设备能够在 SCL 上升沿到来之前正确地读取 SDA 上的数据。如果 SDA 在 SCL 上升沿到来之前未能稳定,接收设备可能会读取到错误的数据。

  • SDA_HOLD_TIME:SDA 保持时间,表示 SDA 在 SCL 上升沿到来之后需要保持稳定的时间。

    SDA_HOLD_TIME 确保了接收设备在 SCL 上升沿到来之后有足d够的时间来读取并处理 SDA 上的数据。如果 SDA 在 SCL 上升沿到来之后未能保持稳定,接收设备可能无法正确读取数据。

SETUP 和 HOLD 说明:



START BYTE 机制

START BYTE 机制是一种用于 I2C 通信中的技术,特别适用于片上系统没有专用的 I2C 模块的情况。这种机制通过延长开始条件的过程,使得处理器可以以较低的频率采样 SDA 线,从而降低功耗并提高系统效率。通过在生成 START 条件后,继续发送一个特定的字节信号 (0000_0001),主设备持续的将 SDA 线拉低七个周期,使得处理器可以在低速下侦听总线,一旦检测到起始字节中的任一 0 位,便切换到高速模式进行后续的数据传输。

当 I2C 设为从设备时,无需使用 START BYTE 机制。

START BYTE 的过程:
  1. 主设备先产生一个 START 条件。

  2. 主设备 发送 byte(0000_0001),并发送 ACK 信号。

    主设备在整个字节发送期间保持 SDA 线为低电平。

  3. 在此过程中,不能有任何从设备响应 ACK。

  4. 主设备生成 restart 信号,标志着 START BYTE 机制的结束,随后进入正常的数据传输阶段。

START BYTE 时序要求如下:
  • START 条件要求在 SCL 为高电平时,SDA 发生高到低的跳变;随后在 SCL 的第一个时钟周期内,SDA 必须保持低电平。
  • 在发送特定字节信号时,主设备需确保在每个时钟周期内 SDA 线的正确电平状态,特别是要在整个字节期间保持 SDA 为低电平。
  • RESTART 信号的产生时机是在特定字节信号发送完毕后,此时 SCL 应处于低电平状态,而 SDA 需由低电平跳变至高电平。


在整个 START BYTE 过程中,主设备需要严格控制时钟信号(SCL)和数据信号(SDA)的配合,确保时序的准确性和稳定性。

通用广播地址

通用广播地址 (General call address) 是 I2C 协议中的一种特殊机制,用于同时寻址总线上的所有设备。这种机制允许主设备通过发送特定的地址来广播消息或命令到所有连接在 I2C 总线上的从设备。
  • 不需要使用广播功能的设备,可以不响应广播。
  • 需要使用广播功能的设备,则在检测到广播地址后发送响应,并作为从设备接收读取总线上发送的数据。

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

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



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

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

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

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

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

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

    • 硬件广播格式:



总线挂死恢复机制

总线挂死恢复分为以下情况:
  • SDA 挂死恢复:当检测到 SDA 挂死条件时,会触发恢复机制。

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

    1. 主设备尝试在 SDA 发送逻辑 1 并且检查 SDA 是否恢复,最多连续发送 9 个时钟周期。
    2. 如果 SDA 在九个时钟周期内恢复,主设备则发送一个 STOP 信号释放总线。

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



      下图表示第七个时钟恢复



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

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