3、MIPI CSI-2协议深入:Lane速率计算,D-PHY电气特性,LP/HS模式切换,长包与短包解析,CRC与ECC校验

MIPI CSI-2 这玩意儿,说白了就是摄像头和处理器之间的“高速公路”。你像素再高,算法再牛,路没修好,数据传不过来,一切都是白搭。我刚开始调驱动那会儿,总觉得协议嘛,看看文档就行了。结果呢?图像花屏、丢帧、纹波干扰,各种问题轮着来。后来才明白,不把 CSI-2 的底裤看穿,你连问题出在哪都不知道。

这一章,咱们就把这条“高速公路”的每个细节掰开揉碎了讲。从 Lane 速率怎么算,到 D-PHY 的电气特性,再到数据包的格式和校验。嗯,都是硬骨头,但啃下来之后,你会发现自己对 Camera 系统的理解会上一个台阶。

3.1 Lane 速率计算:这条路到底能跑多快?

先问个问题:你接了一个 4K@60fps 的 sensor,怎么知道需要几条 Lane?每条 Lane 跑多快?

我个人习惯,先算总带宽需求。公式很简单:

总数据率 = 分辨率宽 × 分辨率高 × 帧率 × 每像素比特数 × (1 + 消隐开销)

举个例子,一个 1920x1080@60fps 的 sensor,输出 RAW10(每像素 10bit),消隐开销按 20% 算:

总数据率 = 1920 × 1080 × 60 × 10 × 1.2 ≈ 1.49 Gbps

然后看 Lane 分配。MIPI D-PHY 每个 Lane 的理论极限是 1.5 Gbps(D-PHY v1.2),但实际工程中我一般只用到 80%~90%,留点余量。所以:

Lane 数量 单 Lane 速率 (Gbps) 总带宽 (Gbps) 是否满足 1.49 Gbps
1 Lane 1.5 1.5 勉强,但余量不足
2 Lane 0.75 1.5 可以,但单 Lane 速率低
4 Lane 0.4 1.6 最稳妥,余量充足
我的经验: 能上 4 Lane 就别用 2 Lane。虽然 2 Lane 理论够用,但高速信号对 PCB 走线长度、阻抗匹配非常敏感。Lane 数少意味着单 Lane 速率高,信号完整性更难保证。我曾经在一个项目里为了省两根线,用了 2 Lane 跑 1.2 Gbps,结果产线上 10% 的板子花屏,最后乖乖改回 4 Lane。

3.2 D-PHY 电气特性:信号长什么样?

D-PHY 有两种工作模式:LP(Low Power) 和 HS(High Speed)。你想想看,手机待机时 sensor 不需要一直高速传数据,LP 模式就是用来省电的。HS 模式才是真正飙车的时候。

两种模式的电压摆幅完全不同:

参数 LP 模式 HS 模式
电压摆幅 0 ~ 1.2V (单端) 200mV ~ 400mV (差分)
传输速率 ~10 Mbps 80 Mbps ~ 1.5 Gbps
功耗 极低 较高
信号类型 单端 CMOS 差分对 (Dp/Dn)

这里有个坑:HS 模式的共模电压。D-PHY 规范要求 HS 信号的共模电压在 200mV 左右,差分摆幅 200mV~400mV。如果你用示波器量,看到的是一个“小信号”叠加在 200mV 的直流偏置上。我曾经遇到过一个问题:sensor 输出的 HS 信号共模电压只有 150mV,结果接收端(SoC)的 PHY 锁不住时钟,图像一直闪。查了半天,发现是 sensor 的供电纹波太大,把共模电压拉低了。

注意: 调试时不要只看差分信号幅度,一定要用示波器的“数学运算”功能看共模电压。共模电压超出 ±50mV 范围,基本就会出问题。

3.3 LP/HS 模式切换:怎么从省电模式切到飙车模式?

LP 和 HS 之间的切换,是通过 D-PHY 的 Line State 来控制的。D-PHY 的每个 Lane 有两根线:Dp 和 Dn。LP 模式下,这两根线是独立的单端信号;HS 模式下,它们组成差分对。

