3、MIPI D-PHY 信号问题:LP与HS模式切换、幅值、Skew与阻抗
MIPI D-PHY 的物理层信号,是 Camera 模组和 SoC 之间通信的基石。很多驱动调不通、图像出条纹、甚至完全无图,追根溯源,都是 D-PHY 信号出了问题。这一章,我把这些年踩过的坑和总结的方法,跟你好好聊聊。
3.1 LP 与 HS 模式切换异常
MIPI D-PHY 有两种工作模式:LP(低功耗,Low Power) 和 HS(高速,High Speed)。LP 模式电压摆幅大(约 1.2V),用于控制指令和总线 Turnaround。HS 模式电压摆幅小(约 200mV),用于高速数据传输。
切换异常,说白了就是:该进 HS 的时候没进去,或者从 HS 退出来时卡住了。
3.1.1 常见现象
- 图像全黑或花屏: Sensor 没进入 HS 模式,数据根本没传过来。
- 间歇性丢帧: 切换时序不稳定,导致部分帧数据损坏。
- 总线冲突: LP 和 HS 驱动同时使能,造成短路或电平混乱。
3.1.2 调试方法与避坑
我个人习惯,第一步不是看代码,而是抓波形。用示波器(至少 1GHz 带宽)看 Clock Lane 和 Data Lane 的电压。
- 检查 LP-111 状态: 在进入 HS 前,总线必须处于 LP-111(Dp 和 Dn 都为高)状态。如果看到 LP-000 或 LP-100,说明前一个传输没结束干净。
- 测量 HS 进入时间(T-HS-PREPARE + T-HS-ZERO): 从 LP-111 到 HS-0 的建立时间,MIPI 规范有严格范围。RK 平台一般要求 T-HS-PREPARE 在 40ns + 4*UI 左右。我遇到过某款 Sensor,这个时间偏长了 10ns,导致 SoC 端无法正确识别 HS 起始。
- 检查 HS 退出时间(T-HS-TRAIL + T-HS-EXIT): 退出 HS 时,需要先进入 LP-000,再回到 LP-111。如果 T-HS-EXIT 太短,SoC 可能误判为下一个 HS 包。
hs-clk-settle 和 hs-data-settle 参数。这两个参数直接影响 SoC 端采样 HS 数据的窗口。如果图像有“水波纹”或“噪点”,试着微调这两个值,每次步进 0.5 个 UI。
3.2 差分信号幅值不足
HS 模式下,Dp 和 Dn 之间的差分电压(Vdiff)典型值是 200mV。如果幅值不足,SoC 的接收器就无法可靠地识别 0 和 1。
3.2.1 幅值不足的根源
| 原因 | 典型表现 | 排查方向 |
|---|---|---|
| Sensor 驱动电流设置过低 | Vdiff 整体偏低,例如只有 150mV | 检查 Sensor 寄存器,调整 HS 驱动电流 |
| PCB 走线损耗过大 | 远端 Vdiff 比近端低很多 | 用 TDR 测量阻抗,检查走线长度 |
| 端接电阻不匹配 | 信号反射,幅值波动 | 检查 SoC 端 100Ω 差分端接是否开启 |
| FPC 连接器接触不良 | 幅值忽大忽小,偶发丢帧 | 重新插拔 FPC,检查金手指 |
3.2.2 调试步骤
- 用示波器测量差分电压: 探头设置成差分模式,直接量 Dp 和 Dn 之间的波形。看 HS 数据包中间的稳定部分,Vdiff 应该在 140mV 到 270mV 之间。
- 检查共模电压(Vcm): HS 模式下,Dp 和 Dn 的共模电压应该在 200mV 左右。如果 Vcm 偏离太多,说明 Sensor 的共模反馈环路有问题。
- 调整 Sensor 寄存器: 很多 Sensor 都有
MIPI_DRIVE_STRENGTH或MIPI_TERM_CTRL寄存器。我习惯从中间值开始调,然后看眼图变化。
rockchip,enable-eq 属性试试。
3.3 时钟通道与数据通道 Skew 过大
MIPI 是源同步时钟。DDR 模式下,数据在时钟的上升沿和下降沿都采样。如果 Clock Lane 和 Data Lane 之间的延时偏差(Skew)太大,数据就会采错。
3.3.1 Skew 的来源
- PCB 走线不等长: Clock 走线比 Data 走线长了 5mm,就会引入约 30ps 的 Skew。
- Sensor 内部 PLL 抖动: 导致 Clock 和 Data 的相位关系不稳定。
- 温度/电压变化: 导致不同 Lane 的传输延时发生漂移。
3.3.2 如何判断 Skew 过大
用示波器看 眼图。如果眼图的“眼睛”闭合严重,或者交叉点不在正中间,基本就是 Skew 问题。另外,RK 平台的调试节点 /sys/kernel/debug/dw-csi/status 会显示 lane_skew 计数。如果这个值持续增长,说明 Skew 已经导致数据错误了。
3.3.3 解决方案
- PCB 设计阶段: 强制要求 Clock Lane 和 Data Lane 等长,误差控制在 ±5mil 以内。这是最根本的解法。
- 软件 Deskew: RK 的 D-PHY 控制器支持 Per-Lane Deskew。在 DTS 里可以配置
data-lane-skew属性,单位为 UI(Unit Interval)。例如,data-lane-skew = <0 1 2 3>表示 Lane0 延时 0 个 UI,Lane1 延时 1 个 UI,以此类推。 - 调整 Clock 相位: 有些 SoC 允许微调 Clock 的采样沿。RK 平台可以通过
clk-phase属性调整。
hs-clk-settle 值。我遇到过 Lane2 总是报 CRC 错误,把它的 settle 时间从 5 改成 7 就好了。
3.4 阻抗匹配问题
MIPI D-PHY 要求差分阻抗为 100Ω(±10%),单端阻抗为 50Ω。阻抗不匹配,信号就会反射,导致波形畸变、幅值下降、眼图闭合。
3.4.1 阻抗不匹配的典型场景
- PCB 走线阻抗控制不准: 层叠结构、线宽、间距没算好。
- FPC 排线阻抗不连续: FPC 的介电常数和 PCB 不同,容易产生阻抗突变。
- 连接器引入的阻抗跳变: 板对板连接器或 FPC 连接器的引脚,阻抗往往和走线不同。
- SoC 端端接电阻未开启: 很多 SoC 内部有可编程的 100Ω 差分端接。如果没开启,相当于开路,信号会全反射。
3.4.2 如何验证阻抗匹配
最准确的方法是 TDR(时域反射计) 测试。但日常调试中,我们可以通过观察波形来初步判断:
- 有过冲/下冲: 说明阻抗偏高,信号在接收端反射回来叠加。
- 上升沿变缓: 说明阻抗偏低,信号被“拉”住了。
- 台阶状波形: 说明走线上有多个阻抗不连续点。
3.4.3 调试与修复
- 检查 SoC 端端接: 确认 DTS 里
rockchip,hs-termination或类似属性被正确使能。RK3588 默认是开启的,但有些老平台需要手动配。 - 调整 PCB 走线: 如果还在设计阶段,要求 PCB 工程师严格按 100Ω 差分阻抗来走线。对于 4 层板,通常线宽 4mil、间距 6mil 左右(具体看叠层)。
- 串联电阻补偿: 如果 FPC 太长(超过 10cm),可以在 SoC 端串联 10-22Ω 的电阻,用来吸收反射。我有个项目,FPC 长 20cm,加了 15Ω 电阻后,眼图明显变好。
3.5 知识结构图:D-PHY 信号调试全景
下面这张图,把 D-PHY 信号调试的四个核心维度串起来了。你可以把它当作调试时的检查清单。
3.6 总结:调试优先级
遇到 D-PHY 信号问题,我建议按这个顺序排查:
- 先看阻抗匹配: 这是基础。阻抗不对,后面调什么都没用。
- 再看幅值: 确保 SoC 能“听”到 Sensor 的信号。
- 然后看 LP/HS 切换: 确保通信协议能正常建立和释放。
- 最后调 Skew: 这是精细活,用来优化眼图余量。
记住,示波器是你最好的朋友。别光看代码,把探头点到板子上,亲眼看看信号长什么样。很多时候,波形会直接告诉你答案。