CSI-2协议层分层结构:应用层、协议层、物理层

很多人一开始学MIPI CSI-2,上来就背三层结构——应用层、协议层、物理层。背完了还是不知道每一层到底干嘛的。我刚开始也这样。

说白了,这三层就是一条数据流水线。传感器拍到的原始像素数据,经过应用层“打包”,协议层“封装加校验”,最后物理层“发出去”。反过来,接收端先物理层收信号,协议层拆包校验,应用层再把数据还原成图像。今天我就把这三层拆开了讲清楚。

CSI-2 协议层分层架构 应用层 (Application Layer) 像素数据封装 · 帧格式定义 · 数据类型标识 原始RAW/Bayer/YUV/JPEG → 打包成像素流 协议层 (Protocol Layer) 长短包生成 · 包头解析 · ECC/CRC校验 短包(帧同步/行同步) · 长包(像素数据+CRC) 物理层 (Physical Layer) D-PHY / C-PHY · 差分信号 · Lane管理 · 低功耗模式 数据流方向:Camera Sensor → 应用层打包 → 协议层封装 → 物理层发送 → MIPI总线 → 接收端解析

应用层:图像的“打包车间”

应用层离传感器最近。传感器拍完一帧图像,原始数据交给应用层,由它决定怎么组织这些像素。

我个人习惯把应用层想象成数据的“打包车间”。不同格式的像素数据——RAW、Bayer、YUV、JPEG——在应用层被封装成统一的数据类型。每种数据类型都有一个对应的Data Type (DT)值,接收端靠这个DT值就能知道当前传输的是什么内容。

一点经验:调试CSI-2接口时,我第一件事就是用逻辑分析仪抓DT值。如果DT对不上,后面怎么调都白搭。

应用层主要干这几件事:

  • 像素数据打包:把传感器输出的数据按行组织,每行包含若干像素
  • 帧结构定义:标记帧开始、帧结束、行有效等边界信息
  • 数据类型标识:通过DT值告诉接收端“我是RAW10”、“我是YUV422”还是“我是JPEG”

举个例子,一个200万像素的传感器,输出RAW10格式。应用层会按每行1920个像素组织数据,然后告诉协议层:“这是图像数据,请准备传输。”

协议层:数据的“信使与警卫”

协议层是CSI-2的核心。它从应用层接收像素数据,然后生成两种包:短包和长包。

短包只有包头,没有数据负载。说白了,它就是控制信令——告诉接收端“新的一帧开始了”、“这一行结束了”、“帧结束了”。我遇到过不少工程师,搞不清短包和长包的区别,抓波形时对着短包看了半天,以为数据丢了。短包里就没有数据,你找什么数据呢?

长包才是真正携带像素数据的载体。结构比短包复杂:

长包结构:
┌─────────────────────────────────────────────────────┐
│  包头(32bit)  │  数据负载(N字节)  │  CRC校验(16bit)  │
├──────────────────┬──────────────────┬─────────────────┤
│  DI(6bit)  │  WC(16bit)  │  ECC(8bit)  │  像素数据  │  CRC  │
└──────────────────┴──────────────────┴─────────────────┘

包头里三个字段最关键:

字段位数作用
DI (Data Identifier)6 bit高2位表示虚拟通道(Virtual Channel),低4位表示数据类型(Data Type)
WC (Word Count)16 bit告诉接收端这个长包有多少字节数据负载
ECC (Error Correction Code)8 bit校验包头本身的正确性,能纠正1bit错误,检测2bit错误

数据负载放的就是应用层打包好的像素数据。最后16bit CRC校验整个数据负载的完整性。

注意:短包固定是32bit包头+ECC,没有数据负载和CRC。接收端看到短包就必须立即响应——它通常是帧/行同步信号,拖不得。

协议层还负责传输操作模式控制。我记得有次调试一款车载摄像头,就是靠短包里的Frame Start/Frame End信号来同步双目视觉的帧对齐。短包的时序控制非常精准,纳秒级别。

物理层:信号的“物理通道”

物理层是CSI-2里最“硬”的一层。它负责通过实际的双绞线差分对——也就是Lane——来发送串行数据。

CSI-2物理层有两种规范:D-PHY和C-PHY。目前90%以上的手机摄像头和嵌入式摄像头还是用D-PHY,C-PHY主要在高端场景用得比较多。

核心要点:物理层不关心你传的是帧开始信号还是像素数据。它只关心“时钟对”和“数据对”上的电压变化,把串行位流变成接收端可识别的信号。

物理层的关键参数:

  • Lane数量:1~4 Lane,每个Lane包含一对差分线(Data+ / Data-)
  • 时钟Lane:D-PHY必须有独立的时钟Lane;C-PHY没有时钟Lane,用数据Lane本身自带的时钟恢复
  • 传输模式:高速模式(HS)传输数据,低功耗模式(LP)传输控制信号
  • 信号电平:HS模式差分摆幅200mV,LP模式单端1.2V

D-PHY和C-PHY的差异从协议层角度看,本质就是“有没有独立时钟线”和“每个Lane能传多少bit”。D-PHY一个Lane一次传1bit,C-PHY一个Lane一次能传2.28bit。我在做4K摄像头选型时,就是因为C-PHY能省Lane才选它的——少一根Lane,PCB布线轻松不少。

物理层的另一个重要工作:Lane管理。CSI-2支持1、2、3、4 Lane模式,物理层要把应用层/协议层的数据流拆分成多个Lane发送。接收端物理层再把这些Lane合并回来。这个拆分合并过程对上层是完全透明的。

避坑:我曾经遇到一个项目,摄像头和主控芯片都支持4 Lane,但主控端的Lane mapping没配对。物理层数据全乱套了,协议层解析出的数据全是错的。查了三天才找到问题——就是一根Lane的极性接反了。

三层之间的协作关系

这三层不是各自为战的。数据流从上到下,层层加工。我总结了一个类比:

  • 应用层是“生产线”,把原材料(像素)加工成半成品(像素流)
  • 协议层是“包装车间”,给半成品贴标签(包头)、加防拆封条(CRC)、发指令单(短包)
  • 物理层是“运输队”,把包装好的货物通过多条传送带(Lane)送到目的地

接收端反过来:物理层收信号,协议层拆包、校验、提取数据,应用层把数据还原成图像。

理解这个分层,你才能看懂CSI-2的数据手册,也才能在调试时知道问题出在哪一层。是物理层的信号质量不行,还是协议层的CRC校验没通过,还是应用层把数据类型配错了?分层清晰了,定位问题就是分分钟的事。