2. MIPI CSI-2 协议基础:分层架构、像素格式与数据类型
好,咱们直接进入正题。MIPI CSI-2,全称是 Camera Serial Interface 2。说白了,它就是一套标准,规定了摄像头传感器(Sensor)拍下来的数据,怎么通过几根线,高效、稳定地送到主控(SoC)那边去处理。
我个人习惯先看协议的分层结构。把一个复杂链路拆成几层,每层各司其职,排查问题时思路会清晰很多。
2.1 CSI-2 协议的分层架构
CSI-2 协议分了三层,从下往上依次是:PHY层、Low Level Protocol(LLP)层,以及最高层的应用层。我画了张图,可以帮你快速建立整体印象。
2.2 分层架构详解
(1)PHY层(物理层)
这是最底层,负责信号的传输。D-PHY 用的是差分信号对,一对差分线就是一个 Lane(通道)。典型配置是一条 Clock Lane + N条 Data Lane。这里我就不展开讲电气特性了,但你要知道一点:PHY层出问题,比如电压摆幅不够、共模电压漂了,上层协议再对也没用。
(2)LLP层(底层协议层)
这一层干的事就是打包。它把像素数据包装成一个个“数据包”进行传输。包有两种:
- 短包:只有包头,没有数据体。用来传控制信息,比如帧同步(Frame Start/End)、行同步(Line Start/End)。
- 长包:有包头、数据体(Payload,装像素)、包尾。包头里包含了数据类型(DT)、虚拟通道(VC)、字计数(Word Count)和ECC校验码。数据体后面还跟着CRC校验码。
你想想看,如果 CRC 校验老报错,意味着什么?大概率是链路干扰大,或者信号质量不好,数据传错了。这就是 LLP 层的作用——帮你发现传输出错,但它不纠错,只报错。
(3)应用层(像素处理层)
这一层最接近我们调试的感官,它定义了像素到底长什么样。比如每个像素是 8 bit 还是 10 bit?色彩空间是 RAW 还是 YUV?这就是像素格式要管的事。同时,它还要区分来自不同虚拟通道(VC)的数据流。
2.3 像素格式(Pixel Formats)
这是我们改代码时最常打交道的部分。Camera 传感器输出什么格式,主控的 ISP 就得接什么格式,两边必须严丝合缝。常见的格式有这些:
| 像素格式 | 描述 | 每像素位数 | 典型应用场景 |
|---|---|---|---|
| RAW8/10/12/14/16 | Bayer 阵列原始数据 | 8/10/12/14/16 bpp | 专业相机、工业相机、高端手机 |
| YUV420 8-bit | 亮度+色度,色度水平、垂直均为半数采样 | 12 bpp | 主流手机摄像头、视频通话 |
| YUV422 8-bit | 亮度+色度,色度水平半采样,垂直全采样 | 16 bpp | 部分监控摄像头、图像质量要求较高的场景 |
| RGB888 | 真彩色,每个通道 8 bit | 24 bpp | 显示终端,直接在屏幕上渲染 |
| JPEG | 压缩后的 JPEG 码流 | 可变 | 拍照模式的压缩输出、摄像头模组 |
个人看法: 我在项目里经常遇到有人把 RAW10 当成 RAW8 去解析,结果图像全是一道道条纹。这里要特别小心。记住:Sensor 输出的格式,一定跟你驱动里配的格式完全一致。多一个 bit 或少一个 bit,图像都不对。
2.4 数据类型(Data Type, DT)
数据类型是 LLP 层包头里的一个关键字段。它告诉接收端:来了一个数据包,包里到底装的是什么?是 RAW 数据?还是 YUV?还是 JPEG?还是仅仅是嵌入式元数据?
每个像素格式都对应一个唯一的 6-bit 的 DT 值。举个例子:
0x2B代表 YUV420 8-bit。0x2C代表 YUV422 8-bit。0x30代表 RAW8。0x2E代表 RGB888。0x38代表 JPEG。
为什么会这样?因为主控的接收端必须通过这个 DT 值,知道用什么协议去“拆包”和“解释”数据。
2.5 虚拟通道(Virtual Channel, VC)
一个 CSI-2 接口可以同时传最多 4 个独立的视频流,靠的就是 VC。比如,主摄和副摄可以用同一个物理接口,通过不同的 VC 号来区分。
- VC 值包含在短包和长包的包头中。
- 每个 VC 都独立维护自己的帧同步和行同步。
- 调试时,如果发现图像错乱,可以查查是不是 VC 号配错了,导致主控解析了错误数据流。
2.6 本节核心要点速查
- 分层思维:PHY 层看信号质量,LLP 层看包的 ECC/CRC 错误,应用层看像素格式匹配。
- 格式匹配:Sensor 输出的
pixel_format和主控配置的dt必须是一对一映射。 - VC 隔离:多摄像头共享接口时,务必确认每个 VC 的数据流没有互相干扰。
- 包完整性:如果出现图像撕裂或花屏,优先怀疑包的边界是否对齐,其次是数据类型是否正确。
把这三层架构和像素格式、数据类型搞明白,你再看 MIPI 链路的 debug log 和逻辑分析仪波形,心里就有底了。