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 | 最稳妥,余量充足 |
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 的供电纹波太大,把共模电压拉低了。
3.3 LP/HS 模式切换:怎么从省电模式切到飙车模式?
LP 和 HS 之间的切换,是通过 D-PHY 的 Line State 来控制的。D-PHY 的每个 Lane 有两根线:Dp 和 Dn。LP 模式下,这两根线是独立的单端信号;HS 模式下,它们组成差分对。
切换流程是这样的:
- LP 模式(空闲):Dp 和 Dn 都处于 LP-11 状态(都是高电平)。
- 进入 HS 模式:发送端先拉低 Dn(进入 LP-10),再拉低 Dp(进入 LP-00),然后立刻切换到 HS 差分驱动,开始传数据。
- 退出 HS 模式:发送端停止差分驱动,然后 Dp 和 Dn 回到 LP-11 状态。
这个切换过程有个关键时间参数:HS-Exit 时间。规范要求从停止差分驱动到 LP-11 稳定,至少需要 100ns。如果这个时间太短,接收端可能误判状态,导致下一帧数据错位。
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 走线太长,要么是阻抗不匹配,要么是供电噪声太大。
3.6 知识结构图:MIPI CSI-2 协议全景
下面这张图把本章的核心知识点串起来了。你可以把它当作调试时的“地图”。
这张图从下往上看:物理层是基础,协议层是骨架,校验机制是安。任何一个环节出问题,最终都会反映在图像质量上。嗯,记住这个结构,调试时你就知道该从哪下手了。