硬件接口基础:MIPI CSI-2协议详解、DVP并行接口、USB摄像头协议

做摄像头驱动这些年,我接触最多的就是这三种接口。MIPI CSI-2、DVP、USB,各有各的脾气。今天咱们就掰开揉碎了聊聊它们。

一、MIPI CSI-2协议详解

MIPI CSI-2,说白了就是手机摄像头的主流接口。现在市面上绝大多数手机、平板、笔记本里的摄像头,走的都是这个协议。

为什么它这么流行?因为速度快,功耗低,而且抗干扰能力强。我当年第一次调MIPI接口时,被它的差分信号搞得有点懵——明明是两根线传一个信号,后来才明白,这就是差分传输的魅力。

1. 物理层:D-PHY

MIPI CSI-2的物理层用的是D-PHY。它有两种模式:

  • 高速模式(HS):数据传输时用,速度可达80Mbps到4.5Gbps每通道
  • 低功耗模式(LP):控制信号用,电压低,省电

这里有个关键点:MIPI是差分信号,用Dp和Dn两根线传一路数据。我见过不少新手把这两根线接反了,结果图像花屏。嗯,这个坑我踩过。

注意:MIPI走线必须等长,差分对内的两根线长度差不能超过5mm。否则信号时序会出问题,图像会出现条纹。

2. 协议层:CSI-2

CSI-2协议定义了数据怎么打包、怎么传输。它把数据分成一个个包,每个包有包头和包尾。

数据包类型主要有:

  • 长包:传图像数据,比如一行像素
  • 短包:传控制信息,比如帧同步、行同步

我习惯把CSI-2的传输想象成快递包裹。短包是快递单,告诉接收方「这箱货是什么」。长包是货物本身。接收方先看快递单,再决定怎么处理货物。

3. 数据格式

CSI-2支持多种图像格式。常用的有:

格式 描述 每像素位数
RAW8 原始Bayer数据,8位 8
RAW10 原始Bayer数据,10位 10
YUV422 亮度和色度分离 16
RGB565 红绿蓝各5/6/5位 16

我个人建议,如果做图像处理,尽量用RAW格式。因为原始数据没有经过压缩,信息最完整。YUV422虽然省带宽,但会损失一些色彩信息。

二、DVP并行接口

DVP,全称Digital Video Port。这是老前辈了,在MIPI普及之前,摄像头基本都是用DVP接口。

DVP的特点就是简单粗暴。它用多根数据线同时传数据,一根线传一个bit。比如8位数据,就用8根线同时传。

1. 信号定义

DVP接口的信号线包括:

  • PCLK:像素时钟,每个时钟传一个像素
  • HSYNC:行同步信号,一行开始时会拉高
  • VSYNC:帧同步信号,一帧开始时会拉高
  • DATA[7:0]:8位数据线

你想想看,DVP的时序其实很直观。VSYNC来了,表示新的一帧开始。然后HSYNC一次次拉高,每拉高一次,就传一行数据。PCLK每跳一次,数据线上就有一个像素。

关键点:DVP的时序必须严格对齐。我曾经遇到过一个问题,HSYNC的宽度不对,导致图像偏移了半个屏幕。查了两天才发现是FPGA里的计数器配错了。

2. DVP的优缺点

优点很明显:

  • 协议简单,容易调试
  • 延迟低,适合实时性要求高的场景
  • 成本低,不需要额外的SerDes芯片

缺点也很突出:

  • 数据线多,占用IO口多
  • 速度上不去,一般不超过100MHz
  • 抗干扰能力差,线多了容易串扰

我记得有个项目,客户非要在一款老芯片上用DVP接500万像素的摄像头。结果PCLK跑到96MHz,图像边缘全是噪点。最后没办法,只能降分辨率用。

三、USB摄像头协议

USB摄像头,大家应该都用过。插上就能用,方便得很。但背后的协议其实挺复杂的。

1. UVC协议

USB Video Class,简称UVC。这是USB组织定义的标准协议,让摄像头可以即插即用。

UVC协议定义了:

  • 怎么枚举设备
  • 怎么配置分辨率、帧率
  • 怎么传输图像数据
  • 怎么控制曝光、白平衡等参数

说白了,UVC就是一套标准接口。摄像头厂商按这个标准做,操作系统就不用装驱动了。Windows、Linux、macOS都内置了UVC驱动。

2. 传输方式

USB摄像头主要用两种传输方式:

  • 等时传输(Isochronous):保证带宽,但不保证数据完整。适合视频流,丢几帧没关系
  • 批量传输(Bulk):保证数据完整,但不保证带宽。适合截图、拍照

我建议做视频采集时用等时传输。因为视频流对实时性要求高,偶尔丢一帧人眼看不出。但如果是做工业检测,那就得用批量传输,一帧都不能丢。

小技巧:调试USB摄像头时,可以用lsusb命令查看设备信息。在Linux下,用v4l2-ctl可以查看和设置摄像头参数。比如:

v4l2-ctl --list-formats-ext
v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=YUYV

3. 带宽计算

USB 2.0的理论带宽是480Mbps,但实际可用只有约400Mbps。USB 3.0是5Gbps,实际约4Gbps。

算一下:1080p、30fps、YUV422格式,每像素16位。带宽需求是:

1920 × 1080 × 30 × 16 = 995,328,000 bps ≈ 950 Mbps

你看,USB 2.0根本扛不住。所以USB 2.0的摄像头最高只能到720p 30fps。想上1080p,必须用USB 3.0。

四、三种接口对比

特性 MIPI CSI-2 DVP USB
速度 高(最高4.5Gbps/通道) 低(一般≤100MHz) 中(USB 3.0可达4Gbps)
线数 少(2-4对差分线) 多(10-20根) 少(4根)
功耗
协议复杂度
适用场景 手机、平板、嵌入式 低端MCU、FPGA PC、树莓派、开发板

选哪种接口,得看你的项目需求。做手机摄像头,MIPI是唯一选择。做工业相机,DVP可能更合适,因为实时性好。做消费级产品,USB最省事。

我个人经验是:如果芯片支持MIPI,优先用MIPI。因为它的扩展性好,以后升级分辨率也方便。DVP虽然简单,但速度瓶颈太明显了。

好了,这三种接口的基础就聊到这儿。下一章咱们会深入讲MIPI CSI-2的调试方法,包括怎么用示波器抓波形、怎么分析协议错误。到时候我会分享一些实战中遇到的坑,保证让你少走弯路。