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(数据线):双向数据线,用于传输地址、读写标志、寄存器地址和数据。

信号时序的关键规则:

  1. 起始条件(START):SCL 为高电平时,SDA 从高电平切换到低电平。
  2. 停止条件(STOP):SCL 为高电平时,SDA 从低电平切换到高电平。
  3. 数据有效性:SCL 高电平时 SDA 必须保持稳定;SCL 低电平时 SDA 允许变化。
  4. 应答位(ACK):每传输 8 位数据后,接收方在第 9 个 SCL 脉冲将 SDA 拉低表示应答。
驱动开发提示:在 RK 平台 Sensor 驱动中,起始条件和停止条件由 I2C 控制器硬件自动生成,驱动开发者只需配置寄存器地址和读写标志。但理解其时序对调试异常通信至关重要。
I2C 起始条件与停止条件时序图 I2C 起始条件与停止条件时序图 SCL SDA 起始条件 SCL高时SDA下降 停止条件 SCL高时SDA上升 数据有效(SCL高时SDA稳定) 数据变化(SCL低时SDA变化)

1.3 I2C 总线拓扑结构

I2C 总线采用多主从总线拓扑,所有设备通过 SDA 和 SCL 两条线并联连接。在 RK 平台 Sensor 驱动场景中,最常见的拓扑是单主多从结构:RK SoC 作为唯一主设备,多个 Sensor 芯片作为从设备。

拓扑结构的关键特征:

  • 总线仲裁:多主设备同时发送时,通过 SDA 线的线与逻辑进行仲裁,低电平优先。
  • 从设备地址:每个从设备拥有唯一的 7 位或 10 位地址,主设备通过地址选择通信对象。
  • 上拉电阻位置:上拉电阻通常放置在总线两端,靠近主设备或均匀分布。
  • 总线长度:受限于总线电容,标准模式下通常不超过 1 米。
RK 平台布线警告:在 RK3568 / RK3588 的硬件设计中,Sensor 的 I2C 总线布线应避免长距离平行于高频信号线(如 DDR、MIPI)。总线电容超过 400pF 时,需降低传输速率或增加上拉电阻驱动能力,否则会导致通信丢包或地址无应答。
I2C 总线拓扑结构图(单主多从) I2C 总线拓扑结构图(单主多从) VDD (3.3V / 1.8V) R1 R2 SDA SCL RK SoC 主设备 (Master) Sensor A 从设备 (0x48) Sensor B 从设备 (0x4A) Sensor C 从设备 (0x6C) 拓扑说明 所有设备共享 SDA/SCL 两条总线 通过唯一从设备地址区分通信对象

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 接口获取设备信息。
RK 平台 I2C 控制器与 Sensor 连接架构图 RK 平台 I2C 控制器与 Sensor 连接架构图 RK SoC I2C 控制器 0 I2C 控制器 1 I2C 控制器 2 ...... I2C0 I2C1 I2C2 Sensor 设备组 Sensor A I2C0 从设备 Sensor B I2C0 从设备 Sensor C I2C1 从设备 Sensor D I2C2 从设备

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 挂载在空闲总线上,避免与其他高速外设共享总线导致干扰。