1. MIPI CSI‑2协议基础:从分层到抓包

做嵌入式调试的人都知道,MIPI CSI‑2 是摄像头和处理器之间最常用的高速串行接口。你拿示波器去点一根 CSI‑2 的差分线,如果不懂它的包结构,看到波形也只能干瞪眼。这章我们先从 CSI‑2 的骨架讲起,把分层模型、包格式和帧结构理清楚。后面用示波器抓波形的时候,你才能一眼看出哪段是包头、哪段是数据。

1.1 CSI‑2 体系结构:谁跟谁说话

CSI‑2 链路上只有两种角色:发送端(通常是摄像头传感器)和接收端(处理器端的 ISP 或接收控制器)。中间通过一对或多对差分数据线(Data Lane)和一条差分时钟线(Clock Lane)相连。我个人习惯把时钟线看成整条链路的“心跳”——所有数据都以时钟的边沿为参考采样。

注意:每一条 Lane 都是单向的,从发送端到接收端。如果你在示波器上看到反向信号,那一定是配置错了或者物理层出了问题。

实际项目中,CSI‑2 可以工作在 1 Lane 到 4 Lane 模式。Lane 数越多,总带宽越大,但示波器需要的通道也越多——嗯,做调试的时候要提前想好。

1.2 分层模型:别被层数吓到

CSI‑2 协议参考了 OSI 的思想,但简化成三个主要层次:物理层、协议层和应用层。下面这张图概括了它们的关系:

CSI-2 分层模型与数据包结构 CSI‑2 协议分层模型 应用层 — 像素/字节到传输包映射、帧/行开始结束、数据类型定义 底层协议 字节对齐、ECC、CRC、包定界 上层协议 数据类型、像素格式、帧/行控制 物理层 — D-PHY / C-PHY 电气特性、差分信号、Lane 管理 数据包核心组成 包头(PH) + 数据(Payload) + 包尾(PF)

这张图你可能在别的文档里也见过。但我建议你留意协议层内部的子层划分:底层协议管字节对齐、ECC 和 CRC;上层协议管帧/行开始结束和数据类型。为什么要把它们分开?因为示波器调试时,在底层你会关注包头的同步序列和 ECC 校验,在上层你才去读帧开始码和像素格式——层序分明,调起来才不慌。

1.3 数据包格式:长包和短包

CSI‑2 只定义两种包:长包和短包。我刚开始接触的时候觉得短包就是“短”一点,后来发现根本目的是不一样的。

  • 短包:只包含 32 位包头(Packet Header, PH),没有数据载荷。用于帧开始(FS)、帧结束(FE)、行开始(LS)等控制信息。
  • 长包:PH + 数据载荷 + 包尾。包尾是 16 位 CRC,校验整个载荷。数据载荷长度可以是 0 字节,但必须对齐到字节边界。
短包 vs 长包 — 短包就像命令纸条,没有“正文”;长包才是真正传输图像像素数据的载体。用示波器抓到短包时,你只需要看包头里的虚拟通道号和数据类型,就能知道是帧头还是帧尾。

具体到一个包的字节顺序,CSI‑2 采用小端字节序。举个例子,16 位数据 0x1234,先传低字节 0x34,再传高字节 0x12。嗯,这点和 I²C 一样,但和 SPI 不同,别记混了。

1.4 包头结构:跟着示波器解码

每个包头都是 4 个字节。表格列出了每一个字段的含义:

字节序号 位域 说明
Byte 0 VC (2 bit) + DT (6 bit) 高2位是虚拟通道号(VC),低6位是数据类型。VC 最多4路,DT 决定像素格式(如RAW8、RAW10、YUV422等)。
Byte 1 Word Count (低8位) 对于长包,表示 payload 的字节数(不包括包头包尾);对于短包,一般不用。
Byte 2 Word Count (高8位) 与 Byte 1 组成16位字计数。
Byte 3 ECC (8 bit) 保护前两个字节的校验码,可以纠正单比特错误,检测双比特错误。

你看,短短 4 个字节里包含了 VC、DT、字计数和 ECC。以前我用逻辑分析仪抓包,发现 ECC 报错,检查发现是传感器端 I/O 电压不匹配导致的信号反射——曾经为了这个查了整整两天。所以如果你在示波器上看到频繁的 ECC 错误,先检查物理层信号质量,不要直接怀疑协议配置。

1.5 帧结构:一个摄像头画面的“分节符”

一张完整的摄像头图像帧在 CSI‑2 链路上是这样组织的:

  1. 帧开始短包 (FS) — 通知接收端新帧开始。
  2. 针对每一行:
    • 行开始短包 (LS) — 可选,有些传感器会省略。
    • 一行数据长包 — 包含该行所有像素的 raw 数据。
    • 行结束短包 (LE) — 可选。
  3. 帧结束短包 (FE) — 通知接收端本帧结束。

为什么帧和行都要有开始/结束标记?做过图像采集的人都知道,接收端需要靠这些标记来重新组装像素矩阵。如果缺了 FS,接收端可能把上一帧的结尾当成新帧的开始,画面就错乱了。我个人在调试 4K 摄像头时遇到过因为传感器配置漏发了 FS 导致 ISP 不停丢帧的问题,最后用示波器抓到 FS 确实没出来——原来是 I²C 寄存器写错了。

陷阱提醒:不是所有 CSI‑2 传感器都会发送行开始/结束短包。有些只发了帧开始和帧结束,内部靠接收端根据像素时钟自动累加行列计数。调试前一定要看传感器的 datasheet 确认帧结构。

1.6 关于示波器抓包的准备

了解了上面这些,你已经能看懂 CSI‑2 链路上流动的数据包了。但注意:示波器抓的是差分信号,你需要先解码出字节流,再按上面的包结构去解析。下一章我们会详细讲如何设置示波器、如何触发特定的包——前提是你已经明白了这些“零件”长什么样。

最后分享一个经验:我在做 CSI‑2 兼容性测试时,常把帧开始短包的 ECC 当作链路质量的“晴雨表”。如果帧开头 ECC 经常出错,大概率是时钟抖动或共模噪声超标。这时候先别急着分析行数据,先把物理层搞干净再说。

知识要点速查

概念 要点
分层模型应用层 → 协议层(底层+上层) → 物理层
包类型短包(仅PH,控制用);长包(PH+数据+CRC)
包头结构VC (2bit) + DT (6bit) + WordCount (16bit) + ECC (8bit)
帧结构FS → (行数据) → FE;行可选包含 LS/LE
关键调试点ECC 错误先查物理层;FS 缺失可能导致帧错乱

好了,这一章先到这里。你心里记住分层、包格式、帧结构这三根柱子,后面拿示波器去捅信号时才有底气。