硬件接口基础: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两根线传一路数据。我见过不少新手把这两根线接反了,结果图像花屏。嗯,这个坑我踩过。
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的调试方法,包括怎么用示波器抓波形、怎么分析协议错误。到时候我会分享一些实战中遇到的坑,保证让你少走弯路。