3、图像传感器接口协议(一):OV5640/MT9V034等常见CMOS传感器介绍、SCCB/I2C配置总线详解、寄存器配置实战

3.1 为什么先聊传感器?

做图像采集,传感器就是眼睛。眼睛不好使,后面算法再牛也白搭。

我刚开始做FPGA图像项目时,踩过一个坑:选了个不熟悉的传感器,结果花了三周才把图像调出来。后来我学乖了,先花两天把传感器手册吃透,反而更快。

所以这一章,咱们把常见的CMOS传感器聊透。重点讲OV5640和MT9V034,顺便说说SCCB/I2C总线怎么玩。

3.2 常见CMOS传感器对比

先看一张表,心里有个底。

型号 分辨率 像素尺寸 帧率 接口 典型应用
OV5640 500万 (2592x1944) 1.4μm 15fps@全分辨率 DVP/MIPI 手机、监控
MT9V034 30万 (752x480) 6μm 60fps@全分辨率 DVP 工业、机器视觉
OV7670 30万 (640x480) 3.6μm 30fps DVP 入门学习
IMX219 800万 (3280x2464) 1.12μm 30fps@1080p MIPI 树莓派摄像头

我个人习惯:做工业项目首选MT9V034。为什么?像素大,感光好,抗噪能力强。你想想看,工厂环境光线复杂,小像素传感器很容易出噪点。

核心观点:选传感器不是越贵越好,也不是像素越高越好。要看你的应用场景。

  • 做监控:选OV5640,分辨率高,细节丰富
  • 做工业检测:选MT9V034,全局快门,无拖影
  • 做入门学习:选OV7670,便宜,资料多

3.3 OV5640 深度解析

OV5640是OmniVision的明星产品。500万像素,支持DVP和MIPI两种接口。我在项目中用过它做车牌识别,效果不错。

关键特性:

  • 支持自动曝光、自动白平衡
  • 内置ISP,可以输出RGB565、YUV422等格式
  • 最大帧率:15fps@2592x1944,90fps@VGA
  • 工作电压:核心1.5V,IO 1.8V/2.8V

注意:OV5640的MIPI接口是4-lane的,FPGA选型时要注意。低端FPGA可能没有MIPI硬核,只能用DVP接口。

3.4 MT9V034 深度解析

MT9V034是Aptina(现属安森美)的工业级传感器。30万像素,但每个像素有6μm大。说白了,就是每个像素点能收集更多光。

为什么工业项目爱用它?

  • 全局快门:拍运动物体不会变形
  • 高动态范围:能同时看清亮区和暗区
  • 帧率灵活:可以跑到120fps@VGA

我记得有一次做流水线检测,产品跑得很快。用OV5640拍出来全是拖影,换成MT9V034就清晰了。这就是全局快门的优势。

3.5 SCCB/I2C 配置总线详解

传感器需要配置才能工作。比如设置分辨率、帧率、曝光时间等。这些配置通过SCCB或I2C总线完成。

SCCB vs I2C:

特性 SCCB I2C
协议 OmniVision私有 标准协议
数据线 SIOC + SIOD SCL + SDA
从机地址 7位 7位或10位
写操作 ID地址 + 寄存器地址 + 数据 ID地址 + 寄存器地址 + 数据
读操作 需要两次传输 需要两次传输

其实SCCB和I2C非常像。OV5640用的是SCCB,但FPGA可以直接用I2C控制器驱动它。我试过,完全兼容。

3.6 寄存器配置实战

光说不练假把式。咱们直接上手配置OV5640。

配置流程:

  1. 上电复位,等待至少20ms
  2. 初始化I2C控制器
  3. 写入传感器ID寄存器,验证通信
  4. 写入配置序列
  5. 等待传感器稳定输出

下面是一段典型的配置代码(Verilog风格):

// OV5640 初始化配置序列(部分)
// 格式:{寄存器地址, 数据}
reg [15:0] ov5640_init_seq[] = {
    16'h3103, 16'h11,  // 软复位
    16'h3008, 16'h82,  // 进入待机模式
    16'h3035, 16'h21,  // PLL配置
    16'h3036, 16'h46,  // PLL倍频
    16'h371C, 16'h03,  // 模拟电路配置
    16'h3630, 16'h36,  // 传感器配置
    16'h3808, 16'h05,  // 输出宽度高字节
    16'h3809, 16'h10,  // 输出宽度低字节 (1296)
    16'h380A, 16'h03,  // 输出高度高字节
    16'h380B, 16'hC0,  // 输出高度低字节 (960)
    16'h3008, 16'h02   // 退出待机模式
};

避坑指南:我曾经在配置OV5640时,忘了等软复位完成就写寄存器,结果传感器一直没反应。后来加了20ms延时,问题解决。记住:传感器需要时间稳定。

3.7 知识体系结构图

下面这张图,帮你理清本章的知识脉络。

图像传感器接口协议 常见CMOS传感器 OV5640 MT9V034 OV7670 IMX219 配置总线 SCCB I2C 时序:SCL + SDA 寄存器配置实战 上电复位 → 初始化 写入配置序列 验证输出 核心:选对传感器 → 配好总线 → 写对寄存器

3.8 避坑总结

最后,分享几个我踩过的坑:

  • 上电时序:传感器需要稳定的电源和时钟。我曾经用开发板的3.3V直接供电,结果纹波太大,图像全是条纹。后来加了LDO稳压,问题解决。
  • I2C速率:OV5640的SCCB最高支持400kHz。我一开始用1MHz去配,结果通信不稳定。降速到200kHz后,稳如老狗。
  • 寄存器手册:一定要看最新版的手册。我遇到过手册版本不对,寄存器地址都变了,折腾了两天。

嗯,这一章就到这里。传感器是图像采集的第一步,走稳了,后面就顺了。

一句话总结:选传感器看场景,配总线看时序,写寄存器看手册。三者缺一不可。