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信号上升沿变缓,引发时序违规,进而导致中断丢失或数据错误。

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。
中断绑定关联: 在Linux I2C控制器驱动中,SCL低电平定时器(tLOW)通常用于实现超时中断检测。当从设备时钟拉伸超过tLOW最大值时,主控制器应触发超时中断并执行恢复流程。

下图展示了I2C总线上一帧数据字节传输的完整时序结构,包含SCL时钟脉冲与SDA数据变化的关系:

I2C单字节数据传输时序图 I2C单字节数据传输时序(标准模式) SCL SDA D7 (MSB) D6 D5 D4 D3 D2 D1 D0 (LSB) tHIGH tLOW 数据在SCL高电平期间必须保持稳定,仅在SCL低电平期间允许变化

1.3 起始条件与停止条件

I2C总线上所有通信事务都以起始条件(START Condition)开始,以停止条件(STOP Condition)结束。这两个条件是总线状态转换的边界,也是控制器中断触发的重要事件源。

起始条件(S)

当SCL为高电平时,SDA从高电平切换到低电平,表示总线从空闲状态进入活动状态。起始条件由主设备产生,之后总线被主设备占用,直到停止条件出现。

停止条件(P)

当SCL为高电平时,SDA从低电平切换到高电平,表示当前传输结束,总线释放为空闲状态。停止条件同样由主设备产生。

驱动开发常见陷阱: 在中断绑定实现中,起始条件和停止条件通常映射为控制器硬件的中断标志位。部分SoC的I2C控制器在检测到起始条件时会触发“总线忙”中断,而停止条件触发“传输完成”中断。如果中断服务程序(ISR)未正确清除这些标志位,会导致后续传输无法启动或产生虚假中断。

下图展示了起始条件与停止条件的电气波形定义:

I2C起始条件与停止条件波形 I2C起始条件与停止条件波形定义 起始条件 (S) SDA↓ 停止条件 (P) SDA↑ SCL SDA 起始条件:SCL高电平时,SDA由高→低 停止条件:SCL高电平时,SDA由低→高 主设备在传输开始前必须发送起始条件,传输结束后必须发送停止条件

1.4 完整数据传输流程

一个完整的I2C数据传输事务遵循以下步骤序列,这些步骤直接对应控制器驱动中的状态机设计和中断处理流程:

  1. 主设备发送起始条件(S):总线从空闲进入活动状态。
  2. 主设备发送7位从设备地址:高位在前,SCL每个时钟脉冲传输1位。
  3. 主设备发送读/写位(R/W):0表示写,1表示读。
  4. 从设备发送应答位(ACK):从设备在第9个SCL周期将SDA拉低表示应答。
  5. 数据传输阶段:每字节8位数据后跟1位应答位,重复进行。
  6. 主设备发送停止条件(P):总线释放回空闲状态。
中断绑定映射: 在Linux I2C控制器驱动中,上述每个步骤都可能对应一个硬件中断事件。例如:地址发送完成后触发“地址完成中断”,收到应答后触发“应答检测中断”,每字节传输完成后触发“字节传输完成中断”。驱动移植时需要根据SoC手册正确配置中断使能寄存器和中断服务函数。

下表总结了起始/停止条件与控制器中断的典型关联:

总线事件 电气条件 典型中断标志 驱动处理动作
起始条件 (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控制器硬件模块的内部架构与寄存器映射。