MIPI CSI-2:从 Sensor 到 SoC 的像素高速公路
Sensor 把光变成了电信号,下一步就是把这些像素数据搬到 SoC。这条高速公路叫 MIPI CSI-2。
CSI-2 协议栈:三层叠罗汉
MIPI CSI-2 不是单一协议,是三层叠起来的:
┌──────────────────────┐ │ Application Layer │ ← RAW10/RAW12/YUV422/JPEG ├──────────────────────┤ │ Protocol Layer │ ← 短包/长包/Virtual Channel ├──────────────────────┤ │ Physical Layer │ ← D-PHY / C-PHY (差分信号) └──────────────────────┘流程图:
大多数安防 SoC 用 D-PHY,C-PHY 主要用在手机高端屏。
踩过的坑:把 RAW10 配成了 RAW8 的 lane 数去算,结果带宽不够、图像花屏。这属于最低级的错误,但压力大的时候谁都会犯。
D-PHY:差分线上的 1 和 0
D-PHY 的核心是差分信号——一对线传一路数据(Dp/Dn)。HS(高速)模式下,电压摆幅只有 200mV,速率能达到 80Mbps 到 2.5Gbps per lane。LP(低功耗)模式摆幅 1.2V,速率只有 10Mbps,用于控制指令。
HS 和 LP 的切换时序非常关键——从 LP-11 进入 HS 需要先经过 LP-01→LP-00 的序列,时间必须严格满足 spec。
有一个寄存器很多 SDK 里不公开配置,但实际很关键:T_HS_PREPARE + T_HS_ZERO,这两个时序参数决定了 HS 进入的建立时间。芯片原厂给的默认值通常是偏保守的,如果 PCB 走线短、质量好,可以适当减小来提速。
Lane 数怎么算?公式就一个
公式:
所需 Lane 数 = (像素位深 × 分辨率宽 × 分辨率高 × 帧率) / (每 Lane 带宽 × 2)除以 2 是因为 DDR(Double Data Rate)——时钟上升沿和下降沿都传数据。
举个例子:
Sensor: 500万像素 (2592×1944), 30fps, RAW10 每帧像素 = 2592 × 1944 = 5,038,848 每帧数据量 = 5,038,848 × 10bit = 50,388,480bit 每秒数据量 = 50,388,480 × 30 = 1.51Gbps 每 Lane 带宽按 1Gbps 算: 所需 Lane = 1.51 / (1 × 2) = 0.755 → 1 Lane 勉强够,建议 2 Lane实际做产品时,千万要留余量。如果没算 MIPI 时钟裕量,导致低温下图像偶尔撕裂。建议留 20-30% 的余量。
短包 vs 长包:帧同步的秘密
CSI-2 的包分两种:
- 短包:4字节,用于帧同步——Frame Start(FS)、Frame End(FE)、Line Start(LS)、Line End(LE)
- 长包:包头(4B) + 数据(可变) + 包尾(2B CRC),承载实际的像素数据
每个帧的传输序列:
FS Short Packet → LE Short Packet (optional) → Line 0 Long Packet → LS Short Packet (optional) → LE Short Packet → Line 1 Long Packet → ... → FE Short Packet很多工程师只知道配 sensor 的 output 格式,忽略了帧同步包的插入时序。如果 FS 和 FE 之间的时间差跟 sensor 的 VBLANK 不匹配,SoC 的 VI 模块就会丢帧。这个 bug 在快速预览时看不出来,但在录像回放时帧率会忽高忽低。
Virtual Channel:四路复用的技巧
CSI-2 支持最多 4 个 Virtual Channel(VC0-VC3),通过同一个物理 lane 传输不同数据流。典型用法:
| VC | 用途 | 分辨率 |
|---|---|---|
| VC0 | 主码流 | 2592×1944 @ 30fps |
| VC1 | 子码流 | 640×480 @ 15fps |
| VC2 | JPEG 快照 | 2592×1944 |
| VC3 | Meta 数据 | AE/AWB 统计值 |
注意:不是所有 SoC 都支持 VC 解复用。有些便宜芯片的 VICAP 模块只能接 VC0,接了多路数据直接扔。选型时一定要看 datasheet 的「MIPI CSI-2 Virtual Channel Support」这一段。
调试三板斧
MIPI 最烦人的地方是——要么通,要么不通,中间态很少。不像 I2C 能看波形,MIPI 是高速差分信号,普通示波器看不了。我总结了三步调试法:
第一板斧:检查 LP 状态机
- 用 SoC 的 MIPI PHY 测试模式,看 D-PHY 是否成功从 LP-11 进入了 HS 模式
- 常见问题:Sensor 端 T_HS_PREPARE 过短,SoC 端没识别到 HS 进入
第二板斧:检查 CRC 错误计数
- 大多数 SoC 的 MIPI RX 模块都有 CRC 错误统计寄存器
- CRC 错误持续增长 → 物理层有问题(信号完整性/走线过长/阻抗不匹配)
- CRC 错误为零但图像花 → Protocol Layer 配置错了(VC mismatch / Data Type 不对)
第三板斧:检查帧长/行长
- 读 SoC 的 VICAP 寄存器,看接收到的行像素数是否跟 sensor 输出一致
- 常见:Sensor 的 HTS(Horizontal Total Size)跟 SoC 预期的 H_ACTIVE 不匹配
总结
MIPI CSI-2 的坑总结起来就三类:
| 类型 | 现象 | 根因 |
|---|---|---|
| 物理层 | 图花/撕裂/无图 | D-PHY 时序/阻抗/走线 |
| 协议层 | 丢帧/帧率不对 | VC/DataType/HTS 不匹配 |
| 时序层 | 间歇性花屏 | VBLANK/HBLANK/Clock 裕量不足 |
下一个话题预告:ISP Pipeline——Sensor 的 RAW data 进了 SoC 之后,到底经历了什么?
参考
- MIPI Alliance Specification for D-PHY v2.5
- MIPI Alliance Specification for CSI-2 v3.0
- 各 SoC Vendor MIPI RX Programming Guide