4. MCU I2C外设架构:典型MCU(如STM32)I2C模块内部框图、时钟树、复位与使能

在深入寄存器配置之前,必须理解I2C外设在MCU内部的硬件架构。以STM32F1/F4系列为例,其I2C模块是一个独立的外设单元,挂载在APB1总线上,拥有自己的时钟域、复位逻辑和中断系统。掌握内部框图、时钟树以及复位使能流程,是正确配置寄存器的基础。

4.1 I2C模块内部框图

STM32的I2C模块内部由多个功能单元组成,主要包括:时钟控制单元、数据移位寄存器、地址比较器、中断/状态逻辑以及DMA接口。下图展示了I2C外设的核心架构。

STM32 I2C 外设内部框图 APB1 总线接口 时钟使能 (PE) 复位控制 (RST) 寄存器映射 中断/DMA 请求 时钟与控制 SCL 时钟发生器 波特率预分频器 上升/下降时间控制 主/从模式选择 数据路径 数据移位寄存器 数据寄存器 (DR) 发送/接收控制 PEC 校验 地址 比较 OAR1 OAR2 应答 逻辑 SCL 引脚 SDA 引脚 关键说明 • 数据移位寄存器负责将并行数据转换为串行位流,在SCL时钟控制下逐位发送或接收。 • 地址比较器在从机模式下自动将接收到的地址与OAR1/OAR2寄存器匹配,匹配成功则产生应答。 • 中断/DMA请求逻辑在数据发送完成、接收就绪或错误发生时向CPU发出信号。

4.2 I2C时钟树

I2C外设的时钟源来自APB1总线时钟(PCLK1),通过预分频器产生SCL时钟。正确配置预分频器是确保I2C通信速率符合标准模式(100kHz)或快速模式(400kHz)的关键。

参数 说明 典型值 (F1系列)
PCLK1 (APB1时钟) I2C外设的输入时钟源 36 MHz / 72 MHz
CCR (时钟控制寄存器) 配置SCL时钟分频系数 标准模式: 180 (36MHz→100kHz)
TRISE (上升时间寄存器) 配置SCL上升沿最大时间 标准模式: 37 (1000ns)
SCL频率公式 F_SCL = PCLK1 / (2 × (CCR + 1)) —

时钟配置要点:在STM32F1系列中,I2C的时钟使能位位于RCC_APB1ENR寄存器。例如,I2C1的使能位为RCC_APB1ENR的第21位。配置前必须确保该位置1,否则所有I2C寄存器访问将无效。

4.3 复位与使能流程

I2C外设的初始化和关闭遵循严格的硬件流程。复位操作将外设恢复到默认状态,使能操作则激活时钟并允许寄存器访问。以下是标准操作步骤:

  1. 时钟使能:设置RCC_APB1ENR中对应的I2C位,使能外设时钟。
  2. 复位外设(可选):设置RCC_APB1RSTR中对应的I2C位,保持至少一个系统时钟周期后清除,完成硬件复位。
  3. 配置GPIO:将SCL和SDA引脚配置为开漏输出/输入模式,并使能复用功能。
  4. 配置I2C寄存器:设置CR1、CR2、CCR、TRISE等寄存器,配置工作模式、速率和地址。
  5. 使能外设:设置CR1寄存器的PE位(第0位),启动I2C模块。

常见错误:在未使能时钟(RCC_APB1ENR)的情况下直接操作I2C寄存器,会导致总线错误或硬故障。复位操作必须在时钟使能之后执行,否则复位信号无法传递到外设。

I2C 外设复位与使能时序 步骤1 时钟使能 步骤2 复位外设 步骤3 配置GPIO 步骤4 配置寄存器 步骤5 使能外设 (PE=1) 关键时序约束 复位脉冲宽度必须 ≥ 1个APB时钟周期;使能PE位后,需等待至少4个APB时钟周期才能进行后续操作。

4.4 寄存器映射与基地址

I2C外设的寄存器映射在APB1地址空间内。以STM32F103为例,I2C1的基地址为0x40005400,I2C2为0x40005800。每个I2C模块包含约10个控制/状态寄存器,偏移地址从0x00到0x24。

偏移地址 寄存器名称 功能描述
0x00 CR1 控制寄存器1 (PE, START, STOP, ACK, NACK等)
0x04 CR2 控制寄存器2 (中断使能, DMA请求等)
0x08 OAR1 自身地址寄存器1 (7位/10位地址模式)
0x0C OAR2 自身地址寄存器2 (双地址模式)
0x10 DR 数据寄存器 (发送/接收缓冲区)
0x14 SR1 状态寄存器1 (SB, ADDR, TXE, RXNE, BTF等)
0x18 SR2 状态寄存器2 (BUSY, MSL, TRA等)
0x1C CCR 时钟控制寄存器 (SCL频率配置)
0x20 TRISE 上升时间寄存器 (SCL上升沿最大时间)

调试建议:在初始化I2C外设时,建议先读取SR1和SR2寄存器,确认外设处于空闲状态(BUSY=0)。然后依次配置CR2、CCR、TRISE、OAR1,最后设置CR1的PE位使能外设。使用调试器观察寄存器值变化,可以快速定位配置错误。