2. Sensor驱动初始化失败:I2C通信异常、Sensor ID读取错误、上电时序配置错误、MCLK时钟频率不匹配

Sensor驱动初始化失败,这应该是大家入行RK平台Camera调试时,遇到的第一个拦路虎。我刚开始带项目那会儿,光一个I2C不通的问题就折腾了两天。后来发现,其实大部分初始化失败的原因就那么几个——I2C通信异常、Sensor ID读不对、上电时序没配好、MCLK时钟频率不匹配。咱们一个一个拆开说。

核心结论:Sensor初始化失败,90%的问题出在硬件时序和I2C通信上。先排除硬件,再查软件,别一上来就改驱动代码。

2.1 I2C通信异常——最常见,也最容易排查

I2C通信异常的表现很直接:驱动里读Sensor ID,返回0xFF或者0x00。说白了,就是主控和Sensor没对上话。

我个人的排查习惯是这样的:

  1. 先量波形。用示波器抓SCL和SDA,看有没有正常的ACK信号。如果SDA一直拉低,说明Sensor没应答——要么地址错了,要么Sensor没工作。
  2. 核对I2C地址。RK平台的I2C地址通常是7位,但Sensor datasheet里给的可能是8位地址。记得左移一位。我在项目中遇到过好几次,工程师直接把datasheet里的0x30写进驱动,结果怎么都读不到ID——其实7位地址是0x18。
  3. 检查I2C速率。RK默认I2C速率一般是100KHz或400KHz。有些老Sensor只支持100KHz,你设成400KHz它就不理你。我建议先降到100KHz调通再说。

小技巧:在RK平台上,可以用i2cget命令直接读Sensor寄存器,验证I2C通路是否正常。比如:i2cget -y 0 0x18 0x0f。如果返回0xFF,基本可以断定硬件有问题。

2.2 Sensor ID读取错误——别急着怀疑驱动

ID读不对,很多人第一反应是驱动写错了。其实不然。我总结了几种常见情况:

现象 可能原因 排查方向
读回0xFF I2C不通、Sensor未上电 先查硬件供电和I2C波形
读回0x00 Sensor处于复位状态 检查复位引脚电平、上电时序
读回固定值但不对 寄存器地址或数据位宽错误 核对datasheet,确认是8位还是16位寄存器
有时对有时错 电源纹波大、时钟不稳定 用示波器看MCLK和电源纹波

举个例子:我之前调一个GC系列Sensor,ID寄存器是0x0F,但datasheet里写的是0x0F,驱动里也配的0x0F,读回来就是0x00。折腾了半天,发现这个Sensor的ID寄存器其实是16位的,需要连续读两个字节。嗯,这种坑,不看datasheet细节根本想不到。

注意:有些Sensor的ID寄存器在特定模式下才能读取。比如需要先退出待机模式,或者需要先写一个解锁寄存器。别光盯着ID读,看看datasheet里有没有前置操作要求。

2.3 上电时序配置错误——RK平台最容易忽略的点

上电时序,说白了就是Sensor的各个电源引脚和复位引脚,谁先谁后、间隔多久。RK平台的PMIC和GPIO控制能力很强,但配置起来也容易出错。

典型的Sensor上电时序要求:

  • AVDD(模拟供电)先上
  • DVDD(数字供电)后上
  • IOVDD(IO供电)最后上
  • 复位引脚在电源稳定后拉高
  • MCLK在复位释放后提供

我曾经遇到一个项目,Sensor在RK3588上死活初始化不了。用示波器一看,AVDD和DVDD几乎是同时起来的,间隔不到1ms。而Sensor datasheet要求至少5ms的间隔。后来在dts里加了powerdown-gpios的延时配置,问题就解决了。

RK平台的上电时序配置,一般在dts里这样写:

