raw格式数据流与MIPI CSI-2对接 - 第4节
4.1 CSI-2 协议层总体架构
MIPI CSI-2 协议层位于物理层(D-PHY/C-PHY)之上,负责将图像传感器输出的原始像素数据封装为符合标准的数据包,并通过虚拟通道(Virtual Channel, VC)实现多路数据流的复用传输。协议层主要分为三个子层:像素/字节打包层、底层协议层和通道管理层。其中,底层协议层定义了两种基本的数据包格式:长包(Long Packet)和短包(Short Packet)。
4.2 长包(Long Packet)结构
长包用于传输有效载荷数据,如图像的一行像素、嵌入式数据块等。其结构由四个部分组成:包首(Packet Header, PH)、有效载荷(Payload Data)、包尾(Packet Footer, PF)以及可选的数据长度字段。
| 字段 | 字节数 | 描述 |
|---|---|---|
| 数据标识符(DI) | 1 字节 | 高 2 位为虚拟通道 ID(VC),低 6 位为数据类型(DT) |
| 字计数(WC) | 2 字节 | 有效载荷的字节数(16 位,范围 0~65535) |
| ECC | 1 字节 | 对 PH 前 3 字节的纠错码(单比特纠错,双比特检错) |
| 有效载荷 | WC 字节 | 实际数据(像素、元数据等) |
| 校验和(Checksum) | 2 字节 | 对有效载荷的 CRC-16 校验(可选,由 DT 决定是否启用) |
4.3 短包(Short Packet)结构
短包仅包含包首(PH),没有有效载荷和包尾。其长度为 4 字节(DI + WC + ECC),用于传输帧开始(FS)、帧结束(FE)、行开始(LS)、行结束(LE)等同步事件。短包中的 WC 字段被重新定义为事件标识符或帧号/行号。
| 字段 | 字节数 | 描述 |
|---|---|---|
| 数据标识符(DI) | 1 字节 | VC + DT(DT 固定为 0x01 表示短包) |
| 数据字段(Data Field) | 2 字节 | 根据 DT 不同,可表示帧号、行号或特定事件代码 |
| ECC | 1 字节 | 对前 3 字节的纠错码 |
4.4 数据类型(DT)定义
数据类型(Data Type, DT)是 6 位字段,位于数据标识符(DI)的低 6 位,用于标识包中数据的格式和内容。CSI-2 规范定义了多种标准 DT 值,涵盖 Raw 数据、YUV、RGB、嵌入式数据、用户定义数据等。对于 Raw 格式,常见的 DT 值如下:
| DT 值(Hex) | Raw 格式 | 每像素位数 | 说明 |
|---|---|---|---|
| 0x2A | RAW6 | 6 | 6-bit Raw 数据 |
| 0x2B | RAW7 | 7 | 7-bit Raw 数据 |
| 0x2C | RAW8 | 8 | 8-bit Raw 数据(最常见) |
| 0x2D | RAW10 | 10 | 10-bit Raw 数据(需 4 像素 5 字节打包) |
| 0x2E | RAW12 | 12 | 12-bit Raw 数据(需 2 像素 3 字节打包) |
| 0x2F | RAW14 | 14 | 14-bit Raw 数据 |
| 0x30 | RAW16 | 16 | 16-bit Raw 数据 |
| 0x31 | RAW20 | 20 | 20-bit Raw 数据 |
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)。
4.6 帧传输序列:长包与短包的配合
在实际传输中,一帧图像的完整传输序列由短包和长包交替组成。以 Raw 图像为例,典型的帧序列如下:
- 帧开始(FS)短包:DT=0x00,数据字段携带帧计数器。
- 行开始(LS)短包:DT=0x01,数据字段携带行号。
- 行数据长包:包含该行所有像素的 Raw 数据,DT 为对应的 Raw 格式(如 0x2C)。
- 行结束(LE)短包:DT=0x02,数据字段携带行号。
- 重复步骤 2~4,直到所有行传输完毕。
- 帧结束(FE)短包:DT=0x03,数据字段携带帧计数器。
4.7 实战:Raw 数据流中的 DT 与 VC 配置示例
假设我们使用一个 1920×1080 的 Raw10 图像传感器,通过 CSI-2 接口输出,同时需要传输嵌入式元数据(如每帧的曝光时间)。配置如下:
| 数据流 | VC | DT | 说明 |
|---|---|---|---|
| 图像数据 | VC0 | 0x2D (RAW10) | 每行 1920 像素,WC = 1920 × 10 / 8 = 2400 字节 |
| 嵌入式元数据 | VC1 | 0x12 (Embedded Data) | 通常放在每帧开始或结束,包含传感器状态 |
在接收端(如 FPGA 或 ISP),需要根据 VC 和 DT 对数据进行分流:VC0 的数据送入 Raw 处理管线,VC1 的数据送入元数据解析模块。
// 解析数据标识符
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