1. MIPI CSI‑2协议基础:从分层到抓包
做嵌入式调试的人都知道,MIPI CSI‑2 是摄像头和处理器之间最常用的高速串行接口。你拿示波器去点一根 CSI‑2 的差分线,如果不懂它的包结构,看到波形也只能干瞪眼。这章我们先从 CSI‑2 的骨架讲起,把分层模型、包格式和帧结构理清楚。后面用示波器抓波形的时候,你才能一眼看出哪段是包头、哪段是数据。
1.1 CSI‑2 体系结构:谁跟谁说话
CSI‑2 链路上只有两种角色:发送端(通常是摄像头传感器)和接收端(处理器端的 ISP 或接收控制器)。中间通过一对或多对差分数据线(Data Lane)和一条差分时钟线(Clock Lane)相连。我个人习惯把时钟线看成整条链路的“心跳”——所有数据都以时钟的边沿为参考采样。
实际项目中,CSI‑2 可以工作在 1 Lane 到 4 Lane 模式。Lane 数越多,总带宽越大,但示波器需要的通道也越多——嗯,做调试的时候要提前想好。
1.2 分层模型:别被层数吓到
CSI‑2 协议参考了 OSI 的思想,但简化成三个主要层次:物理层、协议层和应用层。下面这张图概括了它们的关系:
这张图你可能在别的文档里也见过。但我建议你留意协议层内部的子层划分:底层协议管字节对齐、ECC 和 CRC;上层协议管帧/行开始结束和数据类型。为什么要把它们分开?因为示波器调试时,在底层你会关注包头的同步序列和 ECC 校验,在上层你才去读帧开始码和像素格式——层序分明,调起来才不慌。
1.3 数据包格式:长包和短包
CSI‑2 只定义两种包:长包和短包。我刚开始接触的时候觉得短包就是“短”一点,后来发现根本目的是不一样的。
- 短包:只包含 32 位包头(Packet Header, PH),没有数据载荷。用于帧开始(FS)、帧结束(FE)、行开始(LS)等控制信息。
- 长包:PH + 数据载荷 + 包尾。包尾是 16 位 CRC,校验整个载荷。数据载荷长度可以是 0 字节,但必须对齐到字节边界。
具体到一个包的字节顺序,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 链路上是这样组织的:
- 帧开始短包 (FS) — 通知接收端新帧开始。
- 针对每一行:
- 行开始短包 (LS) — 可选,有些传感器会省略。
- 一行数据长包 — 包含该行所有像素的 raw 数据。
- 行结束短包 (LE) — 可选。
- 帧结束短包 (FE) — 通知接收端本帧结束。
为什么帧和行都要有开始/结束标记?做过图像采集的人都知道,接收端需要靠这些标记来重新组装像素矩阵。如果缺了 FS,接收端可能把上一帧的结尾当成新帧的开始,画面就错乱了。我个人在调试 4K 摄像头时遇到过因为传感器配置漏发了 FS 导致 ISP 不停丢帧的问题,最后用示波器抓到 FS 确实没出来——原来是 I²C 寄存器写错了。
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 缺失可能导致帧错乱 |
好了,这一章先到这里。你心里记住分层、包格式、帧结构这三根柱子,后面拿示波器去捅信号时才有底气。