4. MIPI CSI-2 协议层:长包与短包、数据类型、虚拟通道

好,咱们今天聊聊 MIPI CSI-2 的协议层。说实话,很多做 FPGA 的同学,一上来就盯着物理层的差分信号、DDR 时钟看,结果协议层没搞明白,调试的时候抓耳挠腮。我个人习惯是,先把协议层的“规矩”吃透,再去看波形,这样心里有底。

CSI-2 协议层,说白了就是定义摄像头怎么把数据“打包”发出去,接收端又该怎么“拆包”。它不关心电压高低,只关心数据长什么样、怎么分组。

4.1 长包与短包:数据的两副面孔

CSI-2 的传输单元叫“包”。包分两种:长包和短包。你想想看,这就像寄快递——短包是快递单,长包是包裹里的东西。

短包(Short Packet)

短包只有 4 个字节。它不携带图像数据,只传递控制信息。比如:

  • 帧开始(Frame Start)
  • 帧结束(Frame End)
  • 行开始(Line Start)
  • 行结束(Line End)

我在项目中遇到过一个问题:摄像头输出图像老是错位,查了半天,发现是短包里的行同步信号时序不对。嗯,这里要注意——短包虽然短,但它是整个传输的“指挥棒”,丢了它,数据就乱套了。

长包(Long Packet)

长包才是真正装图像数据的。它的结构是这样的:

+----------------+----------------+----------------+----------------+
|  包首 (PH)     |  数据负载      |  校验和 (ECC)  |  校验和 (CRC)  |
|  4 字节         |  可变长度      |  2 字节        |  2 字节        |
+----------------+----------------+----------------+----------------+

包首里包含了数据类型和虚拟通道号。数据负载就是像素数据,RAW8、YUV 什么的都在这里。最后还有 ECC 和 CRC 做校验——说白了就是防止传输过程中数据出错。

核心区别:短包是“命令”,长包是“数据”。接收端先解析短包,知道“什么时候开始/结束”,再处理长包里的像素。

4.2 数据类型:RAW8/10、YUV、JPEG

数据类型(Data Type, DT)是长包包首里的一个字段,告诉接收端“这包数据是什么格式”。CSI-2 支持很多种,咱们挑几个常用的说。

数据类型 DT 值(十六进制) 说明
RAW8 0x2A 每个像素 8 位,Bayer 格式
RAW10 0x2B 每个像素 10 位,需要打包成 5 字节存 4 像素
YUV422 8-bit 0x1E YUV 格式,每个分量 8 位
JPEG 0x40 压缩后的 JPEG 数据流

为什么会有这么多格式?因为不同的应用场景需求不一样。比如:

  • RAW8/RAW10:工业相机、医疗影像常用。数据量大,但保留了最原始的传感器信息。我曾经调试一个 RAW10 的摄像头,发现像素值总是对不齐——后来才意识到,RAW10 需要做位打包,4 个 10 位像素拼成 5 个字节。这个坑,我踩过。
  • YUV:消费电子、视频通话常用。人眼对亮度敏感、对色度不敏感,所以 YUV 可以压缩色度信息,节省带宽。
  • JPEG:网络摄像头、监控常用。直接输出压缩后的数据,省去了 FPGA 端做 JPEG 编码的麻烦。

我的建议:选数据类型时,先看你的后端处理能力。如果 FPGA 资源紧张,选 JPEG 直接输出;如果要做图像处理算法,选 RAW 或 YUV。别盲目追求高位数,够用就行。

4.3 虚拟通道:一条总线,多路数据

虚拟通道(Virtual Channel, VC)是 CSI-2 里一个很巧妙的设计。它允许在同一条物理链路上传输多路独立的图像数据流。

为什么会需要这个?你想想看,现在的手机摄像头模组,往往有主摄、广角、景深等多个传感器。如果每个传感器都拉一组差分线,PCB 布线会疯掉。虚拟通道就是解决这个问题的——每个传感器分配一个 VC ID(0~3),数据在链路上时分复用。

VC 字段在长包和短包的包头里,占 2 位,所以最多支持 4 个虚拟通道。接收端根据 VC ID 把数据分发到不同的处理模块。

关键点:虚拟通道是逻辑上的隔离,不是物理上的。所有 VC 的数据都走同一组差分线,靠包头里的 ID 区分。

我在一个多摄像头项目中用过这个特性。当时需要同时采集两个 RAW10 的传感器,一个做 RGB 输出,一个做红外输出。我把它们分别映射到 VC0 和 VC1,FPGA 端根据 VC ID 做分流。嗯,调试的时候发现一个问题——如果某个 VC 的数据量突然增大,会挤占其他 VC 的带宽。所以,虚拟通道虽然方便,但带宽规划要做好。

4.4 知识体系总览

下面这张图,是我自己总结的 CSI-2 协议层核心逻辑。你看一眼,就能把长包、短包、数据类型、虚拟通道串起来。

MIPI CSI-2 协议层核心结构 物理层(D-PHY / C-PHY) 协议层 长包(Long Packet) 短包(Short Packet) 数据类型(DT) 虚拟通道(VC) 帧/行同步 控制信息 应用层(图像处理 / 存储 / 显示)

从这张图你能看到:物理层负责传输原始比特流;协议层负责把比特流解析成有意义的包,再根据 DT 和 VC 做分发;应用层拿到数据后做进一步处理。三层分工明确,各司其职。

注意:协议层的解析必须在 FPGA 内部用硬件逻辑完成,不能用软件轮询。因为 MIPI 的数据速率动辄几百 Mbps,软件根本来不及。我曾经见过有人试图用 MicroBlaze 软核去解析 CSI-2 包,结果丢帧丢到怀疑人生。

好了,这一章的内容就这些。记住三个关键词:长包装数据、短包做同步、虚拟通道分多路。搞懂了这些,你再看 MIPI 的波形图,就不会一头雾水了。

可可精品资料库