4. CSI-2 分层架构:应用层、协议层、物理层各自职责与接口
说实话,我刚接触 MIPI 的时候,看了好几天协议文档,感觉就像在看天书。后来我发现,只要弄懂它那三个层——应用层、协议层、物理层——各自干什么,整个 CSI-2 的框架一下子就清晰了。
你可以把 CSI-2 想象成一个快递系统。
- 应用层:就是寄件人。它只管把东西(图像数据)打包好,写上地址,然后交给快递站。
- 协议层:是快递站的分拣员。它负责告诉你这个东西该怎么封装、走哪条路、到了目的地怎么拆包。
- 物理层:就是快递车和高速公路。它负责把分拣好的包裹,一个 bit 一个 bit 地从发件地运到收件地。
我们在调试的时候,很多问题出在物理层,但根因却往往在协议层或应用层的配置上。所以,搞清这三层的边界,是定位问题的基本功。
下面这张图,是我自己总结的 CSI-2 分层结构。每次调试前,我都会在脑子里过一遍这个图。
4.1 应用层:只管内容,不问路径
应用层是离我们 Camera 软件最近的一层。它处理的是“图像”本身,而不是“信号”。
- 职责:把 Sensor 采集到的 RAW 数据、YUV 数据或者 MJPEG 流,按照 CSI-2 的规范打包成像素格式。比如,它决定每行有多少个像素,每个像素是10bit还是12bit。
- 接口:它并不直接跟物理层对话。它通过寄存器或内存接口,把打包好的数据推给协议层。常见的配置接口是 I2C或 SPI。
4.2 协议层:拆包组包,管理通路
协议层是 CSI-2 最核心的一层。它负责把应用层丢过来的大块图像数据,切成一个个固定大小的包。然后根据包的类型,加上头尾和校验。
- 虚拟通道 (Virtual Channel):协议层支持最多4路虚拟通道。什么意思?一根物理线,理论上可以同时传输4路摄像头的数据。我在项目中就用过这个功能,一颗 Sensor 输出 RAW 和 YUV 两路数据,分别走不同的虚拟通道,一路做预览,一路做编码,省了一根 lane。
- 长包与短包:图像数据用长包(Long Packet),控制信息和同步信号用短包(Short Packet)。协议层必须能识别出正确的帧开始 (SoF) 和帧结束 (EoL) 短包。
- 接口:协议层向下通过 PPI 接口与物理层相连。PPI 是一个并行总线,协议层以字节为单位,把数据发送给物理层,物理层再串行化发送。
这里面有个很重要的点:数据字对齐。协议层发出去的字节,必须是符合 CSI-2 帧格式的。否则物理层光是传时钟,不传数据,调试起来会很诡异。
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 分层调试的思路
明白这三层后,调试就变得有章可循了:
- 看整体:先确认应用层配置正确。比如分辨率、帧率、像素格式。这些配置如果错了,底下谈什么都没用。
- 看协议层:抓 PPI 波形,确认有没有不停地送 SoF 和 EoL。如果 PPI 接口一直处于空闲状态,说明协议层没收到应用层的数据,或者协议层本身就被卡死了。
- 看物理层:最后看波形和眼图。看 HSCR (高速时钟恢复) 是否锁定,SOT 标志是否出现。