3. 摄像头模组与MIPI接口:Sensor输出接口类型、RAW10/RAW12/RAW16数据格式、MIPI CSI-2协议栈

好,我们进入第三章。这一章聊的是摄像头模组和MIPI接口的底层细节。说白了,就是Sensor拍完一张照片后,怎么把数据传出去。

很多工程师觉得这步很简单——Sensor输出,SoC接收,中间走MIPI线。但实际项目中,我见过太多因为接口类型选错、数据格式没对齐、或者协议栈理解不透导致的花屏、丢帧、带宽不够用的问题。嗯,咱们今天就把这些坑一个个填上。

3.1 Sensor输出接口类型

Sensor的输出接口,目前主流就三种:DVP、LVDS、MIPI CSI-2。我按出现的时间顺序给你捋一遍。

接口类型 信号方式 最大速率 适用场景 现状
DVP 并行(8/10/12 bit) ~96 Mbps 低分辨率、低帧率 基本淘汰
LVDS 串行(差分对) ~1 Gbps/对 工业相机、老平台 逐步退场
MIPI CSI-2 串行(差分对) ~4.5 Gbps/通道 手机、平板、车载 主流

DVP接口,我2010年刚入行时还在用。那时候做功能机摄像头,DVP的并行总线一拉就是十几根线,PCB走线走到崩溃。而且DVP的时钟和数据必须等长,稍微差一点就采错数据。后来MIPI联盟推出CSI-2,大家终于解脱了。

LVDS呢?它比DVP好,差分信号抗干扰强,速率也高。但LVDS没有统一的应用层协议,各家Sensor厂商自己定义数据包格式,导致SoC端适配工作量巨大。我记得有个项目,换了一颗LVDS输出的Sensor,结果ISP的LVDS接收模块要重新写驱动,折腾了两周。

所以现在,手机影像系统几乎清一色用MIPI CSI-2。它把物理层、协议层、应用层都标准化了,Sensor厂商和SoC厂商按同一套规范做,兼容性就好很多。

核心结论:新项目选型,优先MIPI CSI-2。除非你做的不是手机,或者有特殊成本要求,否则别碰DVP和LVDS。

3.2 RAW10 / RAW12 / RAW16 数据格式

Sensor输出的原始数据,叫RAW图。RAW图每个像素的bit深度,决定了图像的动态范围和色彩精度。常见的有RAW10、RAW12、RAW16。

你可能会问:为什么不用8bit?8bit不是更省带宽吗?

嗯,8bit确实省,但手机影像现在追求的是高动态范围(HDR)。8bit只能表示256个灰度级,拍大光比场景时,亮部一片白、暗部一片黑。RAW10有1024级,RAW12有4096级,RAW16更是达到65536级。级数越多,后期拉曲线、做HDR合成的空间就越大。

我列个表,把三种格式的带宽占用算清楚:

格式 每像素bit数 200万像素(1080P)单帧大小 30fps带宽需求 典型应用
RAW10 10 bit ~2.5 MB ~600 Mbps 中端手机主摄
RAW12 12 bit ~3.0 MB ~720 Mbps 旗舰手机主摄
RAW16 16 bit ~4.0 MB ~960 Mbps 专业相机、计算摄影

注意,这里说的是原始带宽。实际MIPI传输时,还要加上包开销、帧头帧尾、ECC校验等,大概多出5%~10%。

我在项目中遇到过一个问题:某款Sensor标称支持RAW12输出,但实际配置时发现,它内部ADC只有10bit精度,RAW12是靠软件插值填出来的。这种“假RAW12”拍出来的图像,暗部噪声大得离谱。所以选Sensor时,一定要看ADC的真实bit数,别只看输出格式。

避坑指南:我曾经在选型时只看Sensor datasheet的“Output Format”一栏,结果被坑了一次。后来我养成了习惯——先查ADC精度,再确认输出格式。ADC精度决定了信噪比上限,输出格式只是打包方式。

3.3 MIPI CSI-2 协议栈

MIPI CSI-2协议栈分四层,从下往上分别是:

  1. 物理层(PHY):D-PHY或C-PHY,负责电气信号、时钟恢复、差分传输。
  2. 通道管理层(Lane Management):把数据分发到多个Lane上,或者从多个Lane合并回来。
  3. 协议层(Protocol Layer):定义数据包格式,包括长包(Long Packet)和短包(Short Packet)。
  4. 应用层(Application Layer):定义像素数据的排列方式,比如RAW10的打包格式、YUV的排列顺序。

我画了一张协议栈的结构图,帮你理解各层的关系:

