2. MIPI CSI-2 协议基础:分层架构、像素格式与数据类型

好,咱们直接进入正题。MIPI CSI-2,全称是 Camera Serial Interface 2。说白了,它就是一套标准,规定了摄像头传感器(Sensor)拍下来的数据,怎么通过几根线,高效、稳定地送到主控(SoC)那边去处理。

我个人习惯先看协议的分层结构。把一个复杂链路拆成几层,每层各司其职,排查问题时思路会清晰很多。

2.1 CSI-2 协议的分层架构

CSI-2 协议分了三层,从下往上依次是:PHY层、Low Level Protocol(LLP)层,以及最高层的应用层。我画了张图,可以帮你快速建立整体印象。

CSI-2 协议分层架构与核心要素 应用层 / 像素处理层 像素格式 (RAW8/10/12, YUV422, JPEG…) & 数据类型 (DT) 虚拟通道 (VC) 数据流的解析与重组 LLP 层 / 底层协议层 数据包结构: 短包 (帧同步/行同步) | 长包 (像素数据 + ECC + CRC) 数据通道 (Lane) 分发与合并 PHY 层 / 物理层 (D-PHY / C-PHY) 差分信号对: Clock Lane (时钟线) + Data Lanes (数据线) 电气特性: LP (低功耗) / HS (高速) 模式切换,总线状态管理 关注点: 数据类型是否匹配Sensor输出 关注点: 包结构错位是常见故障点 关注点: 眼图质量、电压摆幅

2.2 分层架构详解

(1)PHY层(物理层)

这是最底层,负责信号的传输。D-PHY 用的是差分信号对,一对差分线就是一个 Lane(通道)。典型配置是一条 Clock Lane + N条 Data Lane。这里我就不展开讲电气特性了,但你要知道一点:PHY层出问题,比如电压摆幅不够、共模电压漂了,上层协议再对也没用。

注意: 我见过不少新手,上层软件调了半天数据格式,结果最后发现是 PHY 层进入不了高速模式。所以,当你发现链路完全不通时,先拿示波器看看 PHY 层的信号有没有跳变,别急着改代码。

(2)LLP层(底层协议层)

这一层干的事就是打包。它把像素数据包装成一个个“数据包”进行传输。包有两种:

  • 短包:只有包头,没有数据体。用来传控制信息,比如帧同步(Frame Start/End)、行同步(Line Start/End)。
  • 长包:有包头、数据体(Payload,装像素)、包尾。包头里包含了数据类型(DT)、虚拟通道(VC)、字计数(Word Count)和ECC校验码。数据体后面还跟着CRC校验码。

你想想看,如果 CRC 校验老报错,意味着什么?大概率是链路干扰大,或者信号质量不好,数据传错了。这就是 LLP 层的作用——帮你发现传输出错,但它不纠错,只报错。

经验之谈: 我曾经调一个模组,帧率总是忽高忽低,图像也时不时花掉。逻辑分析仪一抓,发现 CRC 错包率高达 5%。最后定位到是主控那边的 Data Lane 端接电阻没焊好。有时候,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 值,知道用什么协议去“拆包”和“解释”数据。

避坑指南: 我曾经调试一个模组,发现图像花得不成样,查了三天。后来发现 Sensor 的寄存器里配的 DT 是 0x2C (YUV422),但我主控驱动里写的接收格式是 0x2B (YUV420)。两边打架,数据错位,图像就花了。嗯,这里要强调一下:DT 值是 Sensor 和控制端必须约定好,并且稳定一致的。

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 和逻辑分析仪波形,心里就有底了。