1. I2C 总线基础
1.1 I2C 总线物理层特性
I2C(Inter-Integrated Circuit)总线是由 Philips 公司(现 NXP)开发的一种同步、多主从、串行通信总线。在 RK 平台 Sensor 驱动开发中,I2C 是连接主控 SoC 与 Sensor 芯片最常用的物理层接口。其物理层核心特性如下:
| 特性 | 说明 | 典型值 / 范围 |
|---|---|---|
| 总线类型 | 两线式串行总线(SDA + SCL) | 双向半双工 |
| 信号电平 | 开漏(Open-Drain)输出,需外部上拉电阻 | 1.8V / 3.3V / 5V |
| 上拉电阻 | 决定上升时间与总线电容 | 1kΩ ~ 10kΩ(取决于总线电容) |
| 最大总线电容 | 限制从设备数量与传输距离 | 400pF(标准模式) |
| 传输速率 | 标准模式 / 快速模式 / 高速模式 | 100kHz / 400kHz / 3.4MHz |
| 从设备数量 | 受限于 7 位或 10 位地址空间 | 最多 127 个(7 位地址) |
RK 平台实战要点:RK3568 / RK3588 的 I2C 控制器通常支持 100kHz 和 400kHz 两种模式。Sensor 驱动中,上拉电阻的选型直接影响信号完整性——电阻过小导致功耗增加,过大则上升沿变缓,易在高速模式下产生通信错误。
1.2 SDA 与 SCL 信号详解
I2C 总线的两根信号线——SDA(Serial Data Line)和 SCL(Serial Clock Line)——承担着不同的职责:
- SCL(时钟线):由主设备驱动,提供同步时钟信号。每个时钟脉冲传输 1 位数据。
- SDA(数据线):双向数据线,用于传输地址、读写标志、寄存器地址和数据。
信号时序的关键规则:
- 起始条件(START):SCL 为高电平时,SDA 从高电平切换到低电平。
- 停止条件(STOP):SCL 为高电平时,SDA 从低电平切换到高电平。
- 数据有效性:SCL 高电平时 SDA 必须保持稳定;SCL 低电平时 SDA 允许变化。
- 应答位(ACK):每传输 8 位数据后,接收方在第 9 个 SCL 脉冲将 SDA 拉低表示应答。
驱动开发提示:在 RK 平台 Sensor 驱动中,起始条件和停止条件由 I2C 控制器硬件自动生成,驱动开发者只需配置寄存器地址和读写标志。但理解其时序对调试异常通信至关重要。
1.3 I2C 总线拓扑结构
I2C 总线采用多主从总线拓扑,所有设备通过 SDA 和 SCL 两条线并联连接。在 RK 平台 Sensor 驱动场景中,最常见的拓扑是单主多从结构:RK SoC 作为唯一主设备,多个 Sensor 芯片作为从设备。
拓扑结构的关键特征:
- 总线仲裁:多主设备同时发送时,通过 SDA 线的线与逻辑进行仲裁,低电平优先。
- 从设备地址:每个从设备拥有唯一的 7 位或 10 位地址,主设备通过地址选择通信对象。
- 上拉电阻位置:上拉电阻通常放置在总线两端,靠近主设备或均匀分布。
- 总线长度:受限于总线电容,标准模式下通常不超过 1 米。
RK 平台布线警告:在 RK3568 / RK3588 的硬件设计中,Sensor 的 I2C 总线布线应避免长距离平行于高频信号线(如 DDR、MIPI)。总线电容超过 400pF 时,需降低传输速率或增加上拉电阻驱动能力,否则会导致通信丢包或地址无应答。
1.4 I2C 总线通信流程
一次完整的 I2C 通信流程包含以下步骤:
| 步骤 | 操作 | 总线状态 |
|---|---|---|
| 1 | 主设备发送起始条件 | SDA 下降沿,SCL 高电平 |
| 2 | 主设备发送 7 位从设备地址 + R/W 位 | SDA 传输 8 位数据 |
| 3 | 从设备发送应答位(ACK) | SDA 被从设备拉低 |
| 4 | 主设备发送寄存器地址(8 位或 16 位) | SDA 传输数据 |
| 5 | 从设备发送应答位(ACK) | SDA 被从设备拉低 |
| 6 | 主设备发送停止条件(写操作结束)或重复起始条件(读操作) | SDA 上升沿,SCL 高电平 |
RK 平台驱动映射:在 Linux 内核 I2C 子系统框架下,上述流程被封装为
i2c_master_send() 和 i2c_master_recv() 等 API。驱动开发者无需手动操作 SDA/SCL 时序,但需要正确配置 struct i2c_msg 中的 addr、flags、len 和 buf 字段。
1.5 RK 平台 I2C 控制器特性
RK 平台(RK3568 / RK3588 / RK3399 等)集成了多个 I2C 控制器,每个控制器对应一条独立的 I2C 总线。以下是 RK 平台 I2C 控制器的关键特性:
- 多控制器支持:RK3568 提供 6 个 I2C 控制器,RK3588 提供 9 个,可同时连接多组 Sensor。
- 时钟源:I2C 控制器时钟来自 PCLK,通过寄存器配置分频系数得到 SCL 频率。
- 中断模式:支持轮询(Polling)和中断(Interrupt)两种传输模式,驱动中通常使用中断模式以提高 CPU 利用率。
- DMA 支持:部分控制器支持 DMA 传输,适用于大数据量 Sensor(如摄像头)的寄存器批量读写。
驱动开发建议:在 RK 平台设备树中,每个 I2C 控制器对应一个节点,Sensor 作为子节点挂载在对应总线下。通过
reg 属性指定 Sensor 的 I2C 从设备地址,驱动通过 of_i2c 接口获取设备信息。
1.6 常见问题与调试方法
在 RK 平台 Sensor 驱动开发中,I2C 总线相关的常见问题及调试方法如下:
| 问题现象 | 可能原因 | 调试方法 |
|---|---|---|
| I2C 地址无应答(NACK) | 从设备地址错误、设备未上电、总线冲突 | 使用 i2cdetect 扫描总线,确认设备地址 |
| 数据传输丢包 | 上拉电阻过大、总线电容过高、时钟频率不匹配 | 降低 SCL 频率至 100kHz 测试,检查示波器波形 |
| 总线挂死(SDA 被拉低) | 从设备异常、未发送停止条件、中断冲突 | 连续发送 9 个 SCL 脉冲复位从设备状态机 |
| 驱动 probe 失败 | 设备树 reg 属性错误、pinctrl 配置缺失 | 检查 /sys/kernel/debug/gpio 确认引脚复用 |
调试工具推荐:在 RK 平台中,
i2c-tools 工具集(i2cdetect、i2cget、i2cset、i2cdump)是调试 I2C 总线最直接的手段。建议在开发阶段将 Sensor 挂载在空闲总线上,避免与其他高速外设共享总线导致干扰。