4. S32K3 I2C模块硬件架构

S32K3系列的I2C模块基于恩智浦的LPI2C(Low-Power Inter-Integrated Circuit)IP核设计,支持主机、从机和多主机模式。理解其硬件架构是从机驱动开发和中断响应优化的基础。本节将深入剖析模块框图、时钟生成机制、数据移位寄存器以及关键的控制与状态寄存器。

4.1 I2C模块整体框图

下图展示了S32K3 I2C模块的内部功能架构,主要分为总线接口层、核心逻辑层和引脚控制层。

S32K3 I2C (LPI2C) 模块硬件架构框图 IP Bus 接口 (AHB/APB) 控制与状态寄存器组 (CSR) MCR / MSR / SCR / SSR / TDR / RDR / CFGR1/2 / PARAM / VERID 核心逻辑层 (Core Logic) 时钟分频器 CLKLO / CLKHI 数据移位寄存器 TX / RX 双缓冲 状态机 (FSM) 主机/从机/空闲 中断/ DMA 控制 引脚接口 (I2C_SCL / I2C_SDA) 注:S32K3 LPI2C 支持最高 1 Mbps 标准/快速模式,内部数据路径为 8 位宽。
架构要点:
  • 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 低电平和高电平的持续时间(以时钟周期为单位)。

I2C 时钟生成原理 系统时钟 (如 80 MHz) 分频器 CLKLO + CLKHI SCL 输出 输入时钟 SCL 波形 CLKLO CLKHI

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(时钟拉伸),等待软件处理。
数据移位寄存器双缓冲结构 发送路径 (TX) TDR (软件写) TX 移位寄存器 SDA 输出 接收路径 (RX) SDA 输入 RX 移位寄存器 RDR (软件读) 双缓冲机制:软件可在移位寄存器工作时访问 TDR/RDR,提高连续数据传输效率。
从机接收关键点: 当 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 等 错误恢复