OV2640了解

OV2640 是 OV(OmniVision)公司生产的一颗 1/4 寸的 CMOS UXGA(1632*1232)图像传感器。该传感器体积小、工作电压低,提供单片 UXGA 摄像头和影像处理器的所有功能。通过 SCCB 总线控制,可以输出整帧、子采样、缩放和取窗口等方式的各种分辨率 8/10 位影像数据。该产品 UXGA 图像最高达到 15 帧/秒(SVGA 可达 30 帧,CIF 可达 60 帧)。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理功能过程包括伽玛曲线、白平衡、对比度、色度等都可以通过 SCCB 接口编程。OmmiVision 图像传感器应用独有的传感器技术,通过减少或消除光学或电子缺陷如固定图案噪声、拖尾、浮散等,提高图像质量,得到清晰的稳定的彩色图像。

OV2640 的特点有:
 高灵敏度、低电压适合嵌入式应用
 标准的 SCCB 接口,兼容 IIC 接口
 支持 RawRGB、RGB(RGB565/RGB555)、GRB422、YUV(422/420)和 YCbCr(422)
输出格式
 支持 UXGA、SXGA、SVGA 以及按比例缩小到从 SXGA 到 40*30 的任何尺寸
 支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹、自动黑电平校
准等自动控制功能。同时支持色饱和度、色相、伽马、锐度等设置。
 支持闪光灯
 支持图像缩放、平移和窗口设置
 支持图像压缩,即可输出 JPEG 图像数据
 自带嵌入式微处理器
