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),具体需根据总线电容和速率计算。
| 参数 | 标准模式 | 快速模式 | 快速+模式 |
|---|---|---|---|
| 最大时钟频率 | 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 |
1.2 主从设备通信机制
I2C总线上的通信遵循主从架构。主设备(Master)负责产生时钟信号、发起通信、发送从设备地址并控制数据传输方向。从设备(Slave)只能响应主设备的请求,不能主动发起传输。
每个I2C从设备都有一个唯一的7位或10位地址。在QNX驱动开发中,最常见的为7位地址模式。地址由设备制造商分配或通过硬件引脚配置,驱动开发者需要根据硬件原理图和数据手册确认正确的从设备地址。
地址冲突排查要点: 同一I2C总线上不允许出现两个地址相同的从设备。在调试阶段,如果总线挂死或通信无响应,应首先使用I2C扫描工具(如QNX下的i2c-tools或自定义扫描代码)确认总线上所有设备的应答情况。
| 特性 | 7位地址 | 10位地址 |
|---|---|---|
| 地址范围 | 0x00 ~ 0x7F(保留地址除外) | 0x000 ~ 0x3FF |
| 总线设备数量上限 | 112(理论) | 1024(理论) |
| 首字节格式 | 7位地址 + R/W位 | 11110xx + R/W位(前导码) |
| 常见应用场景 | EEPROM、传感器、RTC | 视频解码器、复杂PMIC |
| QNX驱动支持 | 完全支持,默认模式 | 需额外配置地址模式标志 |
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) | 改变方向或切换从设备 |
QNX驱动开发提示: 在编写I2C从设备驱动时,起始条件和停止条件通常由I2C控制器硬件自动管理,驱动开发者只需通过寄存器配置传输方向和长度。但在调试阶段,如果使用GPIO模拟I2C(Bit-banging),则必须严格按照时序要求手动控制SCL和SDA的电平变化顺序,此时起始条件和停止条件的时序精度直接影响通信可靠性。