// 以OV5645为例
&i2c2 {
    status = "okay";
    ov5645: ov5645@3c {
        compatible = "ovti,ov5645";
        reg = <0x3c>;
        pinctrl-names = "default";
        pinctrl-0 = <&cif_clk_out>;
        clocks = <&cru CLK_CIF_OUT>;
        clock-names = "xvclk";
        avdd-supply = <&vcc_avdd>;
        dvdd-supply = <&vcc_dvdd>;
        iovdd-supply = <&vcc_iovdd>;
        powerdown-gpios = <&gpio2 RK_PB5 GPIO_ACTIVE_LOW>;
        reset-gpios = <&gpio2 RK_PB6 GPIO_ACTIVE_LOW>;
        rockchip,camera-module-index = <0>;
        rockchip,camera-module-facing = "back";
    };
};

我的建议:在dts里配完上电时序后,用示波器抓一下每个电源轨的上升沿和复位引脚的时序,跟datasheet里的时序图逐项比对。别偷懒,这一步能省你后面三天的时间。

2.4 MCLK时钟频率不匹配——频率不对,Sensor就不干活

MCLK是Sensor的主时钟,频率必须严格匹配datasheet的要求。RK平台通常用24MHz或27MHz的晶振,但有些Sensor要求12MHz、13.5MHz甚至48MHz。

MCLK频率不对的典型表现:

  • Sensor ID能读到,但输出图像花屏或黑屏
  • Sensor初始化过程中卡在某一步
  • 帧率不稳定,时快时慢

我记得有一次调一个索尼的Sensor,datasheet里写MCLK支持24MHz和27MHz,我用了24MHz,结果图像一直有横纹。后来仔细看datasheet,发现它内部PLL对24MHz的支持有bug,推荐用27MHz。换了晶振之后,问题立刻消失。

RK平台MCLK配置检查点:

  1. 确认dts里clocks属性配置的时钟源是否正确
  2. 用clk_summary查看实际输出的MCLK频率
  3. 用示波器测量Sensor端的MCLK引脚,看波形是否干净、频率是否准确
  4. 检查Sensor内部PLL配置,确保MCLK在Sensor支持的范围内

经验之谈:MCLK的波形质量比频率准确度更重要。如果MCLK波形有毛刺或占空比不对,Sensor内部PLL锁不住,图像就会出问题。我建议MCLK走线尽量短,远离电源和高速信号线。

2.5 知识体系总览

下面这张图,是我自己总结的Sensor初始化失败排查流程。每次遇到问题,我就按这个顺序走一遍,基本都能定位到根因。

Sensor初始化失败排查流程 Sensor初始化失败 ① I2C通信检查(波形/地址/速率) ② Sensor ID读取验证 ③ 上电时序检查(示波器抓波形) ④ MCLK时钟频率/波形检查 定位根因,解决问题 排查原则:先硬件后软件,先外部后内部 示波器是调试Sensor最重要的工具,没有之一

2.6 避坑指南

最后,分享几个我踩过的坑,希望能帮大家少走弯路:

  • 不要相信datasheet里的所有时序图。有些Sensor的datasheet更新不及时,实际芯片的时序要求可能更严格。我建议以原厂FAE提供的参考代码为准。
  • I2C上拉电阻别忽略。RK平台的I2C总线通常有外部上拉,但有些开发板没焊。如果I2C不通,先量一下SCL和SDA的电平,看是不是被拉低了。
  • MCLK的占空比也很重要。有些Sensor要求MCLK占空比在45%~55%之间。如果RK的时钟输出占空比不对,可以试试调整时钟源的分频系数。
  • 复位引脚的电平极性别搞反。有些Sensor是高电平复位,有些是低电平复位。dts里配反了,Sensor永远处于复位状态,ID当然读不到。

重要提醒:如果你在RK3588/RK3568等新平台上调试Sensor,记得检查dts里rockchip,camera-module-index和rockchip,camera-module-facing的配置。这两个属性会影响ISP的初始化流程,配错了也会导致Sensor初始化失败。