4、RK平台I2C控制器概述:RK芯片I2C控制器特性、I2C时钟配置、传输速率模式

在Sensor驱动开发中,I2C总线是连接主控与Sensor芯片的核心物理通道。RK平台集成了高性能的I2C控制器,理解其硬件特性、时钟树结构以及速率模式,是正确配置设备树和编写驱动的基础。本章将深入剖析RK芯片I2C控制器的内部架构与关键配置参数。

4.1 RK芯片I2C控制器核心特性

RK平台的I2C控制器是一个功能完备的同步串行通信接口,支持主从模式,并具备以下关键特性:

  • 多主机总线支持:支持多主机环境下的总线仲裁与时钟同步。
  • 标准与快速模式:兼容100kHz标准模式(SM)和400kHz快速模式(FM)。
  • 高速模式:部分RK芯片(如RK3588、RK3568)支持3.4MHz高速模式(HS-Mode),适用于高带宽Sensor。
  • 7位与10位地址:支持7位和10位设备地址寻址,满足不同Sensor的地址需求。
  • 内置数字滤波器:可配置的数字滤波器用于抑制总线上的毛刺噪声,提高通信稳定性。
  • DMA支持:支持与DMA控制器联动,实现大数据量的无CPU干预传输,降低系统负载。
  • 中断与轮询:支持中断驱动和轮询两种传输完成检测方式。
开发提示: 在RK平台设备树中,I2C控制器通常以 i2c@ff3c0000 的形式出现。驱动开发时,需重点关注 clock-frequency 属性,该属性直接决定了I2C总线的传输速率。
RK I2C控制器内部架构图 RK I2C控制器内部架构图 I2C控制器核心 时钟门控与复位 APB总线接口 SCL/SDA引脚 中断控制器 DMA引擎 说明:控制器核心通过APB总线与CPU交互,通过DMA引擎实现高速数据传输,最终通过SCL/SDA引脚与外部Sensor通信。

4.2 I2C时钟配置与时钟树

I2C总线的时钟频率并非随意设定,它源自RK芯片复杂的时钟树结构。正确配置时钟是确保I2C工作在目标速率的前提。

4.2.1 时钟源与分频链路

RK平台I2C控制器的时钟通常来源于以下几个路径:

  1. PLL输出:如 PLL_GPLL 或 PLL_CPLL 产生高频时钟。
  2. 时钟门控:通过 CLK_GATE 控制时钟的开启与关闭,降低功耗。
  3. 分频器:I2C控制器内部包含一个可编程分频器,将输入时钟分频以产生SCL时钟。

时钟频率的计算公式如下:

SCL频率 = I2C输入时钟频率 / ( (CLKDIV_LOW + 1) + (CLKDIV_HIGH + 1) + 3 )
其中:
- CLKDIV_LOW: SCL低电平周期计数值
- CLKDIV_HIGH: SCL高电平周期计数值
- 3: 代表内部同步与延迟开销
关键寄存器: 在RK的I2C控制器中,时钟分频由 IC_CON 和 IC_FS_SCL_HCNT/IC_FS_SCL_LCNT 寄存器控制。驱动中通常通过 clk_set_rate() 设置输入时钟,然后由控制器硬件自动计算分频值。

4.2.2 设备树时钟配置示例

在设备树中,I2C控制器的时钟配置通常如下所示:

&i2c4 {
    status = "okay";
    clock-frequency = <400000>;  /* 目标速率:400kHz */
    pinctrl-names = "default";
    pinctrl-0 = <&i2c4m0_xfer>;

    /* 时钟源配置 */
    clocks = <&cru CLK_I2C4>, <&cru PCLK_I2C4>;
    clock-names = "i2c", "pclk";

    /* Sensor设备节点 */
    sensor@48 {
        compatible = "vendor,sensor";
        reg = <0x48>;
    };
};

其中 clock-frequency 属性直接指定了总线速率,驱动会根据该值自动计算分频系数。

I2C时钟树与分频链路 I2C时钟树与分频链路 PLL (GPLL/CPLL) 时钟门控 (CLK_GATE) 可编程分频器 SCL输出 分频计算示例 (目标400kHz): 假设输入时钟 = 100MHz SCL周期 = 1/400kHz = 2500ns 内部时钟周期 = 1/100MHz = 10ns 总计数值 = 2500/10 = 250 分配: CLKDIV_LOW=125, CLKDIV_HIGH=122 (考虑3个时钟开销)

4.3 传输速率模式详解

RK平台I2C控制器支持多种传输速率模式,不同模式对应不同的时序参数和适用场景。下表列出了主要速率模式及其关键区别:

速率模式 最大频率 SCL高/低电平最小时间 适用场景 RK芯片支持情况
标准模式 (SM) 100 kHz 4.0 μs / 4.7 μs 低速Sensor(如温度、湿度) 全系列支持
快速模式 (FM) 400 kHz 0.6 μs / 1.3 μs 常用Sensor(如加速度计、陀螺仪) 全系列支持
快速模式+ (FM+) 1 MHz 0.26 μs / 0.5 μs 高带宽Sensor(如摄像头、指纹) RK3588、RK3568等
高速模式 (HS-Mode) 3.4 MHz 0.16 μs / 0.16 μs 超高速数据传输(如图像传感器) RK3588、RK3399等
速率选择注意事项:
  • 并非所有Sensor都支持高速模式,需查阅Sensor数据手册确认其最大支持速率。
  • 高速模式下,总线电容和上拉电阻的选择至关重要,过大的总线电容会导致信号畸变。
  • 在RK平台设备树中,若设置 clock-frequency = <3400000>,需确保硬件设计支持HS-Mode,且控制器时钟源频率足够高。

4.3.1 速率模式与寄存器配置映射

RK I2C控制器通过 IC_CON 寄存器的 SPEED 位域来选择速率模式。不同模式对应不同的时序寄存器组:

  • 标准/快速模式:使用 IC_FS_SCL_HCNT 和 IC_FS_SCL_LCNT 寄存器。
  • 高速模式:使用 IC_HS_SCL_HCNT 和 IC_HS_SCL_LCNT 寄存器。

驱动初始化时,会根据设备树中的 clock-frequency 自动选择对应的时序寄存器组并计算分频值。

速率模式选择流程 速率模式选择流程 读取clock-frequency 频率 >= 1MHz? 配置HS-Mode寄存器 配置FS-Mode寄存器 I2C控制器初始化完成

4.4 实际开发中的时钟配置要点

在Sensor驱动开发过程中,I2C时钟配置是调试的常见难点。以下是几个关键检查点:

  • 确认时钟源频率:通过 clk_get_rate() 获取I2C控制器的输入时钟频率,确保其足够高以支持目标速率。
  • 检查分频系数:在驱动中打印或计算实际分频值,验证其是否在合理范围内(通常为0~65535)。
  • 使用逻辑分析仪:测量SCL引脚的实际波形,确认频率是否与配置一致,并检查占空比是否接近50%。
  • 考虑总线负载:当总线上挂载多个Sensor时,总线电容增加,可能需要降低速率或调整上拉电阻。
调试命令: 在RK平台Linux系统中,可以使用 i2cget、i2cset 和 i2cdetect 工具快速验证I2C总线是否正常工作。例如:i2cdetect -y 4 用于扫描i2c-4总线上的设备。