MIPI CSI-2 协议基础:从物理层到协议层

各位同学,今天我们来聊聊 MIPI CSI-2。说实话,这玩意儿是图像传感器接口的“通用语言”。我做过的几个摄像头项目,从手机到安防,几乎都在用这套协议。你搞懂了它,后面写 RTL 代码心里就有底了。

MIPI CSI-2 协议栈分三层:物理层、协议层、应用层。咱们这节课重点讲前两层——物理层和协议层。应用层嘛,后面章节会细说。

核心要点: CSI-2 不是单一协议,而是一套分层架构。物理层负责“怎么传”,协议层负责“传什么”。

D-PHY 物理层:经典方案

D-PHY 是 MIPI 联盟最早推出的物理层标准。说白了,它就是用差分信号来传数据。我刚开始接触时,觉得差分对布线挺麻烦的,但后来发现它的抗干扰能力确实强。

D-PHY 的核心结构是这样的:

  • 时钟通道(Clock Lane):差分对,提供同步时钟
  • 数据通道(Data Lane):差分对,1~4 条,传数据用
  • 工作模式:高速模式(HS)和低功耗模式(LP)

这里有个关键点——D-PHY 是 DDR(双倍数据率) 传输。什么意思?时钟的上升沿和下降沿都采样数据。举个例子,1GHz 的时钟,实际数据率就是 2Gbps。

参数 D-PHY v1.2 D-PHY v2.0
最大数据率/通道 2.5 Gbps 4.5 Gbps
通道数 1~4 1~4
工作电压 1.2V (HS) / 1.2V (LP) 1.2V (HS) / 1.2V (LP)
功耗 低 更低
我的经验: 做 D-PHY 接口 RTL 设计时,最容易被坑的是 LP 模式和 HS 模式的切换时序。我曾经因为状态机少了一个等待周期,导致传感器初始化失败。嗯,后来老老实实对着 spec 数时钟周期。

C-PHY 物理层:更高带宽的选择

C-PHY 是后来推出的,主要为了解决带宽瓶颈。它不用差分对,而是用 三线(trio) 传输。你想想看,三根线能组合出 6 种状态,每个符号能传 2.28 比特信息。

我个人的习惯是:如果项目带宽需求超过 4Gbps,优先考虑 C-PHY。但代价是布线更复杂,协议也更绕。

D-PHY 和 C-PHY 的主要区别:

  • 信号线:D-PHY 用差分对,C-PHY 用三线组
  • 时钟:D-PHY 有独立时钟通道,C-PHY 时钟嵌入在数据中
  • 数据率:同样线数下,C-PHY 带宽更高
  • 功耗:C-PHY 略高,但单位比特功耗更低
注意: C-PHY 的接收端需要做 3 线到 2 比特的译码,这个逻辑在 RTL 里比 D-PHY 复杂不少。如果你刚入门,建议先从 D-PHY 开始。

CSI-2 协议层:数据怎么组织

物理层搞定信号传输,协议层负责数据组织。CSI-2 协议层定义了两种包格式:长包(Long Packet) 和 短包(Short Packet)。

说白了,长包传数据,短包传控制信息。这个设计很巧妙——控制信息开销小,数据信息效率高。

短包格式

短包只有 32 比特,结构如下:

| 数据标识符 (8-bit) | 虚拟通道 (2-bit) | 数据类型 (6-bit) | 错误校正码 (8-bit) | 结束码 (8-bit) |

短包用来传帧开始、帧结束、行开始、行结束这些控制信号。我刚开始做时,总觉得短包太短,不够用。后来发现,控制信息确实不需要太多比特。

长包格式

长包结构稍微复杂点:

| 包首 (32-bit) | 数据载荷 (可变长度) | 包尾 (16-bit) |

包首包含:

  • 数据标识符(8-bit):虚拟通道 + 数据类型
  • 字计数(16-bit):数据载荷的字节数
  • 错误校正码(8-bit):ECC,保护包首

数据载荷就是实际的图像数据,比如 RAW10、RAW12、YUV 等格式。包尾是 16 位 CRC,校验数据完整性。

包类型 长度 用途 错误保护
短包 32 比特 帧/行控制 ECC
长包 可变 图像数据 ECC + CRC
避坑指南: 我曾经在长包的 CRC 计算上栽过跟头。CSI-2 的 CRC 多项式是 CRC-16-CCITT,但初始值不是 0xFFFF,而是 0x0000。这个细节 spec 里写得很清楚,但容易看漏。

协议层状态机

CSI-2 协议层的核心是一个状态机。我画个图,你一看就明白:

CSI-2 协议层状态机 CSI-2 协议层状态机 空闲 (Idle) 短包接收 长包接收 数据载荷 包尾校验 SoT + 短包 SoT + 长包包首 EoT 字计数有效 数据结束 CRC 校验完成 SoT = Start of Transmission, EoT = End of Transmission

这个状态机其实不复杂。空闲状态等 SoT(传输开始),来了短包就收短包,来了长包包首就进长包接收。长包收完数据载荷,再做 CRC 校验,校验通过回到空闲。

我的建议: 写 RTL 时,状态机用独热码(one-hot)编码。虽然多几个触发器,但译码逻辑简单,时序容易收敛。我之前用二进制编码吃过亏,状态跳转路径太长,时序跑不到目标频率。

数据类型与虚拟通道

CSI-2 的数据类型(Data Type, DT)决定了载荷的格式。常见的 DT 值:

数据类型 DT 值 (Hex) 说明
RAW6 0x28 6 位原始数据
RAW8 0x2A 8 位原始数据
RAW10 0x2B 10 位原始数据
RAW12 0x2C 12 位原始数据
YUV420 8-bit 0x1E YUV 格式
帧开始 (FS) 0x00 短包
帧结束 (FE) 0x01 短包

虚拟通道(Virtual Channel, VC)允许在同一个物理链路上传输多路数据流。比如,一个传感器可以同时输出 RAW 和 YUV 数据,通过不同的 VC 区分。

VC 只有 2 比特,最多 4 个通道。实际项目中,我见过最多用 2 个 VC——一个传图像数据,一个传元数据(比如曝光时间、增益值)。

注意: 虚拟通道不是物理隔离的。如果某个 VC 的数据出错,可能会影响其他 VC 的接收。所以,CRC 校验一定要做,不能偷懒。

小结

这一章我们讲了 MIPI CSI-2 的物理层和协议层基础。D-PHY 和 C-PHY 是两种物理层方案,各有优劣。协议层的长包和短包格式,是 RTL 设计的核心。

我个人觉得,理解这些基础概念比背 spec 更重要。你只要搞懂了“物理层怎么传比特”、“协议层怎么组包”,后面写代码就是水到渠成的事。