第4章 数据线(tData)时序:建立时间、保持时间与偏斜
MIPI 调试里,数据线时序是最容易出问题的地方。我个人习惯先把三条主线理清楚:数据建立时间(tSetup)、保持时间(tHold)、还有时钟与数据之间的偏斜(tSkew)。这三者就像三根柱子,有一根歪了,整条链路就可能崩。
4.1 建立时间(tSetup)——数据来的够早吗?
tSetup 定义很简单:数据信号必须在时钟采样沿到达之前稳定下来。这个“之前”到底要多久?MIPI D-PHY 规范没给一个死数字,它依赖具体的时钟频率和 lane 速率。
| 参数 | 典型参考值(HS模式,1 Gbps) | 说明 |
|---|---|---|
| tSetup (min) | 0.15 UI(约150 ps @1Gbps) | 数据沿必须先于时钟沿到达 |
| tSetup 裕量 | ≥ 50 ps | 留够余量,否则误码率飙升 |
核心公式:
tSetup_available = tClock_period – tData_propagation_delay – tClock_skew
保证实际 tSetup ≥ 规范最小值。
我在项目中遇到过一块板子,CSI-2 时钟走线比数据线长了几乎 2 英寸。结果建立时间直接变成了负数。嗯,那画面太美我不敢看——全屏雪花。后来把时钟线做等长并加了一组蛇形走线,问题才消失。
4.2 保持时间(tHold)——数据别跑太快
tHold 和建立时间正好相反:采样沿过去之后,数据还不能马上变,必须维持一段时间。MIPI 接收器内部有个锁存窗口,你数据跑得太快,窗口没关闭,它就读了错误的值。
我给你的小技巧: 保持时间不够时,别急着调整时钟延时。先看看数据线上有没有加串阻或电容。我曾经在 D0P/D0N 上各加了一个 2 pF 的电容到地,保持时间从 20 ps 拉到 120 ps,效果立竿见影。
为什么要这样?说白了,电容延缓了数据的下降/上升沿,等效于把数据窗口拉宽。但好处也有代价——会降低眼图开口。所以电容值要精调,不能乱怼。
4.3 数据-时钟偏斜(tSkew)——它们本是一对
偏斜是建立时间与保持时间的综合结果。理想状态下,每个 MIPI 数据 lane 和它对应的时钟 lane,沿对齐误差应该控制在 ±0.5 UI 以内。实际上嘛……
- 板级偏斜来源: PCB 走线不等长、过孔不一致、参考层不连续。
- 芯片内部偏斜: 驱动器的输出 buffer 延时差异、温度电压变化。
- 跨 lane 偏斜: 不同数据 lane 之间(用于 multi-lane 同步),要求 ≤ 0.25 UI。
注意: 我曾经在调试时只测一条 lane,一切正常。等四路摄像头全挂上去,画面就撕裂了。原因就是各 lane 的偏斜加起来超过了接收端的容忍范围。所以一定得做全 lane 打拍同步。
4.4 三个参数的联动关系——一张图说清楚
你想想看,建立时间、保持时间、偏斜,其实是同一个现象的不同侧面。我画了一个简化时序图,把三者放到一条时间轴上:
4.5 实战调试:三步定位时序问题
- 测量眼图,看开口 —— 先用示波器在接收端测每个 lane 的眼图。如果眼高低于 200 mV 或眼宽小于 0.6 UI,基本就是时序出事了。
- 量建立/保持时间 —— 用示波器的“时间测量”功能分别抓 setup/hold 的统计值。规范里一般要求 setup ≥ 0.15 UI,hold ≥ 0.15 UI。
- 调偏斜,走等长 —— 如果某个 lane 的偏斜超出其他 lane 的 ±0.1 UI,在 PCB 上想办法补线。实在不行就用 FPGA 内部的 delay 链。
一个来自实战的避坑指南: 我曾经遇到一个案子,眼图看着很棒,但实际跑起来就丢帧。最后发现是电源纹波耦合到了数据线上,导致 setup/hold 在某个瞬间被砸穿。所以在量建立/保持时间时,务必在实际工作负载下测,别在空载下瞎乐。
4.6 小结一下——三个数,一条线
你记住这张表,后面调 MIPI 时能省不少功夫:
| 参数 | 物理含义 | 常见失效表现 | 我的第一反应 |
|---|---|---|---|
| tSetup | 数据在采样沿之前稳定的时间 | 画面局部噪点、偶尔丢行 | 查时钟 vs 数据走线长度差 |
| tHold | 采样沿之后数据维持的时间 | 固定列方向的条纹 | 加小电容,或调整驱动强度 |
| tSkew | 数据与时钟沿的相对偏移 | 多路同时工作时画面错位 | 每组 lane 做等长,≥ 5 mm 的差距都要调 |
说白了,数据线时序调试就是跟皮秒(ps)级别的时间打交道。别怕,手头有示波器和耐心,再配上这里的方法,多数问题都能搞定。