raw格式数据流与MIPI CSI-2对接 - 第4节

4.1 CSI-2 协议层总体架构

MIPI CSI-2 协议层位于物理层(D-PHY/C-PHY)之上,负责将图像传感器输出的原始像素数据封装为符合标准的数据包,并通过虚拟通道(Virtual Channel, VC)实现多路数据流的复用传输。协议层主要分为三个子层:像素/字节打包层、底层协议层和通道管理层。其中,底层协议层定义了两种基本的数据包格式:长包(Long Packet)和短包(Short Packet)。

核心要点:长包用于传输大量数据(如图像像素),短包用于传输控制信息(如帧同步、行同步)。两者配合使用,构成完整的帧传输序列。
CSI-2 协议层架构 物理层(D-PHY / C-PHY) 协议层 像素/字节打包层 底层协议层 通道管理层 应用层(图像传感器 / ISP)

4.2 长包(Long Packet)结构

长包用于传输有效载荷数据,如图像的一行像素、嵌入式数据块等。其结构由四个部分组成:包首(Packet Header, PH)、有效载荷(Payload Data)、包尾(Packet Footer, PF)以及可选的数据长度字段。

字段字节数描述
数据标识符(DI)1 字节高 2 位为虚拟通道 ID(VC),低 6 位为数据类型(DT)
字计数(WC)2 字节有效载荷的字节数(16 位,范围 0~65535)
ECC1 字节对 PH 前 3 字节的纠错码(单比特纠错,双比特检错)
有效载荷WC 字节实际数据(像素、元数据等)
校验和(Checksum)2 字节对有效载荷的 CRC-16 校验(可选,由 DT 决定是否启用)
实战提示:在 Raw 数据流中,长包的有效载荷通常对应图像的一行像素。WC 值等于该行像素数乘以每个像素的字节数(如 10-bit Raw 需注意字节对齐)。
长包(Long Packet)结构 DI 1B WC 2B ECC 1B 包首(PH) 有效载荷(Payload Data) WC 字节 校验和 2B 包尾(PF) 长包传输:PH → Payload → PF,PH 中的 ECC 保护前 3 字节,PF 中的校验和可选

4.3 短包(Short Packet)结构

短包仅包含包首(PH),没有有效载荷和包尾。其长度为 4 字节(DI + WC + ECC),用于传输帧开始(FS)、帧结束(FE)、行开始(LS)、行结束(LE)等同步事件。短包中的 WC 字段被重新定义为事件标识符或帧号/行号。

字段字节数描述
数据标识符(DI)1 字节VC + DT(DT 固定为 0x01 表示短包)
数据字段(Data Field)2 字节根据 DT 不同,可表示帧号、行号或特定事件代码
ECC1 字节对前 3 字节的纠错码
常见误区:初学者容易将短包中的 2 字节数据字段误认为字计数(WC)。实际上,短包没有有效载荷,该字段用于传递控制信息。例如,帧开始短包的 DT 为 0x00,数据字段可携带帧计数器。
短包(Short Packet)结构 DI 1B 数据字段 2B ECC 1B 包首(PH) 短包无有效载荷 数据字段 = 帧号/行号/事件

4.4 数据类型(DT)定义

数据类型(Data Type, DT)是 6 位字段,位于数据标识符(DI)的低 6 位,用于标识包中数据的格式和内容。CSI-2 规范定义了多种标准 DT 值,涵盖 Raw 数据、YUV、RGB、嵌入式数据、用户定义数据等。对于 Raw 格式,常见的 DT 值如下:

DT 值(Hex)Raw 格式每像素位数说明
0x2ARAW666-bit Raw 数据
0x2BRAW777-bit Raw 数据
0x2CRAW888-bit Raw 数据(最常见)
0x2DRAW101010-bit Raw 数据(需 4 像素 5 字节打包)
0x2ERAW121212-bit Raw 数据(需 2 像素 3 字节打包)
0x2FRAW141414-bit Raw 数据
0x30RAW161616-bit Raw 数据
0x31RAW202020-bit Raw 数据
实战要点:在配置图像传感器时,必须确保传感器输出的 DT 与接收端(如 ISP 或 SoC)的预期一致。例如,若传感器输出 RAW10 但接收端配置为 RAW8,会导致数据错位和图像花屏。

