4. S32K3 I2C模块硬件架构
S32K3系列的I2C模块基于恩智浦的LPI2C(Low-Power Inter-Integrated Circuit)IP核设计,支持主机、从机和多主机模式。理解其硬件架构是从机驱动开发和中断响应优化的基础。本节将深入剖析模块框图、时钟生成机制、数据移位寄存器以及关键的控制与状态寄存器。
4.1 I2C模块整体框图
下图展示了S32K3 I2C模块的内部功能架构,主要分为总线接口层、核心逻辑层和引脚控制层。
架构要点:
- IP Bus 接口:通过 AHB 或 APB 总线与内核交互,寄存器访问延迟低。
- 寄存器组 (CSR):所有控制、状态、数据寄存器的集合,是软件与硬件的唯一接口。
- 核心逻辑:包含时钟分频器、数据移位寄存器、状态机和中断/DMA控制逻辑。
- 引脚接口:开漏输出的 SCL 和 SDA 引脚,需外部上拉电阻。
4.2 时钟生成机制
I2C 总线的时序由 SCL 时钟信号决定。S32K3 LPI2C 模块的时钟源来自系统时钟(如 SPLL、FIRC 或 SOSC),通过内部分频器生成符合 I2C 标准(100 kHz、400 kHz、1 MHz)的时钟。
4.2.1 时钟分频器结构
时钟生成涉及两个关键寄存器字段:CLKLO 和 CLKHI,它们分别定义 SCL 低电平和高电平的持续时间(以时钟周期为单位)。
4.2.2 时钟频率计算
SCL 频率由以下公式决定:
SCL_Freq = Peripheral_Clock / ( (CLKLO + CLKHI) × 2 )
例如,若外设时钟为 80 MHz,需要 400 kHz 快速模式:
CLKLO + CLKHI = 80 MHz / (400 kHz × 2) = 100
通常设置 CLKLO = 50, CLKHI = 50
时钟配置建议:
- 标准模式 (100 kHz):CLKLO + CLKHI 通常设为 160~200(80 MHz 时钟下)。
- 快速模式 (400 kHz):CLKLO + CLKHI 设为 100 左右。
- 快速模式+ (1 MHz):CLKLO + CLKHI 设为 40 左右,需确保总线电容满足要求。
- 从机模式下,时钟由主机提供,从机只需确保自身时钟频率高于主机 SCL 的 2 倍以上。
4.3 数据移位寄存器
数据移位寄存器是 I2C 通信的核心,负责数据的串行发送和接收。S32K3 LPI2C 采用双缓冲结构,提高数据吞吐量。
4.3.1 发送路径
- TDR (Transmit Data Register):软件写入待发送数据的 8 位寄存器。
- 发送移位寄存器 (TX Shift Register):从 TDR 加载数据,按位通过 SDA 引脚输出。
- 当 TDR 为空且移位寄存器加载完成后,硬件自动触发发送中断或 DMA 请求。
4.3.2 接收路径
- 接收移位寄存器 (RX Shift Register):从 SDA 引脚逐位接收数据。
- RDR (Receive Data Register):接收完成后,数据从移位寄存器转移到 RDR,软件可读取。
- 当 RDR 有数据且未被读取时,硬件会拉低 SCL(时钟拉伸),等待软件处理。
从机接收关键点: 当 RDR 中的数据未被及时读取时,硬件会自动拉低 SCL 进行时钟拉伸,迫使主机等待。这是从机处理速度跟不上主机时的保护机制。在中断服务程序中应尽快读取 RDR 以避免总线阻塞。
4.4 控制与状态寄存器
LPI2C 模块的寄存器分为主机和从机两组。对于从机驱动开发,以下寄存器最为关键:
4.4.1 从机控制寄存器 (SCR)
| 位域 | 名称 | 描述 |
|---|---|---|
| 31-8 | — | 保留 |
| 7 | FILTEN | 数字滤波使能,用于抑制 SCL/SDA 上的毛刺 |
| 6 | FILTDZ | 滤波深度选择,0=1个周期,1=3个周期 |
| 5 | RST | 软件复位模块(自清零) |
| 4 | SAEN | 从机地址使能,使能后模块响应自身地址 |
| 3 | TXCFG | 发送配置:0=标准发送,1=发送 ACK/NACK 控制 |
| 2 | RXCFG | 接收配置:0=标准接收,1=接收 ACK/NACK 控制 |
| 1 | TXIE | 发送中断使能 |
| 0 | RXIE | 接收中断使能 |
4.4.2 从机状态寄存器 (SSR)
| 位域 | 名称 | 描述 |
|---|---|---|
| 7 | TDF | 发送数据标志:TDR 空时置位,可发送下一字节 |
| 6 | RDF | 接收数据标志:RDR 有数据时置位,需读取 |
| 5 | AVF | 地址有效标志:收到匹配的从机地址时置位 |
| 4 | TAF | 传输进行标志:正在传输时置位 |
| 3 | RSF | 重复起始标志:检测到重复起始条件时置位 |
| 2 | STOPF | 停止条件标志:检测到停止条件时置位 |
| 1 | BB | 总线忙标志:SCL 或 SDA 为低时置位 |
| 0 | AMF | 地址匹配标志:地址匹配且方向位已确定 |
4.4.3 数据寄存器 (TDR / RDR)
| 寄存器 | 偏移 | 访问 | 描述 |
|---|---|---|---|
| TDR | 0x1C | 只写 | 发送数据寄存器,写入待发送的 8 位数据 |
| RDR | 0x20 | 只读 | 接收数据寄存器,读取已接收的 8 位数据 |
4.4.4 从机地址寄存器 (SAR)
SAR 寄存器用于配置从机地址,支持 7 位和 10 位地址模式:
// 7 位地址配置示例(地址 0x42)
LPI2C0->SAR = 0x42; // 写入 7 位地址,硬件自动左移 1 位
// 10 位地址配置示例(地址 0x2A0)
LPI2C0->SAR = (1 << 10) | 0x2A0; // 位10 置1 表示 10 位地址模式
寄存器操作要点:
- 所有控制寄存器建议在模块使能前配置完成,避免运行时产生意外行为。
- 状态寄存器 SSR 的某些标志位(如 TDF、RDF)在读取后自动清零,部分标志(如 STOPF)需软件写 1 清除。
- 数据寄存器 TDR 和 RDR 的访问宽度固定为 8 位,不支持 16/32 位访问。
4.5 中断与 DMA 事件映射
LPI2C 模块支持多种中断和 DMA 请求,合理利用这些事件是实现高效从机响应的关键。
| 中断事件 | 标志位 | 触发条件 | 典型用途 |
|---|---|---|---|
| 接收数据就绪 | RDF | RDR 中有新数据 | 从机接收数据读取 |
| 发送数据请求 | TDF | TDR 为空,可写入新数据 | 从机发送数据填充 |
| 地址匹配 | AMF | 收到匹配的从机地址 | 从机通信开始处理 |
| 停止条件 | STOPF | 检测到 STOP 信号 | 从机通信结束处理 |
| 错误条件 | EPF | 仲裁丢失、NACK 等 | 错误恢复 |