切换流程是这样的:

  1. LP 模式(空闲):Dp 和 Dn 都处于 LP-11 状态(都是高电平)。
  2. 进入 HS 模式:发送端先拉低 Dn(进入 LP-10),再拉低 Dp(进入 LP-00),然后立刻切换到 HS 差分驱动,开始传数据。
  3. 退出 HS 模式:发送端停止差分驱动,然后 Dp 和 Dn 回到 LP-11 状态。

这个切换过程有个关键时间参数:HS-Exit 时间。规范要求从停止差分驱动到 LP-11 稳定,至少需要 100ns。如果这个时间太短,接收端可能误判状态,导致下一帧数据错位。

避坑指南: 我曾经在一个项目中,sensor 的 HS-Exit 时间只有 80ns。结果呢?每传完一行数据,下一行的第一个像素就丢了。用逻辑分析仪抓了半天,才发现是退出 HS 模式时,接收端还没准备好就进入了下一行。最后在 sensor 的寄存器里调了一个“HS-Exit 延长”的选项,设成 150ns,问题解决。

3.4 长包与短包解析:数据是怎么打包的?

CSI-2 的数据包分为两种:短包(Short Packet) 和 长包(Long Packet)。短包只有 4 个字节,用来传控制信息,比如帧开始、帧结束、行开始等。长包则包含真正的图像数据。

先看短包的结构:

| 数据标识符 (1 Byte) | 数据值 (2 Bytes) | ECC (1 Byte) |
| 0x00 (帧开始)       | 帧号             | ECC 校验值   |
| 0x01 (帧结束)       | 帧号             | ECC 校验值   |
| 0x02 (行开始)       | 行号             | ECC 校验值   |

长包的结构稍微复杂一点:

| 包首 (4 Bytes) | 图像数据 (N Bytes) | 包尾 (2 Bytes) |
| 数据标识符+字长 | 像素数据           | CRC16 校验值   |

这里有个细节:包首的 ECC 和包尾的 CRC 是分开算的。ECC 保护包首的 4 个字节,CRC 保护整个数据载荷。为什么这么设计?因为包首一旦出错,你连这个包有多长都不知道,后面的数据全乱套。所以 ECC 必须能纠错,而 CRC 只需要检错。

3.5 CRC 与 ECC 校验:怎么保证数据不出错?

先说 ECC(Error Correction Code)。CSI-2 用的是汉明码,对包首的 4 个字节(32 bit)生成 8 bit 的校验码。它能纠正 1 bit 错误,检测 2 bit 错误。嗯,这里要注意:ECC 只能纠 1 bit,如果错了 2 bit,它只能告诉你“出错了”,但不知道错在哪。

再看 CRC(Cyclic Redundancy Check)。长包的 CRC 是 16 bit 的,多项式是 x^16 + x^12 + x^5 + 1。它只检错,不纠错。一旦发现 CRC 不匹配,接收端会丢弃这一整包数据。

实际调试中,我经常用 CRC 错误计数来判断链路质量。如果 CRC 错误率超过 10^-6,基本可以断定硬件有问题——要么是 PCB 走线太长,要么是阻抗不匹配,要么是供电噪声太大。

调试技巧: 大多数 SoC 的 CSI-2 控制器都有寄存器可以读 CRC 错误计数。我习惯在驱动初始化时清零这个计数,然后每 1000 帧读一次。如果计数持续增长,就说明链路不稳定。这时候别急着调软件,先拿示波器看眼图。

3.6 知识结构图:MIPI CSI-2 协议全景

下面这张图把本章的核心知识点串起来了。你可以把它当作调试时的“地图”。

MIPI CSI-2 协议知识结构图 MIPI CSI-2 协议核心知识结构 D-PHY 物理层 电气特性 (LP/HS) Lane 速率计算 LP/HS 模式切换 CSI-2 协议层 短包 (Short Packet) 长包 (Long Packet) 数据校验机制 ECC (汉明码,纠1检2) CRC16 (检错,不纠错) 调试时:先看物理层眼图 → 再查 CRC 错误计数 → 最后用 ECC 定位单 bit 错误

这张图从下往上看:物理层是基础,协议层是骨架,校验机制是安。任何一个环节出问题,最终都会反映在图像质量上。嗯,记住这个结构,调试时你就知道该从哪下手了。