2. I2C协议基础:总线物理层、SCL/SDA信号、7位与10位地址、主从模式
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模块支持标准模式与快速模式。
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波形异常。
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位格式。
2.4 主从模式与数据传输流程
I2C总线上的设备分为主设备(Master)和从设备(Slave)。S32K3的I2C模块可配置为主模式或从模式。
- 主模式(Master Mode):产生SCL时钟、发起起始条件、发送从设备地址、控制数据传输方向、产生停止条件。
- 从模式(Slave Mode):监听总线、响应自身地址、接收或发送数据、产生应答位。
一次完整的I2C主写传输流程如下:
- 主设备发送起始条件(S)。
- 主设备发送7位从设备地址 + 写标志(R/W=0)。
- 从设备应答ACK。
- 主设备发送数据字节,每字节后从设备应答ACK。
- 主设备发送停止条件(P)。
S32K3驱动配置要点: 主模式下需设置I2C_FREQ_DIV寄存器配置SCL频率;从模式下需设置I2C_OWN_ADDR寄存器配置本地从设备地址。多主模式需处理总线仲裁与时钟同步。
2.5 总线仲裁与时钟同步
I2C支持多主设备同时操作。当多个主设备同时尝试控制总线时,通过SDA线的线与逻辑进行仲裁:
- 如果某个主设备输出高电平但检测到SDA为低电平,则该设备失去仲裁并退出传输。
- 失去仲裁的设备必须释放SDA和SCL线,并在总线空闲后重新尝试。
时钟同步通过SCL线的线与逻辑实现:多个主设备中,SCL低电平时间最长的设备决定SCL低电平周期,SCL高电平时间最短的设备决定SCL高电平周期,最终形成同步时钟。
S32K3多主模式: 启用I2C_MCR寄存器中的MEN位后,模块自动处理仲裁丢失中断(ARBLOST)。驱动开发时需注册仲裁丢失中断服务函数,并在中断中重置状态机。
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清除状态标志。