3、MIPI D-PHY 信号问题:LP与HS模式切换、幅值、Skew与阻抗

MIPI D-PHY 的物理层信号,是 Camera 模组和 SoC 之间通信的基石。很多驱动调不通、图像出条纹、甚至完全无图,追根溯源,都是 D-PHY 信号出了问题。这一章,我把这些年踩过的坑和总结的方法,跟你好好聊聊。

核心要点: D-PHY 信号调试,本质是验证“眼图”是否张开。LP/HS 切换、幅值、时序偏差、阻抗,这四个维度缺一不可。

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 的电压。

  1. 检查 LP-111 状态: 在进入 HS 前,总线必须处于 LP-111(Dp 和 Dn 都为高)状态。如果看到 LP-000 或 LP-100,说明前一个传输没结束干净。
  2. 测量 HS 进入时间(T-HS-PREPARE + T-HS-ZERO): 从 LP-111 到 HS-0 的建立时间,MIPI 规范有严格范围。RK 平台一般要求 T-HS-PREPARE 在 40ns + 4*UI 左右。我遇到过某款 Sensor,这个时间偏长了 10ns,导致 SoC 端无法正确识别 HS 起始。
  3. 检查 HS 退出时间(T-HS-TRAIL + T-HS-EXIT): 退出 HS 时,需要先进入 LP-000,再回到 LP-111。如果 T-HS-EXIT 太短,SoC 可能误判为下一个 HS 包。
我的小技巧: 在 RK 的 DTS 里,可以调整 hs-clk-settle 和 hs-data-settle 参数。这两个参数直接影响 SoC 端采样 HS 数据的窗口。如果图像有“水波纹”或“噪点”,试着微调这两个值,每次步进 0.5 个 UI。
曾经踩过的坑: 有一款国产 Sensor,它的 LP 驱动能力偏弱,导致 LP-111 状态电压只有 0.8V,SoC 误判为 LP-000,直接拒绝进入 HS。最后在 Sensor 端加了一颗上拉电阻才解决。所以,别只看时序,电平幅度也要确认。

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 调试步骤

  1. 用示波器测量差分电压: 探头设置成差分模式,直接量 Dp 和 Dn 之间的波形。看 HS 数据包中间的稳定部分,Vdiff 应该在 140mV 到 270mV 之间。
  2. 检查共模电压(Vcm): HS 模式下,Dp 和 Dn 的共模电压应该在 200mV 左右。如果 Vcm 偏离太多,说明 Sensor 的共模反馈环路有问题。
  3. 调整 Sensor 寄存器: 很多 Sensor 都有 MIPI_DRIVE_STRENGTH 或 MIPI_TERM_CTRL 寄存器。我习惯从中间值开始调,然后看眼图变化。
经验之谈: 对于长走线(超过 15cm),我建议在 SoC 端开启 均衡(Equalization) 功能。RK3588 的 D-PHY 支持 CTLE(连续时间线性均衡),可以有效补偿高频损耗。在 DTS 里加上 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 解决方案

  1. PCB 设计阶段: 强制要求 Clock Lane 和 Data Lane 等长,误差控制在 ±5mil 以内。这是最根本的解法。
  2. 软件 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,以此类推。
  3. 调整 Clock 相位: 有些 SoC 允许微调 Clock 的采样沿。RK 平台可以通过 clk-phase 属性调整。
调试技巧: 如果只有一条 Lane 有 Skew 问题,可以尝试在 DTS 里单独调整那条 Lane 的 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 调试与修复

  1. 检查 SoC 端端接: 确认 DTS 里 rockchip,hs-termination 或类似属性被正确使能。RK3588 默认是开启的,但有些老平台需要手动配。
  2. 调整 PCB 走线: 如果还在设计阶段,要求 PCB 工程师严格按 100Ω 差分阻抗来走线。对于 4 层板,通常线宽 4mil、间距 6mil 左右(具体看叠层)。
  3. 串联电阻补偿: 如果 FPC 太长(超过 10cm),可以在 SoC 端串联 10-22Ω 的电阻,用来吸收反射。我有个项目,FPC 长 20cm,加了 15Ω 电阻后,眼图明显变好。
重要提醒: 不要随意在 MIPI 线上加电容或电感。这些寄生元件会破坏差分阻抗,引入新的信号完整性问题。如果一定要加 ESD 防护,请选择低电容(<0.5pF)的 TVS 管,并注意布局,让 TVS 的寄生电容尽量小。

3.5 知识结构图:D-PHY 信号调试全景

下面这张图,把 D-PHY 信号调试的四个核心维度串起来了。你可以把它当作调试时的检查清单。

MIPI D-PHY 信号调试全景图 D-PHY 信号质量 LP/HS 切换 差分幅值 时钟/数据 Skew 阻抗匹配 LP/HS 切换检查项 • T-HS-PREPARE 时序 • T-HS-EXIT 时序 • LP-111 状态确认 • hs-clk-settle 参数 • hs-data-settle 参数 差分幅值检查项 • Vdiff 140~270mV • Vcm 共模电压 • 驱动电流设置 • 端接电阻状态 • 走线损耗评估 Skew 检查项 • 走线等长检查 • 眼图交叉点位置 • lane_skew 计数 • Per-Lane Deskew • Clock 相位调整 阻抗检查项 • TDR 测试 • 过冲/下冲波形 • 端接使能确认 • 串联电阻补偿 • FPC 阻抗连续性

3.6 总结:调试优先级

遇到 D-PHY 信号问题,我建议按这个顺序排查:

  1. 先看阻抗匹配: 这是基础。阻抗不对,后面调什么都没用。
  2. 再看幅值: 确保 SoC 能“听”到 Sensor 的信号。
  3. 然后看 LP/HS 切换: 确保通信协议能正常建立和释放。
  4. 最后调 Skew: 这是精细活,用来优化眼图余量。

记住,示波器是你最好的朋友。别光看代码,把探头点到板子上,亲眼看看信号长什么样。很多时候,波形会直接告诉你答案。