好的,各位同学。我是你们这门课的讲师,一个在摄像头和图像传感器领域摸爬滚打了十几年的硬件工程师。今天我们开始第三章的内容:MIPI联盟与CSI-2协议简介。 别看这章标题有点学院派,但这套东西,说白了就是摄像头和主控芯片之间沟通的“普通话”。不理解它,你后面配寄存器、调时序,很容易抓瞎。

3、MIPI 联盟与 CSI-2 协议简介:历史、分层结构、数据流模型

3.1 MIPI 联盟的诞生:为什么要“统一度量衡”?

早年间,做手机摄像头简直是个噩梦。每个传感器厂商都有自己的并口协议,排线又多又粗,干扰还大。我刚开始做硬件那会儿,最头疼的就是不同厂商的摄像头接口定义完全不一样,换个供应商,往往意味着整个硬件平台都要大改。

为了解决这种“诸侯割据”的局面,2003年,ARM、诺基亚、ST、TI等几家公司牵头成立了MIPI联盟(Mobile Industry Processor Interface)。我理解,他们的目标很单纯:给移动设备内部的各种芯片,制定一套标准化的、高速的接口规范。

我们最关心的,就是其中专门给摄像头定义的接口标准 —— CSI(Camera Serial Interface)。目前主流是CSI-2,它已经成为业界事实上的标准。无论你用的是索尼、三星还是豪威的传感器,只要它们支持CSI-2,你就能用一套大致相同的方法去连接和配置他们。这就省大事了。

3.2 CSI-2 协议分层:像俄罗斯套娃一样思考

CSI-2 协议并不是一个单一的协议,它分了好几层。我个人习惯把这种分层结构,想象成一个俄罗斯套娃。

来,我们直接看一张图,这是我画的CSI-2协议分层结构,能让你一目了然:

CSI-2 协议分层结构图 CSI-2 协议分层结构 (Protocol Layers) 应用层 (Application Layer) 像素数据重组、帧格式定义(YUV, RAW, JPEG等) 协议层 (Protocol Layer) 长/短数据包、ECC、CRC、虚拟通道 (VC) 数据包拆包与组包 物理层 (Physical Layer) D-PHY / C-PHY 电气特性、低压差分信号 时钟线(CLK) + 数据线(DATA[n:0]) 核心要点:接口的物理形态 vs 传输的内容逻辑 • 物理层定义了“怎么传”:几根线、电压多高、速率多快。 • 协议层定义了“传什么”:数据包的格式、校验、通道。 • 应用层定义了“传的是谁”:RAW10?YUV422?哪个分辨率的图?

嗯,这张图你看明白了,CSI-2的基本骨架就清晰了。我们从上往下、从抽象到具体来捋一捋:

3.2.1 应用层 (Application Layer)

这一层我们接触最多。它定义了最终图像数据长什么样。比如,传感器输出的是一帧1920x1080的RAW10数据,还是1280x720的YUV422数据?像素是如何重组成一帧图像的?帧的开始和结束信号(帧同步)在哪里?这些都由应用层来描述。你在寄存器里配置输出格式,其实就是在跟这一层打交道。

3.2.2 协议层 (Protocol Layer)

这一层负责给原始的视频数据加上“信封”和“邮戳”。它把应用层下来的数据包拆成一个个标准大小的数据包。CSI-2定义了两种主要的数据包:长数据包(存大量像素数据)和短数据包(存控制信息,如帧同步)。

同时,为了实现多路复用(比如一个摄像头既拍照片又传视频流),协议层引入了虚拟通道 (Virtual Channel, VC)。我曾遇到一个客户,想把双目摄像头的两路图像通过同一组MIPI线传给处理器,就是利用VC通道来实现的,省了一组硬件接口。

3.2.3 物理层 (Physical Layer)

这是最底层的“硬功夫”。我们知道MIPI CSI-2主要跑在D-PHY上(当然现在也有C-PHY)。这一层定义了信号电平(一般是1.2V的差分信号),时钟线和数据线的物理连接,以及高速模式下如何传输。说白了,就是负责把协议层的1和0,变成能在PCB铜箔上高速跑起来的差分电压信号。

