3. Sensor驱动与数据采集:Sensor初始化、MIPI接口协议、DMA传输、帧同步机制

Sensor驱动,说白了就是让摄像头“活过来”的第一步。很多初学者觉得这不过是调个I2C、配个寄存器,没什么技术含量。但我得说,这个想法很危险。Sensor没配好,后面ISP算法再牛也白搭——你拿到的数据本身就是错的。

我个人习惯把Sensor驱动拆成四个模块来看:初始化、MIPI接口、DMA传输、帧同步。咱们一个一个啃。

3.1 Sensor初始化流程

Sensor上电后,第一件事不是出图,而是配置。你得告诉它:你用多少MCLK、输出什么格式、分辨率多少、帧率多少。这些信息都写在Sensor的寄存器里,通过I2C或SPI写进去。

典型的初始化流程长这样:

  1. 硬件复位——拉低RST引脚,保持至少1ms,再拉高。有些Sensor还需要PWDN引脚配合。
  2. 供电稳定——AVDD、DVDD、IOVDD按顺序上电,不能乱。我踩过坑,有一次IOVDD先于DVDD上电,Sensor直接锁死,读ID都读不出来。
  3. MCLK输入——提供主时钟,常见24MHz或27MHz。频率不对,PLL分频就全乱套。
  4. 读取Sensor ID——验证I2C通信是否正常。如果读不到ID,别急着怀疑Sensor坏了,先查电压和时钟。
  5. 写入初始化序列——按datasheet给的寄存器表,一条一条写。注意有些寄存器需要延迟等待。
  6. 等待稳定——初始化完成后,等几帧时间让Sensor内部PLL和AGC稳定下来。

核心要点:初始化序列不是死搬硬套的。不同模组厂商可能对同一颗Sensor有不同的配置——曝光增益范围、黑电平校正值、甚至输出格式都可能不一样。我建议你拿到模组后,先读一遍所有寄存器,保存一份“出厂快照”,方便后面排查问题。

3.2 MIPI接口协议

MIPI CSI-2是目前手机和嵌入式平台最主流的Sensor接口。它用差分信号传输,一对差分线叫一个Lane。常见的配置有1-Lane、2-Lane、4-Lane。

MIPI的物理层长什么样?我画了个简图:

MIPI CSI-2 传输链路结构 Sensor D-PHY / C-PHY 物理层 Data Lane 0 HS模式: 80Mbps~2.5Gbps LP模式: 控制信号 D-PHY: 1对差分线 ISP / SoC 关键概念: • HS模式传输图像数据,LP模式传输同步信号(FSYNC/VSYNC/HSYNC) • 每个Lane独立传输,接收端按协议重组数据

MIPI传输的数据包结构,我简单归纳一下:

包类型 内容 说明
SoT (Start of Transmission) 0001 1110 每个Lane传输开始时的同步序列
PH (Packet Header) Data ID + Word Count + ECC 标识数据类型(RAW8/RAW10/YUV等)和包长度
Payload 图像数据 按像素格式排列的原始数据
EoT (End of Transmission) 停止状态 传输结束标志

经验之谈:调试MIPI时,我最常用的工具就是逻辑分析仪。抓一下LP模式下的同步信号,看看VSYNC和HSYNC的时序对不对。如果发现数据错位,多半是Lane映射配错了——Sensor的Lane 0不一定对应SoC的Lane 0,中间可能有交叉。

3.3 DMA传输

Sensor通过MIPI把数据发过来,但CPU不可能一条一条去读。这时候就需要DMA——直接内存访问。DMA控制器负责把MIPI接收到的数据搬运到DDR里,CPU只管等中断通知就行。

DMA传输的配置要点:

  • 源地址——MIPI接收FIFO的物理地址,通常是固定的。
  • 目的地址——DDR中预留的帧缓冲区地址。我建议至少分配3个buffer,做ping-pong-pong三缓冲。
  • 传输宽度——根据像素格式来。RAW10的话,4个像素打包成5字节;RAW8就1字节1像素。
  • 行对齐——很多DMA要求每行起始地址64字节对齐。不对齐的话,性能会下降,甚至数据错位。

我曾经在一个项目里,DMA配置成单缓冲模式。结果帧率一高,CPU来不及处理,新数据直接覆盖了旧数据,画面出现撕裂。后来改成三缓冲,问题就解决了。

注意:DMA传输完成后,一定要检查中断状态。有时候MIPI链路不稳定,会导致DMA传输超时或CRC错误。如果忽略这些错误标志,你拿到的图像可能全是坏点。

3.4 帧同步机制

帧同步,说白了就是让Sensor和ISP“对齐节奏”。Sensor按固定帧率输出图像,ISP必须知道每一帧什么时候开始、什么时候结束。

MIPI协议里,帧同步靠内嵌的同步信号实现:

  • VSYNC(垂直同步)——帧开始/结束的标志。高电平表示一帧有效数据正在传输。
  • HSYNC(水平同步)——每行数据的开始/结束标志。
  • HBLANK / VBLANK——行消隐和帧消隐。这段时间不传数据,留给ISP做处理。

帧同步的时序关系,我整理成了一张表:

信号 作用 典型时序
VSYNC 帧同步 高电平持续1~4行时间
HSYNC 行同步 高电平持续4~8个像素时钟
HBLANK 行消隐 每行结束后,持续若干像素时钟
VBLANK 帧消隐 每帧结束后,持续若干行时间

你想想看,如果ISP的帧同步逻辑没写好,会出现什么情况?最常见的就是“帧错位”——ISP以为新帧开始了,实际上还在上一帧的消隐区。结果就是图像上下半截对不上,或者出现花屏。

我的建议:在驱动层,用硬件VSYNC中断来触发帧开始。不要用软件轮询,延迟太大。中断服务程序里,只做两件事:清中断标志、唤醒DMA传输线程。其他处理全部放到线程里做,避免中断占用太久。

3.5 整体数据流

把上面四个模块串起来,整个数据采集链路就清晰了:

Sensor数据采集完整链路 Sensor 输出RAW数据 MIPI CSI-2 差分传输 DMA控制器 搬运到DDR DDR帧缓冲 三缓冲 帧同步信号(VSYNC/HSYNC) 控制传输节奏,保证帧对齐

嗯,到这里,Sensor驱动与数据采集的核心内容就讲完了。总结一下:

  • 初始化——配好寄存器,让Sensor按预期工作。
  • MIPI——物理层传输,注意Lane映射和时序。
  • DMA——高效搬运数据,三缓冲是标配。
  • 帧同步——用硬件中断保证帧对齐,别用轮询。