本节内容为理论内容
I2C 协议简介

I2C 物理层

I2C 协议层

I2C 基本读写过程

1. 主机写操作
最上面的时序图,描述了主机向从机写入数据的过程。
- S:起始信号。表示通信开始。
- SLAVE ADDRESS:从机地址。主机发送要通信的从设备地址。
- R/W :读写位。此处为 '0' ,表示写操作。
- A:应答信号。从机收到地址和读写位后,拉低总线表示应答。
- DATA:数据。主机发送数据字节。
- A / A̅:应答/非应答。每发送一个字节数据,接收方都需要发送一个应答位。最后一个字节传输完后,可以是应答也可以是非应答。
- P:停止信号。表示通信结束。
总结流程: 起始 -> 发送从机地址(写) -> 等待应答 -> 发送数据(n字节) -> 等待应答 -> 停止。
2. 主机读操作
中间的时序图,描述了主机从从机读取数据的过程。
- S:起始信号。
- SLAVE ADDRESS:从机地址。
- R/W :读写位。此处为 '1' ,表示读操作。
- A:应答信号。从机收到地址和读命令后应答。
- DATA:数据。此时数据方向是从从机到主机。
- A:应答信号。主机接收到数据后,通常需要发送应答(除了最后一个字节)。
- P:停止信号。
总结流程: 起始 -> 发送从机地址(读) -> 等待应答 -> 接收数据(n字节) -> 发送应答 -> 停止。
3. 复合模式
最下面的长时序图,也称为"复合格式"或"重复启动模式"。这通常用于先写后读的场景,例如:先向传感器写入要读取的寄存器地址,然后再读取该寄存器的数据。
- 第一阶段(写):
-
- S:起始信号。
- SLAVE ADDRESS + R/W̅:发送从机地址,R/W位为写(0)。
- DATA (n字节 + ack):发送控制数据(通常是寄存器地址)。
- Sr :重复起始信号。注意这里没有发送停止信号(P),而是直接再次发送起始信号。这保证了总线的占用权不释放,防止其他主机干扰。
- 第二阶段(读/写):
-
- SLAVE ADDRESS + R/W̅:再次发送从机地址,此时R/W位根据需求决定(通常是切换为读 '1')。
- DATA (n字节 + ack):进行数据的读取或写入。
- P:停止信号。通信彻底结束。
通讯的起始和停止信号

数据有效性

地址和数据方向

响应

STM32 的 I2C 架构

1. 物理接口层 (橙色部分)
这是 STM32 芯片与外部世界连接的物理引脚。
- SDA (Serial Data):串行数据线,用于双向传输数据。
- SCL (Serial Clock):串行时钟线,由主机产生时钟信号。
- SMBA (SMBus Alert):SMBus 警报线。SMBus 是基于 I2C 的一种总线标准,这个引脚用于特定的警报功能,在普通 I2C 通信中不常用。
2. 时钟控制模块 (紫色部分)
这部分负责生成和管理 I2C 通信所需的时钟信号。
- 时钟控制:负责根据设定的速度(标准模式 100kHz 或快速模式 400kHz)来分频产生 SCL 时钟。
- 时钟控制寄存器 (CCR):用户可以通过编程这个寄存器来配置 I2C 的通信速率(波特率)。
3. 数据处理与移位模块 (绿色部分)
这是 I2C 通信的核心数据通路,负责数据的串并转换和过滤。
- 数据寄存器 (DR):这是 CPU 与 I2C 外设交换数据的地方。
-
- 发送时:CPU 把数据写入 DR。
- 接收时:CPU 从 DR 读取收到的数据。
- 数据移位寄存器:负责将并行数据转换为串行数据(发送时),或将串行数据转换为并行数据(接收时)。它直接连接到 SDA 线进行位传输。
- 比较器:用于从机模式。当主机发送地址时,硬件会将总线上的地址与"自身地址寄存器"里的值进行比较,如果匹配,则选中该从机。
- 自身地址寄存器 / 双地址寄存器:存储 STM32 作为从机时的地址。
- PEC 计算 / PEC 寄存器:用于数据包错误校验(Packet Error Checking),这是 SMBus 协议特有的功能,用于验证数据完整性。
4. 控制逻辑与状态模块 (黄色部分)
这部分是 I2C 外设的"大脑",负责协调各个模块的工作,并向 CPU 报告状态。
- 控制寄存器 (CR1 和 CR2):用户通过写这些寄存器来开启 I2C、配置应答使能、启动/停止传输等。
- 状态寄存器 (SR1 和 SR2):反映当前的通信状态(例如:发送寄存器为空、接收寄存器非空、地址已发送、总线忙等)。CPU 通过读取这些寄存器来判断下一步该做什么。
- 控制逻辑:根据 CR 寄存器的设置和当前的通信状态,自动控制时序的产生(如产生起始信号、停止信号、应答信号)。
- 中断 / DMA 请求:当特定事件发生(如数据接收完成)时,硬件会自动向 CPU 发送中断请求或 DMA 请求,从而减少 CPU 的负担,提高传输效率。