3. CSI-2协议与数据包解析
CSI-2(Camera Serial Interface 2)是MIPI联盟定义的摄像头串行接口规范,它规定了图像传感器与接收端(在Jacinto平台上通常是CSI-2 RX控制器)之间数据如何在物理层之上被组织、传输和校验。理解CSI-2的分层结构、包格式以及同步机制,是排查Jacinto多摄像头采集异常的基础。本节从协议栈分层入手,逐层拆解虚拟通道、数据类型、短包/长包、ECC/CRC校验,以及行同步与帧同步的实现方式。
一、CSI-2的分层结构
CSI-2在逻辑上分为五层,自下而上依次为:物理层(PHY Layer)、协议层(Protocol Layer)、像素到字节打包层(Pixel-to-Byte Packing)、低级协议层(Low Level Protocol,LLP)和应用层(Application Layer)。物理层负责D-PHY或C-PHY的电气信号传输,D-PHY采用差分对,1对时钟lane加1~4对数据lane,每对lane在高速模式下以差分信号传输,速率可达每lane 2.5Gbps(D-PHY v1.2)。协议层中的LLP是本节重点,它定义了数据包(Packet)的组成、传输顺序和错误检测机制。像素到字节打包层负责将不同像素格式(RAW8/RAW10/RAW12、RGB888、YUV422等)转换为字节流。应用层则处理图像数据的语义,例如帧起始、行起始的识别。
在Jacinto的CSI-2 RX中,PHY接收到的串行数据先经过解串和字节对齐,再送入LLP解析器。LLP解析器根据包头中的数据类型和虚拟通道字段,将数据分发到对应的DMA通道或内部FIFO。如果ECC或CRC校验失败,硬件会置位错误中断,软件需要读取错误状态寄存器来判断是偶发干扰还是链路问题。
二、虚拟通道与数据类型
虚拟通道(Virtual Channel,VC)是CSI-2中用于区分同一物理链路上多个独立数据流的机制。包头中的VC字段占2位,因此一条CSI-2链路上最多可复用4个虚拟通道(VC0~VC3)。在Jacinto多摄像头场景中,如果使用CSI-2聚合器(Aggregator)将多路摄像头合并到一条CSI-2链路,聚合器会为每路摄像头分配不同的VC值。接收端根据VC将数据解复用到不同的图像处理流水线。例如,VC0对应前视摄像头,VC1对应后视摄像头,VC2对应环视左摄像头,VC3对应环视右摄像头。配置时需要在Jacinto的CSI-2 RX寄存器中设置每个VC对应的DMA通道和缓冲区地址。
数据类型(Data Type,DT)字段占6位,用于标识包内数据的格式和用途。常见的DT值包括:0x2A表示RAW8,0x2B表示RAW10,0x2C表示RAW12,0x1E表示YUV422 8-bit,0x24表示RGB888,0x00表示帧起始短包(Frame Start),0x01表示帧结束短包(Frame End),0x02表示行起始短包(Line Start),0x03表示行结束短包(Line End)。接收端根据DT值决定如何解析后续数据。例如,当DT=0x2B时,接收端知道每个像素占10位,需要按照RAW10的打包规则将字节流还原为像素值。
三、短包与长包
CSI-2的数据包分为短包和长包两类。短包固定为4字节,结构为:1字节数据标识(DI)、2字节数据字段、1字节ECC。短包用于传输同步事件和简单控制信息,典型用途包括帧起始(FS)、帧结束(FE)、行起始(LS)、行结束(LE)。数据字段的内容随DT不同而不同,例如FS短包的数据字段通常携带帧号,FE短包的数据字段携带帧号或状态信息。
长包由包头、数据载荷和包尾三部分组成。包头4字节,包含DI、字计数(Word Count,WC,2字节)和ECC。WC表示数据载荷的字节数,接收端据此知道需要接收多少字节。数据载荷长度可变,对于RAW10图像,一行像素的字节数由像素数和打包方式决定。包尾2字节为CRC-16校验值,覆盖包头和数据载荷。接收端在解析长包时,先校验包头ECC,再根据WC接收数据,最后校验CRC。如果ECC失败,包头可能不可信,接收端通常会丢弃该包并记录错误;如果CRC失败,数据载荷可能被干扰,接收端会置位CRC错误标志,软件需要决定是否丢弃该帧或重传。
四、ECC与CRC校验
ECC(Error Correction Code)用于保护包头,采用汉明码,可以纠正1位错误、检测2位错误。包头中的DI和WC共3字节,ECC为1字节,覆盖这3字节的24位。接收端计算ECC并与包头中的ECC比较,如果发现可纠正错误,硬件会自动纠正并继续解析;如果发现不可纠正错误,则丢弃该包并上报错误中断。CRC(Cyclic Redundancy Check)用于保护长包的数据载荷,采用CRC-16多项式,覆盖包头和数据载荷。CRC校验失败说明数据在传输过程中发生了位错误,通常由信号完整性差、电磁干扰或时钟抖动引起。
在Jacinto平台上,CSI-2 RX控制器提供错误状态寄存器,软件可以读取ECC错误计数、CRC错误计数以及错误包的类型和虚拟通道。调试时,如果发现某个VC的CRC错误频繁出现,应检查该lane的差分信号质量、终端匹配和PCB走线;如果ECC错误集中在包头,可能是时钟恢复不稳定或lane间偏斜过大。
五、行同步与帧同步机制
CSI-2通过短包实现行同步和帧同步。帧起始短包(DT=0x00)标志一帧图像的开始,接收端收到FS后复位行计数器,准备接收第一行数据。帧结束短包(DT=0x01)标志一帧的结束,接收端在收到FE后完成帧组装并触发DMA传输。行起始短包(DT=0x02)标志一行的开始,行结束短包(DT=0x03)标志一行的结束。对于RAW图像,每行数据通常以长包形式传输,LS和LE短包可以省略,接收端根据WC和像素格式自行计算行边界。但在某些传感器中,LS/LE短包用于精确标记行有效区域,接收端需要根据这些短包来裁剪或对齐图像。
在Jacinto多摄像头同步采集场景中,帧同步的精度直接影响多路图像的时间对齐。如果多个摄像头共享同一个外部触发信号(如帧同步脉冲),它们的FS短包应该在同一时刻或固定延迟内到达。软件可以通过读取每个VC的帧起始时间戳(如果硬件支持)来测量同步误差。如果误差超过允许范围,需要检查触发信号的走线延迟、传感器的内部延迟以及CSI-2链路的传输延迟。
六、关键参数与配置示例
以下是一个典型的Jacinto CSI-2 RX配置片段,用于说明VC和DT的映射关系。假设使用4路摄像头,分别映射到VC0~VC3,数据类型为RAW10(DT=0x2B),每行像素数为1920,则WC = 1920 × 10 / 8 = 2400字节。接收端需要为每个VC配置独立的DMA通道和缓冲区。
/* CSI-2 RX 虚拟通道与数据类型配置示例 */
#define CSI2_DT_RAW10 0x2B
#define CSI2_VC_CAM_FRONT 0
#define CSI2_VC_CAM_REAR 1
#define CSI2_VC_CAM_LEFT 2
#define CSI2_VC_CAM_RIGHT 3
/* 每行字节数:1920 像素 × 10 bit / 8 = 2400 字节 */
#define CSI2_LINE_BYTES_RAW10_1920 (1920 * 10 / 8)
/* 配置 VC0 映射到 DMA 通道 0,DT=RAW10 */
CSI2_RX_VC_MAP(0) = (CSI2_VC_CAM_FRONT << 6) | CSI2_DT_RAW10;
CSI2_RX_DMA_CH(0) = 0;
CSI2_RX_BUF_ADDR(0) = (uint32_t)&frame_buffer_front[0];
/* 使能 ECC 和 CRC 错误中断 */
CSI2_RX_IRQ_ENABLE = ECC_ERR_IRQ | CRC_ERR_IRQ | FS_IRQ | FE_IRQ;
配置完成后,可以通过读取CSI2_RX_STATUS寄存器来观察链路状态。如果ECC_ERR或CRC_ERR置位,需要进一步读取CSI2_RX_ERR_VC和CSI2_RX_ERR_DT寄存器,确定出错的虚拟通道和数据类型。对于偶发的CRC错误,可以尝试降低lane速率或改善信号完整性;对于持续性的ECC错误,应检查时钟lane和数据lane的极性配置是否正确。
七、小结与排查思路
CSI-2协议的核心在于分层解析和包级校验。物理层保证信号传输,LLP层负责包的组织和错误检测,应用层根据VC和DT将数据分发到正确的处理路径。短包承载同步事件,长包承载图像数据,ECC保护包头,CRC保护载荷。在Jacinto多摄像头系统中,虚拟通道是实现多路复用的关键,帧同步和行同步的精度决定了多路图像的时间一致性。排查问题时,应按照“物理层→LLP层→应用层”的顺序逐层确认:先看lane信号是否锁定,再看ECC/CRC错误计数,最后检查VC映射和DMA配置。只有每一层都正常,才能保证多摄像头采集的稳定性和同步精度。