4. CSI-2 分层架构:应用层、协议层、物理层各自职责与接口

说实话,我刚接触 MIPI 的时候,看了好几天协议文档,感觉就像在看天书。后来我发现,只要弄懂它那三个层——应用层、协议层、物理层——各自干什么,整个 CSI-2 的框架一下子就清晰了。

你可以把 CSI-2 想象成一个快递系统。

  1. 应用层:就是寄件人。它只管把东西(图像数据)打包好,写上地址,然后交给快递站。
  2. 协议层:是快递站的分拣员。它负责告诉你这个东西该怎么封装、走哪条路、到了目的地怎么拆包。
  3. 物理层:就是快递车和高速公路。它负责把分拣好的包裹,一个 bit 一个 bit 地从发件地运到收件地。

我们在调试的时候,很多问题出在物理层,但根因却往往在协议层或应用层的配置上。所以,搞清这三层的边界,是定位问题的基本功。

核心要点: 调试时,物理层看信号质量,协议层看时序和帧结构,应用层看数据内容。这三层的数据交互,都通过标准接口完成,不能乱。

下面这张图,是我自己总结的 CSI-2 分层结构。每次调试前,我都会在脑子里过一遍这个图。

图 4-1 CSI-2 分层架构与接口关系 应用层 (Application Layer) 像素/字节打包、数据类型(RAW/YUV/JPEG)、CSI-2 帧格式 接口:软件/寄存器配置 (I2C/SPI), 数据流经 PPI 向下 协议层 (Protocol Layer) CSI-2 协议:长/短包、虚拟通道(Virtual Channel)、ECC/CRC LLP (Low-Level Protocol): lane 控制、数据字节分发 接口:PPI (PHY Protocol Interface) — 连接物理层 物理层 (Physical Layer / D-PHY) D-PHY 时序、lane 工作模式 (HS/LP)、高速时钟/数据信号 接口:D-PHY 信号线 (时钟 + 数据 lane) PPI PPI 注:PPI 是协议层与物理层之间的标准“握手”接口。 调试时如果看到 PPI 信号异常,通常是物理层的问题,也可能是协议层配置错了。

4.1 应用层:只管内容,不问路径

应用层是离我们 Camera 软件最近的一层。它处理的是“图像”本身,而不是“信号”。

  • 职责:把 Sensor 采集到的 RAW 数据、YUV 数据或者 MJPEG 流,按照 CSI-2 的规范打包成像素格式。比如,它决定每行有多少个像素,每个像素是10bit还是12bit。
  • 接口:它并不直接跟物理层对话。它通过寄存器或内存接口,把打包好的数据推给协议层。常见的配置接口是 I2C或 SPI。
我的经验: 曾经有个案子,图像出来总是有绿色条纹。我怀疑是物理层有干扰,测了一晚上眼图,全是好的。后来才发现,是应用层打包时把像素点的 bit 顺序搞反了。这就是典型的“上层出错,下层背锅”。

4.2 协议层:拆包组包,管理通路

协议层是 CSI-2 最核心的一层。它负责把应用层丢过来的大块图像数据,切成一个个固定大小的包。然后根据包的类型,加上头尾和校验。

  • 虚拟通道 (Virtual Channel):协议层支持最多4路虚拟通道。什么意思?一根物理线,理论上可以同时传输4路摄像头的数据。我在项目中就用过这个功能,一颗 Sensor 输出 RAW 和 YUV 两路数据,分别走不同的虚拟通道,一路做预览,一路做编码,省了一根 lane。
  • 长包与短包:图像数据用长包(Long Packet),控制信息和同步信号用短包(Short Packet)。协议层必须能识别出正确的帧开始 (SoF) 和帧结束 (EoL) 短包。
  • 接口:协议层向下通过 PPI 接口与物理层相连。PPI 是一个并行总线,协议层以字节为单位,把数据发送给物理层,物理层再串行化发送。

这里面有个很重要的点:数据字对齐。协议层发出去的字节,必须是符合 CSI-2 帧格式的。否则物理层光是传时钟,不传数据,调试起来会很诡异。

我曾经踩过的坑: 在调试一款 4-lane 的 1080P@60fps 摄像头时,发现偶尔会出现帧率不稳定的情况。用示波器抓 PPI 接口,发现协议层在发完一帧图像后,插入了一个多余的空包。物理层老老实实把这个空包也发出去了,导致下一帧数据被延迟。这个问题在单侦侧几乎看不出来,但在系统级调试中就很致命。

4.3 物理层:最苦最累,也最容易被忽视

物理层,也就是我们常说的 D-PHY(未来还有 C-PHY,但那是后话)。它只做一件事:把协议层给的字节,按比特串行发送到差分线上;同时把传过来的串行数据,重新解成并联字节还给协议层。

  • 职责:处理高速时钟、数据 lane 的 SOT (Start of Transmission) / SOTP (End of Transmission),以及 LP (低功耗) 和 HS (高速) 模式的切换。
  • 接口:物理层对外就是几对差分信号线:一对时钟 + 最多4对数据。对内通过 PPI 接口对齐协议层。

为什么说物理层最容易被忽视?因为很多硬件工程师觉得,只要信号能量到通过眼图,就没问题。但物理层的 Escape Mode、ULPS (Ultra-Low Power State) 等状态机的切换,如果时序稍有偏差,协议层就会收到乱数据。

4.4 PPI 接口:协议层与物理层的“握手”通道

PPI 接口是 CSI-2 协议的一个半标准接口。说它“半标准”,是因为 MIPI 联盟定义了它的信号功能,但不同芯片厂商的实现细节略有差异。

信号名 方向 描述
clk_hs / clk_lp 物理层 → 协议层 高速/低功耗时钟指示。告诉协议层,现在线上跑的时钟模式。
data_en / data_valid 协议层 → 物理层 协议层通知物理层:“我有数据要发了,准备好!”
rx_data_hs / tx_data_hs 双向 高速数据总线。通常 8 位或 16 位宽。
err_sot / hs_sync_err 物理层 → 协议层 启动传输同步错误。这是我最关注的一个信号。一旦它拉高,说明物理层和协议层的“握手”出了问题。

在调试时,我习惯用 逻辑分析仪 同时抓取 PPI 信号和物理层差分信号。你很快会发现规律:只要 PPI 上有正确的数据使能,物理层那边必然出现高速传送。如果 PPI 上数据使能异常,物理层可能还停留在 LP 模式,图像自然就卡住了。

4.5 分层调试的思路

明白这三层后,调试就变得有章可循了:

  1. 看整体:先确认应用层配置正确。比如分辨率、帧率、像素格式。这些配置如果错了,底下谈什么都没用。
  2. 看协议层:抓 PPI 波形,确认有没有不停地送 SoF 和 EoL。如果 PPI 接口一直处于空闲状态,说明协议层没收到应用层的数据,或者协议层本身就被卡死了。
  3. 看物理层:最后看波形和眼图。看 HSCR (高速时钟恢复) 是否锁定,SOT 标志是否出现。
总结一句话: 分层调试,是从上往下的排查。永远别先怀疑物理层。大部分“物理层问题”,其实都是上两层“挖的坑”。先把协议层的 PPI 接口波形看明白了,再动示波器看物理层,效率最高。