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,刚好够用。
我的经验: 调试时先确认 Clock Lane 有没有稳定输出。用示波器看差分波形,如果幅值不够或者抖动太大,后面的数据 Lane 基本不用看了。

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 号区分。

注意: 虚拟通道虽然方便,但会增加协议开销。如果 Lane 带宽已经吃紧,建议还是老老实实分时复用或者用多组 Lane。

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 是更明智的选择。

避坑指南: 我曾经在一个项目里用并行接口接 720p 的 Sensor,PCLK 跑到 74.25 MHz。结果因为 PCB 走线等长没做好,数据线之间 skew 太大,图像一直有噪点。后来加了蛇形走线才搞定。并行接口对 PCB 布局要求很高,新手慎用。

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 快得多。

我的习惯: 如果 Sensor 支持 SPI 和 I2C 两种模式,我优先选 SPI。原因很简单——调试方便。SPI 是全双工,读写可以同时进行,而且没有 I2C 那种复杂的仲裁和时钟拉伸问题。

2.5 接口选择决策流程

说了这么多,到底怎么选?我画了个流程图,帮你理清思路。

接口选择决策流程 接口选择决策流程 开始选择接口 传输距离 > 30cm? (考虑线缆长度、PCB走线) 是 推荐 LVDS 否 功耗敏感? (电池供电、散热受限) 是 推荐 Sub-LVDS 否 带宽 > 1 Gbps? (分辨率、帧率、位深) 是 推荐 MIPI CSI-2 否 推荐并行接口 注:控制总线(I2C/SPI)独立于图像数据接口,所有方案均需搭配使用

嗯,这张图基本覆盖了大部分场景。不过实际项目里,还得考虑芯片支持、成本、供应链等因素。比如有些处理器只支持 MIPI,那你就没得选了。