4.5 虚拟通道(VC)与数据类型映射

虚拟通道(Virtual Channel, VC)是数据标识符(DI)的高 2 位,支持最多 4 个独立数据流(VC0~VC3)在同一条物理链路上传输。VC 与 DT 共同构成 DI 字节:

DI[7:6] = VC(虚拟通道 ID)
DI[5:0] = DT(数据类型)

例如,DI = 0x6C 表示 VC=1(二进制 01),DT=0x2C(RAW8)。

VC 的典型应用场景包括:

  • 多摄像头同步:多个传感器通过同一 CSI-2 接口输出,每个传感器分配不同的 VC。
  • 数据与元数据分离:图像数据使用 VC0,嵌入式元数据(如增益、曝光时间)使用 VC1。
  • 不同分辨率/格式混合:主图像使用 VC0(RAW10),副图像或缩略图使用 VC1(RAW8)。
虚拟通道(VC)与数据类型(DT)映射 数据标识符(DI)—— 1 字节 VC(高 2 位) DT(低 6 位) VC0 (00) VC1 (01) VC2 (10) VC3 (11) RAW8 (0x2C) RAW10 (0x2D) RAW12 (0x2E) Emb Data

4.6 帧传输序列:长包与短包的配合

在实际传输中,一帧图像的完整传输序列由短包和长包交替组成。以 Raw 图像为例,典型的帧序列如下:

  1. 帧开始(FS)短包:DT=0x00,数据字段携带帧计数器。
  2. 行开始(LS)短包:DT=0x01,数据字段携带行号。
  3. 行数据长包:包含该行所有像素的 Raw 数据,DT 为对应的 Raw 格式(如 0x2C)。
  4. 行结束(LE)短包:DT=0x02,数据字段携带行号。
  5. 重复步骤 2~4,直到所有行传输完毕。
  6. 帧结束(FE)短包:DT=0x03,数据字段携带帧计数器。
调试技巧:使用逻辑分析仪或 MIPI 分析仪抓取 CSI-2 总线时,首先检查 FS 和 FE 短包是否存在。若缺少 FE,通常表示传感器未正确结束帧,接收端可能进入死锁状态。
一帧 Raw 图像的 CSI-2 传输序列 FS 短包 LS 短包 行数据 长包 LE 短包 … FE 短包 帧传输关键规则 • 每帧必须以 FS 短包开始,以 FE 短包结束 • 每行数据前后可包含 LS/LE 短包(可选,由传感器配置决定) • 长包中的 DT 必须与传感器输出格式一致,否则接收端无法正确解析 • 同一帧内所有行数据的 DT 必须相同,VC 也必须相同

4.7 实战:Raw 数据流中的 DT 与 VC 配置示例

假设我们使用一个 1920×1080 的 Raw10 图像传感器,通过 CSI-2 接口输出,同时需要传输嵌入式元数据(如每帧的曝光时间)。配置如下:

数据流VCDT说明
图像数据VC00x2D (RAW10)每行 1920 像素,WC = 1920 × 10 / 8 = 2400 字节
嵌入式元数据VC10x12 (Embedded Data)通常放在每帧开始或结束,包含传感器状态

在接收端(如 FPGA 或 ISP),需要根据 VC 和 DT 对数据进行分流:VC0 的数据送入 Raw 处理管线,VC1 的数据送入元数据解析模块。

关键代码片段(Verilog 伪代码):
// 解析数据标识符
wire [1:0] vc = di[7:6];
wire [5:0] dt = di[5:0];

// 根据 VC 和 DT 分发数据
always @(posedge clk) begin
  if (vc == 2'b00 && dt == 6'h2D) begin
    // RAW10 图像数据,送入 pixel_fifo
    pixel_fifo_wr_en <= 1'b1;
  end else if (vc == 2'b01 && dt == 6'h12) begin
    // 嵌入式数据,送入 meta_fifo
    meta_fifo_wr_en <= 1'b1;
  end else begin
    // 其他情况(如短包)忽略或处理
  end
end
注意:上述代码仅为简化示例。实际设计中还需处理 ECC 校验、WC 计数、CRC 校验以及短包解析等逻辑。务必在硬件实现前通过仿真验证所有边界情况。