2. I2C协议基础

I2C(Inter-Integrated Circuit)总线由Philips(现NXP)开发,是一种同步、多主从、串行通信总线。在S32K3平台驱动开发中,理解I2C的物理层与协议层是正确配置外设、调试时序问题的前提。本节从物理层信号、地址机制、主从模式三个维度展开。

2.1 I2C总线物理层

I2C总线仅使用两条双向信号线:

  • SCL(Serial Clock Line):由主设备驱动,用于同步数据传输。
  • SDA(Serial Data Line):用于传输地址、数据和控制位。

两条线均通过上拉电阻连接到电源电压(VDD)。当总线空闲时,SCL和SDA均为高电平。设备输出级为开漏(Open-Drain)结构,允许多个设备共享总线,并通过线与(Wired-AND)机制实现仲裁。

关键参数: 标准模式(100 kbit/s)、快速模式(400 kbit/s)、快速模式+(1 Mbit/s)、高速模式(3.4 Mbit/s)。S32K3的I2C模块支持标准模式与快速模式。
I2C总线物理连接示意图 Rp Rp VDD SDA SCL 主设备 从设备1 从设备2 开漏输出 + 上拉电阻实现线与逻辑,支持多设备仲裁

2.2 SCL与SDA信号时序

I2C数据传输以SCL为同步时钟,SDA在SCL低电平时变化,在SCL高电平时被采样。以下是基本信号单元:

信号单元 SDA状态 SCL状态 说明
起始条件(S) 高→低 高 SCL高电平时SDA下降沿
停止条件(P) 低→高 高 SCL高电平时SDA上升沿
数据位传输 稳定 高 SCL高电平时SDA数据有效
应答位(ACK) 低 高 接收方在第9个SCL周期拉低SDA
非应答位(NACK) 高 高 接收方在第9个SCL周期释放SDA
驱动开发提示: S32K3的I2C模块在硬件上自动处理起始/停止条件与应答位生成。软件只需配置从设备地址、数据缓冲区及传输方向。但理解时序有助于调试SCL/SDA波形异常。
I2C起始与停止条件时序图 SCL SDA S P 起始条件:SCL高时SDA下降沿;停止条件:SCL高时SDA上升沿

2.3 7位地址与10位地址

I2C使用两种地址格式:

特性 7位地址 10位地址
地址范围 0x00 ~ 0x7F(128个,保留16个) 0x000 ~ 0x3FF(1024个)
首字节格式 高7位地址 + R/W位 11110xx + R/W位(xx为地址高2位)
传输字节数 1字节地址 + 数据 2字节地址 + 数据
兼容性 所有设备支持 需从设备支持10位地址模式
S32K3支持 是 是(需配置地址格式寄存器)

在7位地址模式下,主设备发送的第一个字节包含7位从设备地址和1位读写标志(R/W)。R/W=0表示写操作,R/W=1表示读操作。10位地址模式通过首字节的前5位“11110”标识,后2位为地址高2位,第二个字节为地址低8位。

常见陷阱: 许多传感器数据手册给出的地址是8位格式(左移1位),而S32K3的I2C模块寄存器要求填入7位原始地址。例如,设备地址0x48(7位)在8位写格式中为0x90。务必确认驱动配置使用的是7位还是8位格式。
7位地址与10位地址帧结构对比 7位地址帧结构 S 7位地址 (A6:A0) R/W ACK 数据字节 P 10位地址帧结构 S 11110 + A9:A8 R/W ACK A7:A0 ACK P 10位地址首字节高5位固定为11110,后2位为地址高2位;第二字节为地址低8位 S32K3通过I2C_CFG寄存器中的ADDR10位选择7位或10位地址模式

2.4 主从模式与数据传输流程

I2C总线上的设备分为主设备(Master)和从设备(Slave)。S32K3的I2C模块可配置为主模式或从模式。

  • 主模式(Master Mode):产生SCL时钟、发起起始条件、发送从设备地址、控制数据传输方向、产生停止条件。
  • 从模式(Slave Mode):监听总线、响应自身地址、接收或发送数据、产生应答位。

一次完整的I2C主写传输流程如下:

  1. 主设备发送起始条件(S)。
  2. 主设备发送7位从设备地址 + 写标志(R/W=0)。
  3. 从设备应答ACK。
  4. 主设备发送数据字节,每字节后从设备应答ACK。
  5. 主设备发送停止条件(P)。
S32K3驱动配置要点: 主模式下需设置I2C_FREQ_DIV寄存器配置SCL频率;从模式下需设置I2C_OWN_ADDR寄存器配置本地从设备地址。多主模式需处理总线仲裁与时钟同步。
I2C主写传输流程图 主设备发起起始条件 发送7位地址 + R/W=0 从设备应答ACK 主设备发送数据字节 主设备发起停止条件

2.5 总线仲裁与时钟同步

I2C支持多主设备同时操作。当多个主设备同时尝试控制总线时,通过SDA线的线与逻辑进行仲裁:

  • 如果某个主设备输出高电平但检测到SDA为低电平,则该设备失去仲裁并退出传输。
  • 失去仲裁的设备必须释放SDA和SCL线,并在总线空闲后重新尝试。

时钟同步通过SCL线的线与逻辑实现:多个主设备中,SCL低电平时间最长的设备决定SCL低电平周期,SCL高电平时间最短的设备决定SCL高电平周期,最终形成同步时钟。

S32K3多主模式: 启用I2C_MCR寄存器中的MEN位后,模块自动处理仲裁丢失中断(ARBLOST)。驱动开发时需注册仲裁丢失中断服务函数,并在中断中重置状态机。
I2C总线仲裁示意图 主设备1 SDA输出 主设备2 SDA输出 总线SDA实际 仲裁点:主设备2输出高但总线为低,失去仲裁

2.6 S32K3 I2C模块寄存器概览

S32K3的I2C模块基于LPI2C(Low Power I2C)设计,关键寄存器如下:

寄存器 功能 配置要点
I2C_MCR 模块控制寄存器 使能模块(MEN)、复位(RST)、调试模式
I2C_MSR 模块状态寄存器 总线忙(BBF)、仲裁丢失(ALF)、错误标志
I2C_MIER 中断使能寄存器 发送完成、接收完成、仲裁丢失中断使能
I2C_MDR 数据寄存器 发送/接收数据缓冲区
I2C_MCFGR1 配置寄存器1 主机请求使能、自动停止条件、引脚配置
I2C_MCFGR2 配置寄存器2 总线空闲时间、滤波宽度、时钟分频
I2C_MCCR0 时钟配置寄存器0 SCL高/低电平周期、数据保持时间
驱动开发最佳实践: 初始化I2C时,先配置I2C_MCCR0设置SCL频率,再配置I2C_MCFGR2设置滤波与空闲时间,最后使能I2C_MCR中的MEN位。中断服务程序中优先读取I2C_MSR清除状态标志。