在这里插入图片描述
OV2640 传感器包括如下一些功能模块。

  1. 感光整列(Image Array )
    OV2640 总共有 16321232 个像素,最大输出尺寸为 UXGA(16001200),即 200W 像素。
  2. 模拟信号处理( (Analog Processing )
    模拟信号处理所有模拟功能,并包括:模拟放大(AMP)、增益控制、通道平衡和平衡控
    制等。
  3. 10 位 位 A/D 转换( (A/D )原始的信号经过模拟放大后,分 G 和 BR 两路进入一个 10 位的 A/D 转换器,A/D 转换器工作频率高达 20M,与像素频率完全同步(转换的频率和帧率有关)。除 A/D 转换器外,该模块还有黑电平校正(BLC)功能。
  4. 数字信号处理器(DSP )
    这个部分控制由原始信号插值到 RGB 信号的过程,并控制一些图像质量:
     边缘锐化(二维高通滤波器)
     颜色空间转换(原始信号到 RGB 或者 YUV/YCbYCr)
     RGB 色彩矩阵以消除串扰
     色相和饱和度的控制
     黑/白点补偿
     降噪
     镜头补偿
     可编程的伽玛
     十位到八位数据转换
  5. 输出格式模块( (Output Formatter )
    该模块按设定优先级控制图像的所有输出数据及其格式。
  6. 压缩引擎( (Compression Engine)
    在这里插入图片描述
    从图可以看出,压缩引擎主要包括三部分:DCT、QZ 和 entropy encoder(熵编码器),将原始的数据流,压缩成 jpeg 数据输出。
  7. 微处理器( Microcontroller )OV2640 自带了一个 8 位微处理器,该处理器有 512 字节 SRAM,4KB 的 ROM,它提供一个灵活的主机到控制系统的指令接口,同时也具有细调图像质量的功能。
  8. SCCB 接口(SCCB Interface )
    SCCB 接口控制图像传感器芯片的运行,详细使用方法参照光盘的《OmniVision Technologies Seril Camera Control Bus(SCCB) Specification》这个文档
  9. 数字视频接口( Digital Video Port )OV2640 拥有一个 10 位数字视频接口(支持 8 位接法),其 MSB 和 LSB 可以程序设置先后顺序,ALIENTEK OV2640 模块采用默认的 8 位连接方式,如图 40.1.1.3 所示:
    在这里插入图片描述
    OV2640 的寄存器通过 SCCB 时序访问并设置,SCCB 时序和 IIC 时序十分类似,在本章我们不做介绍,请大家参考光《OmniVision Technologies Seril Camera Control Bus(SCCB) Specification》这个文档。

接下来,我们介绍一下 OV2640 的传感器窗口设置、图像尺寸设置、图像窗口设置和图像输出大小设置,这几个设置与我们的正常使用密切相关,有必要了解一下。其中,除了传感器窗口设置是直接针对传感器阵列的设置,其他都是 DSP 部分的设置了,接下来我们一个个介绍。

传感器窗口设置,该功能允许用户设置整个传感器区域(16321220)的感兴趣部分,也就是在传感器里面开窗,开窗范围从 22~1632*1220 都可以设置,不过要求这个窗口必须大于等于随后设置的图像尺寸。传感器窗口设置,通过:0X03/0X19/0X1A/0X07/0X17/0X18 等寄存器设置,寄存器定义请看 OV2640_DS(1.6).pdf 这个文档(下同)。

图像尺寸设置,也就是 DSP 输出(最终输出到 LCD 的)图像的最大尺寸,该尺寸要小于等于前面我们传感器窗口设置所设定的窗口尺寸。图像尺寸通过0XC0/0XC1/0X8C 等寄存器设置。

图像窗口设置,这里起始和前面的传感器窗口设置类似,只是这个窗口是在我们前面设置的图像尺寸里面,再一次设置窗口大小,该窗口必须小于等于前面设置的图像尺寸。该窗口设置后的图像范围,将用于输出到外部。图像窗口设置通过:0X51/0X52/0X53/0X54/0X55/0X57等寄存器设置。

图像输出大小设置,这是最终输出到外部的图像尺寸。该设置将图像窗口设置所决定的窗口大小,通过内部 DSP 处理,缩放成我们输出到外部的图像大小。该设置将会对图像进行缩放处理,如果设置的图像输出大小不等于图像窗口设置图像大小,那么图像就会被缩放处理,只有这两者设置一样大的时候,输出比例才是 1:1 的。

因为 OmniVision 公司公开的文档,对这些设置实在是没有详细介绍。只能从他们提供的初始化代码(还得去 linux 源码里面移植过来)里面去分析规律,所以,这几个设置,都是作
者根据 OV2640 的调试经验,以及相关文档总结出来的,不保证百分比正确,如有错误,还请大家指正。以上几个设置,光看文字可能不太清楚,这里我们画一个简图有助于大家理解,如图 40.1.1.4所示:
在这里插入图片描述
上图,最终红色框所示的图像输出大小,才是 OV2640 输出给外部的图像尺寸,也就是显示在 LCD 上面的图像大小。当图像输出大小与图像窗口不等时,会进行缩放处理,在 LCD 上面看到的图像将会变形。

最后,我们介绍一下 OV2640 的图像数据输出格式。首先我们简单介绍一些定义:

UXGA,即分辨率位 16001200 的输出格式,类似的还有:SXGA(12801024)、WXGA+(1440900) XVGA(1280960)、WXGA(1280800)、XGA(1024768)、SVGA(800600)、VGA(640480)、CIF(352288)、WQVGA(400240)、QCIF(176144)和 QQVGA(160120)等。
PCLK,即像素时钟,一个 PCLK 时钟,输出一个像素(或半个像素)。
VSYNC,即帧同步信号。
HREF /HSYNC,即行同步信号。
OV2640 的图像数据输出(通过 Y[9:0])就是在PCLK,VSYNC 和 HREF/ HSYNC 的控制下进行的。首先看看行输出时序,如图 40.1.1.5 所示:
在这里插入图片描述
从上图可以看出,图像数据在 HREF 为高的时候输出,当 HREF 变高后,每一个 PCLK 时钟,输出一个 8 位/10 位数据。我们采用 8 位接口,所以每个 PCLK输出 1 个字节,且在 RGB/YUV输出格式下,每个 tp=2 个 Tpclk,如果是 Raw 格式,则一个 tp=1 个 Tpclk。比如我们采用 UXGA时序,RGB565 格式输出,每 2 个字节组成一个像素的颜色(高低字节顺序可通过 0XDA 寄存器设置),这样每行输出总共有 16002 个 PCLK 周期,输出 16002 个字节。

在这里插入图片描述
上图清楚的表示了OV2640在UXGA模式下的数据输出。我们按照这个时序去读取OV2640的数据,就可以得到图像数据。

最后说一下 OV2640 的图像数据格式,我们一般用 2 种输出方式:RGB565 和 JPEG。当输出 RGB565 格式数据的时候,时序完全就是上面两幅图介绍的关系。以满足不同需要。而当输
出数据是 JPEG 数据的时候,同样也是这种方式输出(所以数据读取方法一模一样),不过 PCLK数目大大减少了,且不连续,输出的数据是压缩后的 JPEG 数据,输出的 JPEG 数据以:0XFF,0XD8 开头,以 0XFF,0XD9 结尾,且在0XFF,0XD8 之前,或者 0XFF,0XD9 之后,会有不定数量的其他数据存在(一般是 0),这些数据我们直接忽略即可,将得到的0XFF,0XD8~0XFF,0XD9 之间的数据,保存为.jpg/.jpeg 文件,就可以直接在电脑上打开看到图像了。

OV2640 自带的 JPEG 输出功能,大大减少了图像的数据量,使得其在网络摄像头、无线视频传输等方面具有很大的优势。OV2640 我们就介绍到这。

STM32F4 自带了一个数字摄像头(DCMI)接口,该接口是一个同步并行接口,能够接收外部 8 位、10 位、12 位或 14 位 CMOS 摄像头模块发出的高速数据流。可支持不同的数据格式:YCbCr4:2:2/RGB565 逐行视频和压缩数据 (JPEG)。

STM32F4 DCM 接口特点:
● 8 位、10 位、12 位或 14 位并行接口
● 内嵌码/外部行同步和帧同步
● 连续模式或快照模式
● 裁剪功能
● 支持以下数据格式:
1,8/10/12/14 位逐行视频:单色或原始拜尔(Bayer)格式
2,YCbCr 4:2:2 逐行视频
3,RGB 565 逐行视频
4,压缩数据:JPEG

DCMI 接口包括如下一些信号:
1, 数据输入(D[0:13]),用于接摄像头的数据输出,接 OV2640 我们只用了 8 位数据。
2, 水平同步(行同步)输入(HSYNC),用于接摄像头的 HSYNC/HREF 信号。
3, 垂直同步(场同步)输入(VSYNC),用于接摄像头的 VSYNC 信号。
4, 像素时钟输入(PIXCLK),用于接摄像头的 PCLK 信号。
DCMI 接口是一个同步并行接口,可接收高速(可达 54 MB/s)数据流。该接口包含多达14 条数据线(D13-D0)和一条像素时钟线(PIXCLK)。像素时钟的极性可以编程,因此可以在像素时钟的上升沿或下降沿捕获数据。

DCMI 接收到的摄像头数据被放到一个 32 位数据寄存器(DCMI_DR)中,然后通过通用DMA 进行传输。图像缓冲区由 DMA 管理,而不是由摄像头接口管理。

从摄像头接收的数据可以按行/帧来组织(原始 YUV/RGB/拜尔模式),也可以是一系列JPEG 图像。要使能 JPEG 图像接收,必须将 JPEG 位(DCMI_CR 寄存器的位 3)置 1。数据流可由可选的 HSYNC(水平同步)信号和 VSYNC(垂直同步)信号硬件同步,或者通 过数据流中嵌入的同步码同步。
在这里插入图片描述
DCMI 接口的数据与 PIXCLK(即 PCLK)保持同步,并根据像素时钟的极性在像素时钟上升沿/下降沿发生变化。HSYNC(HREF)信号指示行的开始/结束,VSYNC 信号指示帧的开始/结束。DCMI 信号波形如图 40.1.2.2 所示:
在这里插入图片描述
上图中,对应设置为:DCMI_PIXCLK 的捕获沿为下降沿,DCMI_HSYNC 和 DCMI_VSYNC的有效状态为 1,注意,这里的有效状态实际上对应的是指示数据在并行接口上无效时,HSYNC/VSYNC 引脚上面的引脚电平。

本章我们用到 DCMI 的 8 位数据宽度,通过设置 DCMI_CR 中的 EDM[1:0]=00 设置。此时DCMI_D0~D7 有效,DCMI_D8~D13 上的数据则忽略,这个时候,每次需要 4 个像素时钟来捕获一个 32 位数据。捕获的第一个数据存放在 32 位字的 LSB 位置,第四个数据存放在 32 位字的 MSB 位置 ,捕获数据字节在 32 位字中的排布如表 40.1.2.1 所示:
在这里插入图片描述
从表 40.1.2.1 可以看出,STM32F4 的 DCMI 接口,接收的数据是低字节在前,高字节在后的,所以,要求摄像头输出数据也是低字节在前,高字节在后才可以,否则就还得程序上处理字节顺序,会比较麻烦。

DCMI 接口支持 DMA 传输,当 DCMI_CR 寄存器中的 CAPTURE 位置 1 时,激活 DMA接口。摄像头接口每次在其寄存器中收到一个完整的32位数据块时,都将触发一个DMA请求。
DCMI 接口支持两种同步方式:内嵌码同步和硬件(HSYNC 和 VSYNC)同步。我们简单介绍下硬件同步,详细介绍请参考《STM32F4xx 中文数据手册》第 13.5.3 节。
硬件同步模式下将使用两个同步信号 (HSYNC/VSYNC)。根据摄像头模块/模式的不同,可能在水平/垂直同步期间内发送数据。由于系统会忽略 HSYNC/VSYNC 信号有效电平期间内接收的所有数据,HSYNC/VSYNC 信号相当于消隐信号。

为了正确地将图像传输到 DMA/RAM 缓冲区,数据传输将与 VSYNC 信号同步。选择硬件同步模式并启用捕获(DCMI_CR 中的 CAPTURE 位置 1)时,数据传输将与 VSYNC 信号的无效电平同步(开始下一帧时)。之后传输便可以连续执行,由 DMA 将连续帧传输到多个连续的缓冲区或一个具有循环特性的缓冲区。为了允许 DMA 管理连续帧,每一帧结束时都将激活VSIF(垂直同步中断标志,即帧中断),我们可以利用这个帧中断来判断是否有一帧数据采集完成,方便处理数据。

DCMI 接口的捕获模式支持:快照模式和连续采集模式。一般我们使用连续采集模式,通过 DCMI_CR 中的 CM 位设置。另外,DCMI 接口还支持实现了 4 个字深度的 FIFO,配有一个简单的 FIFO 控制器,每次摄像头接口从 AHB 读取数据时读指针递增,每次摄像头接口向FIFO 写入数据时写指针递增。因为没有溢出保护,如果数据传输率超过 AHB 接口能够承受的速率,FIFO 中的数据就会被覆盖。如果同步信号出错,或者 FIFO 发生溢出,FIFO 将复位,DCMI 接口将等待新的数据帧开始。

发布了115 篇原创文章 · 获赞 38 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44146373/article/details/105479035