1. I2C总线协议基础:物理层特性与信号时序
I2C(Inter-Integrated Circuit)总线是一种由Philips(现NXP)开发的同步、多主从、串行通信总线。在嵌入式Linux驱动开发中,理解I2C的物理层特性和信号时序是进行控制器适配与中断绑定的前提。本节将系统梳理I2C总线的物理层构成、SCL/SCL信号时序规范以及起始/停止条件的电气与逻辑定义。
1.1 I2C物理层特性
I2C总线仅使用两条双向开漏信号线:串行时钟线(SCL)和串行数据线(SDA),配合上拉电阻实现通信。其物理层核心特性如下表所示:
| 特性 | 标准模式 (Standard) | 快速模式 (Fast) | 高速模式 (High-Speed) |
|---|---|---|---|
| 最大时钟频率 | 100 kHz | 400 kHz | 3.4 MHz |
| 总线电容负载 | ≤ 400 pF | ≤ 400 pF | ≤ 100 pF |
| 上拉电阻典型值 | 4.7 kΩ – 10 kΩ | 1.5 kΩ – 4.7 kΩ | 0.5 kΩ – 1.5 kΩ |
| 逻辑低电平 (VIL) | ≤ 0.3 × VDD | ≤ 0.3 × VDD | ≤ 0.3 × VDD |
| 逻辑高电平 (VIH) | ≥ 0.7 × VDD | ≥ 0.7 × VDD | ≥ 0.7 × VDD |
| 最大从设备数量 | 127 (7位地址) | 127 (7位地址) | 127 (7位地址) |
I2C总线的开漏结构决定了其“线与”特性:任何设备都可以将SCL或SDA拉低,而高电平由外部上拉电阻提供。这种结构支持多主设备仲裁和时钟拉伸(Clock Stretching),是驱动中中断处理逻辑必须考虑的关键机制。
1.2 SCL/SDA信号时序规范
I2C通信的每个数据位都在SCL时钟脉冲的配合下在SDA线上传输。数据在SCL高电平期间必须保持稳定,在SCL低电平期间允许变化。以下是标准模式下的关键时序参数:
- tHIGH:SCL高电平最小保持时间,标准模式为4.0 μs。
- tLOW:SCL低电平最小保持时间,标准模式为4.7 μs。
- tSU;DAT:SDA数据建立时间,标准模式最小为250 ns。
- tHD;DAT:SDA数据保持时间,标准模式最小为0 ns(但需保证SCL下降沿后SDA有效)。
- tr:SCL/SDA上升时间,标准模式最大为1000 ns。
- tf:SCL/SDA下降时间,标准模式最大为300 ns。
下图展示了I2C总线上一帧数据字节传输的完整时序结构,包含SCL时钟脉冲与SDA数据变化的关系:
1.3 起始条件与停止条件
I2C总线上所有通信事务都以起始条件(START Condition)开始,以停止条件(STOP Condition)结束。这两个条件是总线状态转换的边界,也是控制器中断触发的重要事件源。
起始条件(S)
当SCL为高电平时,SDA从高电平切换到低电平,表示总线从空闲状态进入活动状态。起始条件由主设备产生,之后总线被主设备占用,直到停止条件出现。
停止条件(P)
当SCL为高电平时,SDA从低电平切换到高电平,表示当前传输结束,总线释放为空闲状态。停止条件同样由主设备产生。
下图展示了起始条件与停止条件的电气波形定义:
1.4 完整数据传输流程
一个完整的I2C数据传输事务遵循以下步骤序列,这些步骤直接对应控制器驱动中的状态机设计和中断处理流程:
- 主设备发送起始条件(S):总线从空闲进入活动状态。
- 主设备发送7位从设备地址:高位在前,SCL每个时钟脉冲传输1位。
- 主设备发送读/写位(R/W):0表示写,1表示读。
- 从设备发送应答位(ACK):从设备在第9个SCL周期将SDA拉低表示应答。
- 数据传输阶段:每字节8位数据后跟1位应答位,重复进行。
- 主设备发送停止条件(P):总线释放回空闲状态。
下表总结了起始/停止条件与控制器中断的典型关联:
| 总线事件 | 电气条件 | 典型中断标志 | 驱动处理动作 |
|---|---|---|---|
| 起始条件 (S) | SCL高,SDA下降沿 | START_DET | 清除标志,初始化传输状态机 |
| 停止条件 (P) | SCL高,SDA上升沿 | STOP_DET | 清除标志,触发传输完成回调 |
| 应答 (ACK) | 第9个SCL周期SDA为低 | ACK_RECV | 继续下一字节或发送停止条件 |
| 非应答 (NACK) | 第9个SCL周期SDA为高 | NACK_RECV | 发送停止条件,报告错误 |
掌握I2C物理层特性和信号时序,是后续进行控制器寄存器配置、中断向量绑定以及DMA传输优化的基础。在下一节中,我们将基于这些基础知识,深入I2C控制器硬件模块的内部架构与寄存器映射。