硬件接口与协议:MIPI CSI-2协议详解、I2C/SPI控制接口、GPIO与复位时序、电源管理序列

各位做Camera驱动的朋友,大家好。今天我们来聊聊硬件接口这块硬骨头。说实话,很多驱动问题追根溯源,最后都栽在接口协议的理解上。我自己刚入行那会儿,就因为没搞懂MIPI的LP和HS模式切换,折腾了整整三天。嗯,咱们今天就把这些基础打扎实。

一、MIPI CSI-2协议详解

MIPI CSI-2,说白了就是摄像头和处理器之间的高速公路。它定义了数据怎么从Sensor传到ISP。我个人习惯把它分成三层来看:物理层、协议层、应用层。

1.1 物理层:D-PHY

D-PHY用的是差分信号,一对线传一个通道。为什么用差分?抗干扰能力强。你想想看,板子上那么多高频信号在跑,单端信号很容易被串扰带偏。

D-PHY有两种工作模式:

  • 高速模式(HS):传数据用的,速率能到80Mbps~4.5Gbps每通道
  • 低功耗模式(LP):传控制信号,速率低但省电

这里有个坑。我曾经遇到过一个问题:Sensor输出图像偶尔出现条纹。查了半天,发现是D-PHY的LP到HS切换时序没满足要求。MIPI规范里明确写了,从LP切换到HS,需要先进入LP-11状态,然后经过LP-01、LP-00,最后才进入HS。这个时间窗口是纳秒级的,但就是这几十纳秒,搞不好就会丢数据。

关键时序参数:

  • THS-SETTLE:HS进入后的稳定时间,通常80ns~145ns
  • THS-TERM:终端匹配使能时间
  • TCLK-POST:最后一个数据包后的时钟延续时间

1.2 协议层:数据包格式

CSI-2的数据包分两种:长包和短包。长包传像素数据,短包传帧同步、行同步这些控制信息。

一个长包的结构是这样的:

| 数据标识符(1字节) | 字计数(2字节) | ECC(1字节) | 数据负载 | 校验和(2字节) |

数据标识符里包含了虚拟通道号和数据类型。虚拟通道最多支持4个,这意味着一条MIPI线上可以同时传4路不同的图像数据。我在做双摄项目时就用过这个特性,两个Sensor共用一组MIPI线,省了不少PCB空间。

数据类型定义了像素格式。常见的:

数据类型 说明
RAW8 0x2A 8位原始数据
RAW10 0x2B 10位原始数据,常用
RAW12 0x2C 12位原始数据
YUV422 8bit 0x1E YUV格式
JPEG 0x40 压缩数据

我的经验:调试时如果图像颜色不对,先检查数据类型配置。我曾经把RAW10配成RAW8,图像看起来就是灰蒙蒙的,折腾了半天才发现是这里错了。

二、I2C/SPI控制接口

Sensor的寄存器配置,基本靠I2C或SPI。这两种总线各有千秋,我分别说说。

2.1 I2C接口

I2C是Camera最常用的控制接口。两根线:SCL(时钟)和SDA(数据)。地址一般是7位或10位,Sensor常用7位地址。

写操作流程:

起始条件 -> 设备地址+写位 -> ACK -> 寄存器地址高字节 -> ACK -> 寄存器地址低字节 -> ACK -> 数据 -> ACK -> 停止条件

读操作稍微复杂点,需要先写寄存器地址,再重新发起始条件读数据。

这里有个常见问题:I2C时钟频率。Sensor的I2C通常支持100kHz和400kHz。但有些Sensor对时序要求比较苛刻,我遇到过一款Sensor,用400kHz读寄存器偶尔会返回0xFF,降到100kHz就正常了。所以我的习惯是:调试阶段先用100kHz,稳定后再尝试提高频率。

注意:I2C的上拉电阻也很关键。电阻太大,上升沿变慢;电阻太小,功耗增加。一般4.7kΩ是比较稳妥的选择。如果I2C总线上挂的设备多,可以适当减小到2.2kΩ。

2.2 SPI接口

SPI比I2C快,但多占一根线。Sensor用SPI的场合不多,主要是高分辨率或高帧率的Sensor,因为I2C的速率可能成为瓶颈。

