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没对上话。
我个人的排查习惯是这样的:
- 先量波形。用示波器抓SCL和SDA,看有没有正常的ACK信号。如果SDA一直拉低,说明Sensor没应答——要么地址错了,要么Sensor没工作。
- 核对I2C地址。RK平台的I2C地址通常是7位,但Sensor datasheet里给的可能是8位地址。记得左移一位。我在项目中遇到过好几次,工程师直接把datasheet里的0x30写进驱动,结果怎么都读不到ID——其实7位地址是0x18。
- 检查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配置检查点:
- 确认dts里
clocks属性配置的时钟源是否正确 - 用
clk_summary查看实际输出的MCLK频率 - 用示波器测量Sensor端的MCLK引脚,看波形是否干净、频率是否准确
- 检查Sensor内部PLL配置,确保MCLK在Sensor支持的范围内
经验之谈:MCLK的波形质量比频率准确度更重要。如果MCLK波形有毛刺或占空比不对,Sensor内部PLL锁不住,图像就会出问题。我建议MCLK走线尽量短,远离电源和高速信号线。
2.5 知识体系总览
下面这张图,是我自己总结的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初始化失败。