2. 硬件接口协议:MIPI CSI-2、LVDS、并行接口与I2C/SPI
硬件接口这块,说白了就是Sensor和处理器之间怎么“说话”。我见过不少工程师,算法调得飞起,结果一上硬件就抓瞎——图像花屏、丢帧、甚至完全没数据。嗯,这往往就是接口协议没吃透。
今天咱们就把几个主流接口掰开揉碎。MIPI CSI-2、LVDS、并行接口,还有背后的控制总线I2C/SPI。你想想看,搞懂了这些,Sensor驱动调试至少成功了一半。
2.1 MIPI CSI-2 协议详解
MIPI CSI-2 是目前手机和嵌入式视觉系统里最主流的接口。我个人习惯把它看作一个“差分信号高速公路”——速度快、抗干扰强、线还少。
2.1.1 物理层:D-PHY
CSI-2 的物理层通常是 D-PHY。它用差分对传输,一组 Clock Lane(时钟通道)加 1-4 组 Data Lane(数据通道)。
- Clock Lane:提供源同步时钟,DDR(双沿采样)模式,上升沿和下降沿都传数据。
- Data Lane:传图像数据、同步信号、甚至一些控制指令。
- Lane 速率:从 80 Mbps 到 2.5 Gbps 每通道。我调过一款 4K 的 Sensor,用了 4 Lane 跑 1.5 Gbps,刚好够用。
2.1.2 协议层:数据包格式
CSI-2 的数据是打包传输的。每个包分“包头(Header)”和“包尾(Footer)”。包头里包含了数据类型、虚拟通道号、数据长度等信息。
// 一个典型的 CSI-2 长包结构
// 0x1E (数据类型: YUV420 8bit)
// 0x00 0x10 (虚拟通道 0, 数据长度 16 字节)
// 0xXX ... (16 字节有效数据)
// 0xXX 0xXX (校验和 ECC/CRC)
这里有个坑——数据类型(Data Type, DT)。Sensor 和处理器必须约定好 DT 值。比如 RAW10 是 0x2B,YUV422 8bit 是 0x1E。我曾经遇到过 Sensor 输出 RAW10,但处理器配置成 YUV422,结果图像颜色完全错乱,排查了半天才发现是 DT 没对上。
2.1.3 虚拟通道(Virtual Channel)
CSI-2 支持最多 4 个虚拟通道。什么意思?就是一根物理线上可以同时传多路图像数据。比如双摄模组,两个 Sensor 可以共用同一组 Lane,通过不同的 VC 号区分。
2.2 LVDS 与 Sub-LVDS
LVDS(低压差分信号)是工业相机和车载摄像头的老牌接口。Sub-LVDS 则是它的低功耗变种,在安防和无人机领域很常见。
2.2.1 LVDS 的特点
- 差分传输:抗共模干扰强,适合长距离(几米到十几米)。
- 并行转串行:通常 7:1 或 10:1 串化。比如 7 位并行数据 + 1 位时钟,串化成 4 对差分线。
- 功耗:比 MIPI 高一些,但比并行接口低。
我记得有一次调试车载环视系统,Sensor 和处理器距离超过 30cm,MIPI 信号已经衰减得不行了。换成 LVDS 后,问题迎刃而解。所以,距离是选择接口的关键因素。
2.2.2 Sub-LVDS 的差异
Sub-LVDS 把电压摆幅从 LVDS 的 350mV 降到了 100-200mV。好处是功耗更低,坏处是抗噪能力弱了。在无人机这类对功耗敏感、但走线又短的应用里,Sub-LVDS 很合适。
| 参数 | LVDS | Sub-LVDS | MIPI D-PHY |
|---|---|---|---|
| 电压摆幅 | 350 mV | 100-200 mV | 200 mV |
| 功耗 | 中 | 低 | 低 |
| 传输距离 | ~10 m | ~1 m | ~0.3 m |
| 典型应用 | 工业、车载 | 安防、无人机 | 手机、嵌入式 |
2.3 并行接口
并行接口,也叫 DVP(Digital Video Port)。它是最古老的数字视频接口之一。数据线、行同步(HSYNC)、场同步(VSYNC)、像素时钟(PCLK),一根根线直接连。
- 优点:简单、延迟低、不需要复杂的串化/解串器。
- 缺点:线多(8/10/12 位数据线 + 控制线)、抗干扰差、速率上不去(一般不超过 100 MHz)。
说实话,现在新项目我基本不推荐并行接口了。除非是低分辨率、低帧率的应用,或者你手头有现成的老芯片。否则,MIPI 或 LVDS 是更明智的选择。
2.4 I2C/SPI 控制总线
图像数据走的是上面那些高速接口,但 Sensor 的配置、寄存器读写、状态查询,靠的是 I2C 或 SPI。这两个是控制总线,速度慢但可靠。
2.4.1 I2C:两线制,简单通用
- SCL:时钟线。
- SDA:数据线。
- 速率:标准模式 100 kHz,快速模式 400 kHz,高速模式 3.4 MHz。
- 地址:7 位或 10 位地址,同一总线上可挂多个设备。
调试 I2C 时,我最常用的工具就是逻辑分析仪。抓一下波形,看看起始条件、地址、ACK/NACK 对不对。如果 Sensor 没回应,八成是地址错了或者 Sensor 没上电。
// I2C 写 Sensor 寄存器示例(伪代码)
// 设备地址: 0x30 (7位地址左移1位)
// 寄存器地址: 0x03
// 写入值: 0x42
i2c_start();
i2c_write(0x60); // 设备地址 + 写位
i2c_write(0x03); // 寄存器地址
i2c_write(0x42); // 数据
i2c_stop();
2.4.2 SPI:四线制,速度更快
- SCLK:串行时钟。
- MOSI:主出从入。
- MISO:主入从出。
- CS:片选。
SPI 没有 I2C 那种地址机制,靠 CS 线选设备。速率可以跑到几十 MHz,适合需要批量读写 Sensor 寄存器的场景。比如 Sensor 初始化时,要写几十个寄存器,用 SPI 比 I2C 快得多。
2.5 接口选择决策流程
说了这么多,到底怎么选?我画了个流程图,帮你理清思路。
嗯,这张图基本覆盖了大部分场景。不过实际项目里,还得考虑芯片支持、成本、供应链等因素。比如有些处理器只支持 MIPI,那你就没得选了。