1. MIPI 基础概念:CSI-2 协议、Lane、Data Type 与 Virtual Channel

我一直觉得,搞懂 MIPI 是调好摄像头的基础。很多新手一上来就照着数据手册焊板子、改驱动,结果图像出不来,满头问号。其实大部分问题都出在最基本的协议理解上。我们先把这个地基打牢。

MIPI CSI-2,说白了就是摄像头和处理器之间商量好的一套“语言”。摄像头拍到的原始图像数据,按照这套规则打包发送;处理器按同样的规则拆包、解析,最后显示出来。

1.1 CSI-2 协议栈长什么样?

CSI-2 协议分好几层,从底层物理信号到最上层的数据处理。我见过不少人只关心物理连接,忽略了协议层的配置,结果图像偏色、帧率异常。嗯,这里要注意,每一层都可能出问题。

  • 物理层(PHY):决定了电压、时钟、差分走线规则。最常见的 D-PHY,用一对差分线传数据,另一对传时钟。
  • 协议层(Protocol):定义了怎么把一帧图像拆成若干小包(packet),每个包的结构是什么。
  • 应用层(Application):规定了图像数据的格式,比如 RAW10、YUV422、JPEG……

调试时,你可能先怀疑协议层的数据包不对,但最后发现是物理层的线接错了。有一次我调一块开发板,怎么都出不了图,折腾大半天,结果是差分线等长没做好,信号质量差到没朋友。

MIPI CSI-2 协议栈结构 应用层 Data Type (RAW10/YUV422) 协议层 Packet / Virtual Channel 物理层 (D-PHY) Lane / Clock / HS-LP 数据流方向 摄像头 → 应用层 → 协议层 → 物理层 → 处理器 调试切入点 检查 DT 配置 检查 VC/LP 信号质量 / 时序 Lane 分配

1.2 Lane:数据通道

Lane 是一条物理上的数据通道,由一对差分信号线组成。CSI-2 可以配置 1、2 或 4 条 Lane。你想想看,Lane 数量直接决定了带宽:4 Lane 就是 1 Lane 的四倍速度。

为什么 Lane 分配容易出错?

我见过最典型的问题:驱动里配置了 4 Lane,但硬件只连了 2 条;或者反过来,硬件焊了 4 条,驱动只开了 2 条。图像要么出不来,要么满屏花斑。

Lane 数量典型带宽(每 Lane 1 Gbps)适用场景
1 Lane1 Gbps低分辨率预览(VGA)
2 Lane2 Gbps720p / 1080p @30fps
4 Lane4 Gbps4K / 高帧率
我的习惯:拿到摄像头模组的第一件事,先看硬件原理图,确定到底焊了几条 Lane,然后检查驱动里的驱动能力配置是否匹配。不匹配的话,直接无图。

1.3 Data Type:数据格式

Data Type(DT)告诉处理器:接下来收到的数据是什么格式。比如说,DT=0x2B 代表 RAW10,DT=0x1E 代表 YUV422 8-bit。处理器收到包之后,根据 DT 字段来解码。

有一次,我调试一个 200 万像素模组,输出的明明是 RAW10,我却在驱动里配成了 YUV422。结果图像颜色完全不对——偏紫偏绿,像坏了一样。后来我把 DT 改回 RAW10,图就正常了。说白了,DT 配错是最常见的低级错误。

避坑指南:我曾经花了一整天查为什么图像全是竖条纹,最后发现是 Data Type 里的位深和 sensor 的 mipi 配置对不上。比如 sensor 输出 10-bit,但 drive 按 8-bit 解析,高位数据被截掉了。

1.4 Virtual Channel:虚拟通道

一个 CSI-2 接口可以接入多个摄像头。怎么区分它们的数据?就用 Virtual Channel(VC)。每个摄像头分配一个独立的 VC ID(0~3),发送数据包时带上这个 ID;处理器按 ID 把数据分到不同的接收通道。

简单说,VC 就像快递包裹上的地址标签。如果两个摄像头用了相同的 VC ID,处理器就分不清谁是谁,数据会混在一起。

VC ID通常用途
VC0主摄像头
VC1副摄像头(如广角)
VC2深度/ToF
VC3IR 或其他
你想想看,如果你板子上接了 2 个 sensor,驱动里 VC 分配乱了,图像数据就会互相干扰——有时能看到两个画面的残影叠在一起。嗯,这时候检查 VC ID 是最快的方法。

1.5 一个典型的数据包结构

CSI-2 的数据包分短包(Short Packet)和长包(Long Packet)。短包传控制信息(比如帧开始/结束),长包传真正的图像数据。

// 长包结构(简化)
[Packet Header] -> [Data (像素)] -> [Packet Footer]
  4 bytes              可变长度         2 bytes (CRC)

// 短包结构
[Packet Header] -> [Ecc + Data]
  4 bytes

我记得第一次读 MIPI 协议规范时,觉得包结构复杂。后来用逻辑分析仪抓了一次实际波形,发现就是这简单的三部分。大部分故障排查,只需要关注 Packet Header 里的 DT 和 VC 字段是否正确。

调试建议:示波器或逻辑分析仪抓 Lane 上的信号,看 HS 模式下的包结构。如果抓到的 DT 和你配置的不一致,说明 sensor 那边就没配对。

小结

这一章讲了 MIPI CSI-2 最核心的几个概念。我个人习惯把这几个点记在手边:Lane 数量、Data Type、Virtual Channel ID。大部分无图像问题,追根溯源都能落到这三者中的某一个上。

下回你调摄像头没图像,别慌。先从硬件 Lane 数开始查,再看驱动里的 DT 和 VC 设置。大概率就是它们的问题。