1. I2C协议基础回顾

I2C(Inter-Integrated Circuit)总线由Philips(现NXP)在1980年代推出,是一种同步、多主从、串行通信总线。在嵌入式系统中,I2C广泛用于连接传感器、EEPROM、RTC、ADC/DAC等低速外设。理解其物理层特性和通信机制,是后续进行从设备地址适配与驱动移植调试的前提。

1.1 I2C总线物理层特性

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

  • SCL(Serial Clock):串行时钟线,由主设备驱动,用于同步数据传输。
  • SDA(Serial Data):串行数据线,用于在主从设备之间双向传输地址和数据。

两条线均通过上拉电阻连接到电源电压(VDD)。当总线空闲时,SCL和SDA都处于高电平状态。设备输出采用开漏(Open-Drain)或开集电极(Open-Collector)结构,支持线与(Wired-AND)逻辑,这是多设备仲裁的基础。

关键参数速查: 标准模式(100 kbit/s)、快速模式(400 kbit/s)、快速+模式(1 Mbit/s)、高速模式(3.4 Mbit/s)。上拉电阻典型值:4.7 kΩ(100 kHz)、2.2 kΩ(400 kHz),具体需根据总线电容和速率计算。
I2C总线物理层核心参数
参数 标准模式 快速模式 快速+模式
最大时钟频率 100 kHz 400 kHz 1 MHz
最大总线电容 400 pF 400 pF 550 pF
输出下降时间 ≤ 300 ns ≤ 300 ns ≤ 120 ns
输入噪声容限 0.1 × VDD 0.1 × VDD 0.1 × VDD
I2C总线物理连接拓扑 主设备 (Master) 从设备1 (Slave 0x50) 从设备2 (Slave 0x51) 从设备3 (Slave 0x52) Rp Rp SDA (串行数据线) SCL (串行时钟线) VDD VDD 所有设备通过开漏输出连接到SDA和SCL,总线空闲时两条线均为高电平

1.2 主从设备通信机制

I2C总线上的通信遵循主从架构。主设备(Master)负责产生时钟信号、发起通信、发送从设备地址并控制数据传输方向。从设备(Slave)只能响应主设备的请求,不能主动发起传输。

每个I2C从设备都有一个唯一的7位或10位地址。在QNX驱动开发中,最常见的为7位地址模式。地址由设备制造商分配或通过硬件引脚配置,驱动开发者需要根据硬件原理图和数据手册确认正确的从设备地址。

地址冲突排查要点: 同一I2C总线上不允许出现两个地址相同的从设备。在调试阶段,如果总线挂死或通信无响应,应首先使用I2C扫描工具(如QNX下的i2c-tools或自定义扫描代码)确认总线上所有设备的应答情况。
7位地址与10位地址对比
特性 7位地址 10位地址
地址范围 0x00 ~ 0x7F(保留地址除外) 0x000 ~ 0x3FF
总线设备数量上限 112(理论) 1024(理论)
首字节格式 7位地址 + R/W位 11110xx + R/W位(前导码)
常见应用场景 EEPROM、传感器、RTC 视频解码器、复杂PMIC
QNX驱动支持 完全支持,默认模式 需额外配置地址模式标志
I2C主从通信角色与数据流向 主设备 产生SCL时钟 从设备 响应地址匹配 SDA 数据双向传输 SCL 时钟由主设备产生 → 写操作 读操作 主设备通过发送从设备地址 + R/W位(0=写,1=读)来指定通信对象和方向 从设备在地址匹配后产生ACK应答,否则总线进入NACK状态

1.3 起始条件与停止条件

I2C总线上所有数据传输都由起始条件(START)和停止条件(STOP)界定。这两个条件是唯一允许SDA在SCL为高电平时发生变化的时刻,其他所有数据位传输都要求SDA在SCL低电平时变化,在SCL高电平时被采样。

  • 起始条件(S):SCL为高电平时,SDA从高电平切换到低电平。表示总线从空闲状态进入活跃状态,主设备开始一次新的传输。
  • 停止条件(P):SCL为高电平时,SDA从低电平切换到高电平。表示本次传输结束,总线恢复空闲状态。
  • 重复起始条件(Sr):在一次传输过程中,不产生停止条件而直接再次产生起始条件。用于改变数据传输方向(如从写地址切换到读数据),避免总线释放后被其他主设备抢占。
调试陷阱: 在QNX I2C驱动移植中,起始条件和停止条件的时序由I2C控制器硬件自动产生,但部分SoC的I2C控制器在时钟延展(Clock Stretching)场景下可能出现START/STOP时序异常。如果从设备支持时钟延展,务必确认控制器驱动中是否启用了对应的超时处理机制,否则可能导致总线死锁。
起始条件与停止条件对比
条件类型 SCL状态 SDA变化方向 触发时机 典型用途
起始条件(S) 高电平 高 → 低 总线空闲时 开始一次新的传输
停止条件(P) 高电平 低 → 高 数据传输完成后 结束传输,释放总线
重复起始(Sr) 高电平 高 → 低 传输过程中(无P) 改变方向或切换从设备
I2C起始条件与停止条件时序波形 SCL SDA S P 地址 + R/W 数据字节 起始条件:SCL=H时,SDA由H→L;停止条件:SCL=H时,SDA由L→H 数据位在SCL低电平时变化,高电平时采样;每字节后跟一个ACK/NACK位
QNX驱动开发提示: 在编写I2C从设备驱动时,起始条件和停止条件通常由I2C控制器硬件自动管理,驱动开发者只需通过寄存器配置传输方向和长度。但在调试阶段,如果使用GPIO模拟I2C(Bit-banging),则必须严格按照时序要求手动控制SCL和SDA的电平变化顺序,此时起始条件和停止条件的时序精度直接影响通信可靠性。