4. MIPI CSI-2协议层与onsemi传感器实现

MIPI CSI-2 是 onsemi 图像传感器与 SoC/ISP 之间最常用的高速串行接口。理解它不能只停留在“有几条 lane、速率多少”,而要落到协议层:一帧图像如何被切成包、包头里放了什么、接收端如何判断包是否可信、多个数据流如何共用同一条物理链路。本节围绕数据包格式、虚拟通道(VC)、数据类型(DT)、ECC/CRC 以及 onsemi 器件中的实际配置要点展开。

一、CSI-2 协议分层与包的基本结构

CSI-2 在物理层之上分为协议层和应用层。协议层负责把像素数据、嵌入式数据、帧同步信息封装成短包(Short Packet)和长包(Long Packet),再经 D-PHY 或 C-PHY 发送。短包固定 4 字节,用于帧起始(FS)、帧结束(FE)、行起始(LS)、行结束(LE)等同步事件;长包用于承载有效载荷,结构为:4 字节包头 + 有效载荷 + 2 字节包尾。

包头 4 字节依次为:DI(Data Identifier,1 字节)、WC(Word Count,2 字节,小端)、ECC(1 字节)。DI 又由 VC(高 2 位)和 DT(低 6 位)组成。包尾是 2 字节 CRC。也就是说,ECC 保护的是包头,CRC 保护的是有效载荷,两者作用范围不同,不能混为一谈。

MIPI CSI-2 长包结构与 DI 字段分解 长包 包头 4B DI+WC+ECC 有效载荷 Payload 像素/嵌入式数据,长度 = WC 字节 包尾 2B CRC DI 字节 VC [7:6] 2 bit DT [5:0] 6 bit,数据类型 保护范围 ECC 覆盖:DI + WC(包头 3 字节) 可纠正 1 bit,检测 2 bit CRC 覆盖:有效载荷全部字节 多项式 x¹⁶+x¹²+x⁵+1 短包 DI 1B VC+DT WC 2B 帧/行号 ECC 1B 保护包头 FS / FE / LS / LE 等同步事件

二、虚拟通道与数据类型

VC 只有 2 bit,因此一条 CSI-2 链路上最多区分 4 个逻辑数据流(VC0~VC3)。它的价值在于:当一颗传感器同时输出多种数据(例如主图像流、相位检测像素流、嵌入式统计信息),或系统把多颗传感器汇聚到同一 CSI-2 接收端口时,接收端可以按 VC 把数据分流到不同 DMA 通道或不同 ISP 处理路径,而不必增加物理连线。

DT 是 6 bit,用于标识“这段载荷是什么”。常见取值包括:RAW8=0x2A、RAW10=0x2B、RAW12=0x2C、RAW14=0x2D、YUV422 8bit=0x1E、RGB888=0x24、嵌入式数据=0x12、用户自定义=0x30~0x37。接收端必须用 DT 判断如何解析载荷,例如 RAW10 的打包方式与 RAW12 不同,若 DT 配错,图像会花屏或错位。

三、ECC 与 CRC 的校验逻辑

ECC 采用汉明码思路,对包头 3 字节生成 1 字节校验。接收端收到包头后重新计算 ECC 并与收到的 ECC 比较:若不一致,可定位并纠正 1 bit 错误;若出现 2 bit 错误则只能检测不能纠正,通常上报错误并丢弃该包。CRC 则对有效载荷做 16 位循环冗余校验,接收端逐包计算,若 CRC 不匹配说明载荷在传输中出错,该包应被丢弃,避免错误像素进入图像。

ECC 保护“包头”,决定这个包该不该被正确路由和解析;CRC 保护“载荷”,决定这段像素数据能不能用。两者都通过,包才可信。

四、onsemi 器件中的配置要点

以 AR0234、AR0821、AR2020 等 onsemi 传感器为例,CSI-2 相关配置通常通过寄存器组完成,核心包括:

  • VC 分配:通过寄存器设置每个输出流的虚拟通道号。若 SoC 只接收 VC0,而传感器把主流出到 VC1,就会出现“有帧同步但无图像”的现象。
  • DT 选择:根据输出格式设置 RAW8/10/12/14 或 YUV422。DT 必须与 SoC 接收端配置一致,否则解析错误。
  • Lane 数与速率:配置 lane 数量(1/2/4 lane)和每 lane 速率,需与 D-PHY 时序、SoC 接收能力匹配。
  • 帧/行同步包:确认 FS/FE/LS/LE 短包是否使能,以及帧号、行号是否随包发送,便于接收端做同步与错误定位。
  • ECC/CRC 使能:部分器件可配置是否生成 CRC,接收端也应开启对应校验,形成闭环。

实际调试时,建议先用示波器或 CSI-2 分析仪确认 FS 包出现、DI 字段中的 VC/DT 与预期一致,再检查 CRC 错误计数。若 CRC 错误随速率升高而增加,通常是信号完整性或时序余量问题,而非协议配置错误。

五、配置示例与判断依据

假设使用 AR0234,输出 RAW10、2 lane、VC0,SoC 端接收 RAW10。传感器侧关键寄存器可参考如下思路(具体地址以数据手册为准):

// 示例:设置 VC = 0,DT = RAW10 (0x2B)
write_reg(0x30A0, 0x00);   // VC0
write_reg(0x30A2, 0x2B);   // DT = RAW10
write_reg(0x30A4, 0x02);   // 2 lane
// 使能 FS/FE 短包
write_reg(0x30B0, 0x01);

判断配置是否成功,可依次观察:① 接收端是否收到 FS 短包;② DI 中的 VC/DT 是否与写入值一致;③ CRC 错误计数是否长期为 0;④ 图像是否完整、无错位。若 FS 正常但图像异常,优先核对 DT 与打包方式;若 CRC 持续报错,优先检查 lane 速率、走线阻抗与时钟关系。

VC 和 DT 是“路由与解析”的依据,ECC/CRC 是“可信度”的依据。onsemi 传感器配置时,必须让发送端与接收端在 VC、DT、lane 数、速率、校验使能上完全对齐,任何一项不一致都可能导致无图、花屏或间歇性丢帧。