SPI有四种模式,由CPOL(时钟极性)和CPHA(时钟相位)决定。Sensor常用模式0(CPOL=0, CPHA=0)或模式3(CPOL=1, CPHA=1)。

我个人建议:如果Sensor支持SPI和I2C两种接口,优先选I2C。为什么?因为SPI的片选信号处理不好容易出问题。我曾经有个项目,SPI的片选信号没加去耦电容,导致Sensor偶尔不响应,查了整整两天才找到原因。

三、GPIO与复位时序

GPIO看似简单,但复位时序搞不好,Sensor根本起不来。

3.1 复位时序要求

Sensor的复位分两种:硬件复位(通过RST引脚)和软件复位(通过寄存器)。硬件复位更彻底,但时序要求更严格。

典型的硬件复位时序:

1. 拉低RST引脚
2. 保持低电平至少1ms(有些Sensor要求10ms)
3. 拉高RST引脚
4. 等待至少20ms(等待内部PLL稳定)
5. 开始I2C配置

这个时序看起来简单,但我在项目中遇到过一个问题:系统启动时,Sensor的复位引脚和主控的GPIO默认状态不一致。主控GPIO默认是高电平,但Sensor的RST引脚需要先低后高。结果就是Sensor根本没被复位,直接进入了未知状态。

解决方案:在驱动初始化时,先明确设置GPIO方向,再控制电平状态。不要依赖默认值。

3.2 其他重要GPIO

除了复位,还有几个GPIO需要注意:

  • PWDN(Power Down):省电模式控制,高电平进入省电模式
  • FSYNC(帧同步):用于多Sensor同步
  • MCLK(主时钟):Sensor的工作时钟,通常由主控提供

MCLK的频率精度很重要。Sensor内部PLL会根据MCLK倍频出像素时钟。如果MCLK不准,输出的帧率就会偏离预期。我见过一个案例,MCLK的晶振精度是±50ppm,结果帧率偏差了0.5%,长时间录像后音视频不同步了。

四、电源管理序列

电源管理是Camera驱动里最容易出问题的地方。Sensor通常需要多路电源:

电源名称 典型电压 用途
AVDD 2.8V 模拟电路供电
DVDD 1.2V~1.8V 数字核心供电
IOVDD 1.8V I/O接口供电

4.1 上电时序

上电顺序很重要。一般要求:先给AVDD,再给DVDD,最后给IOVDD。为什么?因为模拟电路需要先稳定,数字电路才能正常工作。如果顺序反了,可能会损坏Sensor。

典型的上电时序:

1. AVDD上电 -> 等待0.1ms
2. DVDD上电 -> 等待0.1ms
3. IOVDD上电 -> 等待1ms
4. MCLK提供时钟 -> 等待1ms
5. 拉高RST引脚 -> 等待20ms
6. 开始I2C配置

下电时序正好相反:先关IOVDD,再关DVDD,最后关AVDD。

注意:不同Sensor的电源时序要求可能不同。一定要看Datasheet。我吃过这个亏,有一次没仔细看时序要求,结果Sensor在上电瞬间电流异常,烧了三个样机。

4.2 电源纹波要求

Sensor对电源纹波很敏感。特别是AVDD,纹波太大会导致图像出现横纹或噪点。一般要求纹波小于20mV。

如果发现图像有低频条纹,先别急着调驱动,用示波器看看电源纹波。我有个项目,图像一直有50Hz的滚动条纹,查到最后是电源适配器的纹波太大,换了LDO就好了。

我的建议:在Sensor的电源引脚附近加一个10μF的电解电容和0.1μF的陶瓷电容。电解电容滤低频,陶瓷电容滤高频。这个组合基本能解决大部分电源噪声问题。

五、总结

好了,这一章的内容就到这里。MIPI CSI-2、I2C/SPI、GPIO复位、电源管理,这四个方面是Camera驱动的硬件基础。你想想看,如果这些基础没打好,后面调图像质量、调帧率,都会遇到各种莫名其妙的问题。

下一章我们会讲Sensor的初始化流程和寄存器配置。到时候我会分享一些我在调试过程中积累的实用技巧。咱们下章见。