避坑指南:调试摄像头时,如果图像花屏或者完全没图,很多人第一反应是传感器寄存器配错了。但我建议,先抓一下物理层的波形,看看时钟和数据线上有没有信号?幅值对不对?我曾经花了整整两天时间查一个寄存器,最后发现是D-PHY的端接电阻虚焊了。记住,物理层不稳,协议层和应用层就是空中楼阁。

3.3 数据流模型:一场精心编排的“接力赛”

理解了分层结构,我们再看看数据是怎么从传感器流传到处理器内部的。这就像是一场接力赛,每一棒都有明确的任务。

3.3.1 关键概念:像素到字节的排列

图像传感器是个模拟器件,它把光信号转为电信号,再通过ADC(模数转换器)变成数字信号。比如一个RAW10的传感器,每个像素产生10bits数据。

我们经常看到 RAW10 打包格式 的寄存器配置。为什么要打包?因为D-PHY的数据线宽度是基于Byte(8位)的。你需要把10bits的数据,以特定的排列方式(比如4个像素占用5个字节),变成D-PHY能传输的格式。我自己的经验是,这部分特别容易搞混,一定要仔细看Datasheet里的像素打包图。

3.3.2 数据结构:长数据包 (Long Packet) 与短数据包 (Short Packet)

CSI-2协议传输的基本单元就是数据包。下面这个表格,你调试的时候肯定用得上:

包类型 功能 结构组成 关键点
短数据包 携带控制和同步信息 DI (数据标识符) + WC (字计数) + ECC 用于标记帧开始(FS)、帧结束(FE)、行开始(LS)等。数据体非常短。
长数据包 携带大量像素数据 短包头 (DI+WC+ECC) + 有效数据 + 短包尾 (CRC) 你的图像数据就藏在这里。WC指示了数据长度,CRC用于校验传输错误。

你仔细看,长数据包实际上是由一个“短包头”开始,然后跟一大串数据,最后以一个“短包尾”结束的。ECC(纠错码)能纠正包头里的单比特错误,CRC(循环冗余校验)能检查数据体的完整性。

3.3.3 典型的数据传输序列

那么,一帧图像是怎么传过来的?通常遵循这样的时钟序列:

  1. 大力层高速下电状态 (HS-Idle):数据线进入高速准备的低电平状态。
  2. 帧开始 (Frame Start, FS):发送一个指示新帧开始的短数据包。
  3. 行传输 (Line Transfer):一行一行的像素数据,以长数据包的形式发送。每一行都有一个对应的行开始和行结束(通常是隐式的,由包本身定义)。
  4. 帧结束 (Frame End, FE):发送一个指示当前帧结束的短数据包。
  5. 返回大力层高速下电或省电模式:进入省电模式或者准备下一帧。

小贴士:抓MIPI波形时,不要盯着一大串烦人的数据流发呆。你可以把解码器设置为“侦测短数据包”。当你看到 FS 和 FE 字样出现时,说明传感器在正常发送图像帧。如果没有,先查帧同步相关的寄存器配置。

3.3.4 多路复用:虚拟通道 (Virtual Channel, VC) 与应用

最后聊聊虚拟通道。它是在协议层的包头里,用2个bit定义的(VC ID)。这样,在同一个物理连接(同一组MIPI差分线)上,可以传输4路独立的逻辑视频流。

我举个例子,你就能明白它的价值。一个双摄手机,为了节省主板空间和功耗,经常会让两个摄像头共用一个MIPI接口。主摄像头输出RAW数据,占VC 0;副摄像头输出YUV数据,占VC 1。接收端的处理器(ISP)通过检查VC ID,就能把两路数据分别送往不同的处理模块,互不干扰。

你对VC支持的熟悉程度,决定了你设计的系统是不是足够灵活高效。我个人在设计产品时,只要有多流需求,VC就是我首先考虑的方案,而不是增加物理接口。