MIPI CSI-2 协议栈结构 应用层(Application Layer) 像素排列:RAW10打包、YUV422、RGB888 协议层(Protocol Layer) 长包(帧数据)+ 短包(帧同步、行同步) 通道管理层(Lane Management) 数据分发/合并、Lane重排序、ECC校验 物理层(PHY Layer) D-PHY / C-PHY、差分信号、时钟恢复 数据流方向:Sensor → 应用层 → 协议层 → 通道管理层 → 物理层 → SoC

这张图你多看几遍。我面试架构师时,经常让候选人对着这张图讲数据流。能讲清楚的人,MIPI这块基本没问题。

3.3.1 物理层:D-PHY vs C-PHY

物理层目前主流是D-PHY,C-PHY是后来推出的,速率更高但兼容性差一些。

参数 D-PHY v1.2 D-PHY v2.0 C-PHY v1.0
每通道最大速率 2.5 Gbps 4.5 Gbps ~5.7 Gbps(等效)
信号线数量 2根/通道(Data+Clk) 2根/通道 3根/通道(无独立时钟)
时钟方式 DDR时钟(双边沿采样) DDR时钟 嵌入式时钟(无时钟线)
功耗 较低 中等 较高
手机应用 广泛 旗舰机开始采用 少量高端平台

我个人习惯,在带宽需求不超过10 Gbps时,优先选D-PHY。原因很简单:成熟、稳定、调试工具多。C-PHY虽然速率高,但嵌入式时钟对抖动更敏感,PCB layout要求也更高。我见过一个项目,C-PHY的通道眼图总是闭合,最后发现是电源纹波太大,折腾了两个月才解决。

3.3.2 协议层:长包与短包

协议层定义了两种数据包:

  • 短包(Short Packet):32 bit固定长度,用于帧同步(Frame Start/End)、行同步(Line Start/End)。不携带像素数据。
  • 长包(Long Packet):可变长度,包含包头(32 bit)、数据负载(像素数据)、包尾(16 bit CRC校验)。

一个典型的帧传输序列是这样的:

FS(帧开始短包) → LS(行开始短包) → 长包(第1行数据) → LE(行结束短包)
                         → LS → 长包(第2行数据) → LE
                         → ...
                         → LS → 长包(第N行数据) → LE
FE(帧结束短包)

这里有个细节:行开始和行结束短包不是必须的。有些Sensor为了省带宽,只在帧开始和帧结束发短包,行数据用长包连续发送。但这样一旦丢包,整帧数据就错位了。我建议在调试阶段,让Sensor把行同步短包打开,方便定位问题。

注意:我曾经遇到一个Bug,Sensor输出的帧序列里,FS和FE短包的数据类型(Data Type)字段写反了。SoC端按标准解析,结果把帧开始当成帧结束,直接丢弃了整帧数据。排查了三天才发现是Sensor固件配置错误。所以,拿到新Sensor时,先用逻辑分析仪抓一下MIPI波形,确认短包的数据类型是否正确。

3.3.3 应用层:RAW10打包格式

应用层定义了像素数据怎么塞进长包的数据负载里。以RAW10为例,每个像素10 bit,但MIPI传输是按字节(8 bit)对齐的。所以需要一种打包方式,把4个10 bit像素塞进5个字节里。

打包规则如下:

像素0: [9:2] → Byte0
像素0: [1:0] + 像素1: [9:4] → Byte1
像素1: [3:0] + 像素2: [9:6] → Byte2
像素2: [5:0] + 像素3: [9:8] → Byte3
像素3: [7:0] → Byte4

你看,5个字节刚好装下4个10 bit像素,没有浪费。这种打包方式叫“4像素打包”,是MIPI CSI-2标准里规定的。

RAW12的打包类似,2个12 bit像素装进3个字节。RAW16最简单,每个像素直接占2个字节,不需要特殊打包。

我在项目中遇到过一个问题:某款ISP只支持RAW10的“4像素打包”方式,但Sensor输出的是“2像素打包”(2个10 bit像素装进3个字节,有浪费)。结果ISP解析出来的图像全是乱的。后来我让Sensor厂商改了固件里的打包模式,才对齐。

经验之谈:选Sensor和ISP时,一定要确认双方支持的RAW打包格式是否一致。MIPI标准里定义了多种打包方式,不是所有芯片都支持全部方式。最好在项目初期就做一次MIPI数据抓包验证,别等到调通I2C、点亮Sensor后才发现问题。

3.4 本章小结

这一章我们聊了三个核心点:

  • 接口类型:MIPI CSI-2是手机影像的主流,DVP和LVDS基本退场。
  • 数据格式:RAW10/12/16决定了图像质量和带宽需求,选型时要关注ADC真实精度。
  • 协议栈:四层结构(物理层→通道管理层→协议层→应用层),每层都有坑,调试时建议从物理层开始逐层排查。