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输出一致,否则主控解析出来的图像颜色全错。
2.2 DVP接口:老将,但还在用
DVP(Digital Video Port)是并行接口。一根像素时钟,一根行同步(HSYNC),一根场同步(VSYNC),再加上8/10/12根数据线。数据在时钟的上升沿或下降沿被采样。
优点:简单,主控只要有GPIO就能模拟。调试起来也直观,逻辑分析仪一抓,波形一看就明白。
缺点:线太多,速率上不去。超过100MHz时钟,线间串扰就很严重了。我做过一个项目,DVP线长了10cm,图像就开始出现条纹。后来换成MIPI,问题解决。
时序要求:
- VSYNC:帧同步,高电平或低电平有效,持续一帧时间。
- HSYNC:行同步,每行数据开始前跳变。
- PCLK:像素时钟,每个时钟传一个像素。
- DATA:像素数据,在PCLK边沿被锁存。
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麻烦一点,因为线多,时序要求更严格。
2.5 知识结构图:接口与协议全景
下面这张图,把今天讲的几个接口和它们的关系串起来了。你可以把它当作一个快速参考。
这张图里,Sensor是中心,数据接口和控制接口是两条腿。数据接口负责把图像数据搬出去,控制接口负责告诉Sensor怎么干活。调试时,我永远先确认控制接口通不通——读一下Sensor的ID寄存器,能读到,说明I2C/SPI没问题。然后再去抓数据接口的波形。