2. Sensor硬件接口与协议

做Sensor驱动,第一关就是搞懂硬件怎么连的。你想想看,Sensor拍完一张Raw图,数据得从芯片里搬出来,搬到主控那边去处理。这个搬运过程,靠的就是我们今天要聊的这几条路:MIPI CSI-2、DVP、LVDS,还有控制用的I2C和SPI。

我个人习惯,拿到一块新Sensor,先看它的数据手册里接口类型。接口选错了,后面调优全是白费功夫。咱们一个一个来拆。

2.1 MIPI CSI-2:当前主流

MIPI CSI-2,说白了就是手机和嵌入式摄像头的事实标准。它用差分信号传输,抗干扰强,速率高,线数还少。

物理层:D-PHY

CSI-2的物理层通常是D-PHY。一组差分对叫一条Lane,包含一对时钟线和一对或多对数据线。每条Lane能跑到几Gbps。我最早调RK3288时,MIPI速率才1Gbps左右,现在动不动就2.5Gbps甚至更高。

协议层:长包与短包

CSI-2协议把数据分成两种包:

  • 短包:只有32位,用来传帧开始、帧结束、行开始、行结束这些同步信号。
  • 长包:包含包头、有效数据(像素)、包尾。包头里有个重要的东西——虚拟通道(Virtual Channel, VC)。

VC有什么用?一条MIPI总线上可以挂多个Sensor,每个Sensor用不同的VC号,主控就能区分数据是谁发的。我在项目中遇到过,两个Sensor共用一组MIPI Lane,结果VC配重了,图像花成一片。嗯,这里要注意,VC号必须唯一。

数据类型(DT)

长包的包头里还有一个字段叫Data Type,告诉主控这包数据是什么格式。比如:

DT值 格式 说明
0x2B RAW10 10位Raw数据,最常见
0x2C RAW12 12位Raw,高动态场景用
0x1E YUV422 8bit 压缩后的YUV数据
0x24 RGB888 RGB格式,少用

驱动里配置DT必须和Sensor输出一致,否则主控解析出来的图像颜色全错。

我的习惯:调试MIPI时,先用示波器看时钟和数据线的眼图。眼图张不开,说明信号质量不行,降速率或者调驱动强度。别一上来就调软件,硬件先搞定。

2.2 DVP接口:老将,但还在用

DVP(Digital Video Port)是并行接口。一根像素时钟,一根行同步(HSYNC),一根场同步(VSYNC),再加上8/10/12根数据线。数据在时钟的上升沿或下降沿被采样。

优点:简单,主控只要有GPIO就能模拟。调试起来也直观,逻辑分析仪一抓,波形一看就明白。

缺点:线太多,速率上不去。超过100MHz时钟,线间串扰就很严重了。我做过一个项目,DVP线长了10cm,图像就开始出现条纹。后来换成MIPI,问题解决。

时序要求:

  • VSYNC:帧同步,高电平或低电平有效,持续一帧时间。
  • HSYNC:行同步,每行数据开始前跳变。
  • PCLK:像素时钟,每个时钟传一个像素。
  • DATA:像素数据,在PCLK边沿被锁存。
避坑:我曾经遇到过DVP数据线顺序接反的情况。Sensor输出D0-D7,主控那边D7-D0。结果图像颜色完全不对,但轮廓是清晰的。排查了半天,最后发现是原理图标错了。所以,画板子时一定要再三核对数据线顺序。

2.3 LVDS接口:长距离传输的王者

LVDS(Low-Voltage Differential Signaling)也是差分信号,但和MIPI不同,它主要用于工业相机、车载摄像头这些需要长距离传输的场景。

特点:

  • 差分信号,抗干扰强,传输距离可达10米以上。
  • 速率高,单对线能到几百Mbps到几Gbps。
  • 通常用4对数据线+1对时钟线,或者更多。

与MIPI的区别:

特性 MIPI CSI-2 LVDS
协议复杂度 高,有包结构、VC、ECC 低,只传串行数据
传输距离 通常<30cm 可达10m+
功耗 低 中等
应用场景 手机、平板、嵌入式 工业、车载、安防

在RK平台上,LVDS用得不多,但如果你做车载方案,肯定会碰到。驱动里需要配置LVDS的映射模式(比如JEIDA或VESA),否则图像数据错位。

2.4 I2C/SPI控制接口:Sensor的大脑

数据通路讲完了,那怎么控制Sensor呢?比如设置曝光时间、增益、输出格式。这些靠I2C或SPI。

I2C:

  • 两根线:SCL(时钟)、SDA(数据)。
  • 地址:每个Sensor有一个7位或10位地址。我习惯在驱动里先读一下Sensor的ID寄存器,确认I2C通信正常。
  • 速率:标准模式100kHz,快速模式400kHz,高速模式3.4MHz。RK平台通常用400kHz。

SPI:

  • 四根线:SCLK、MOSI、MISO、CS。
  • 速率更高,适合需要快速配置大量寄存器的场景。
  • 全双工,可以同时读写。

我的选择:大部分Sensor用I2C就够了。只有那些寄存器特别多、配置特别复杂的Sensor,比如一些高帧率全局快门Sensor,我才会用SPI。SPI的调试比I2C麻烦一点,因为线多,时序要求更严格。

调试技巧:I2C通信出问题时,先量SCL和SDA的波形。看有没有拉低、有没有毛刺。我曾经遇到一个案子,I2C上拉电阻选错了,信号上升沿太慢,导致通信不稳定。换成4.7kΩ电阻后,问题解决。

2.5 知识结构图:接口与协议全景

下面这张图,把今天讲的几个接口和它们的关系串起来了。你可以把它当作一个快速参考。

Sensor硬件接口与协议全景图 Sensor硬件接口与协议全景 图像传感器 (Sensor) 数据接口 MIPI CSI-2 DVP (并行) LVDS (串行) 控制接口 I2C (SCL/SDA) SPI (SCLK/MOSI/MISO/CS) 数据接口负责传图像,控制接口负责配寄存器。两者缺一不可。 调试时先确认控制接口通,再查数据接口。

这张图里,Sensor是中心,数据接口和控制接口是两条腿。数据接口负责把图像数据搬出去,控制接口负责告诉Sensor怎么干活。调试时,我永远先确认控制接口通不通——读一下Sensor的ID寄存器,能读到,说明I2C/SPI没问题。然后再去抓数据接口的波形。