LV16-33-OV7725带FIFO模块-03-OV7725简介

本文主要是STM32开发——OV7725带FIFO模块 OV7725的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
SecureCRT Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日
开发板 正点原子 i.MX6ULL Linux阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
STM32开发板 正点原子战舰V3(STM32F103ZET6)
点击查看本文参考资料
  • 通用
分类 网址说明
官方网站https://www.arm.com/ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档
https://www.st.com/content/st_com/zh.htmlST官方网站,在这里我们可以找到STM32的相关文档
https://www.stmcu.com.cn/意法半导体ST中文官方网站,在这里我们可以找到STM32的相关中文参考文档
http://elm-chan.org/fsw/ff/00index_e.htmlFatFs文件系统官网
教程书籍《ARM Cortex-M3权威指南》ARM公司专家Joseph Yiu(姚文祥)的力作,中文翻译是NXP的宋岩
《ARM Cortex-M0权威指南》
《ARM Cortex-M3与Cortex-M4权威指南》
开发论坛http://47.111.11.73/forum.php开源电子网,正点原子的资料下载及问题讨论论坛
https://www.firebbs.cn/forum.php国内Kinetis开发板-野火/秉火(刘火良)主持的论坛,现也做STM32和i.MX RT
https://www.amobbs.com/index.php阿莫(莫进明)主持的论坛,号称国内最早最火的电子论坛,以交流Atmel AVR系列单片机起家,现已拓展到嵌入式全平台,其STM32系列帖子有70W+。
http://download.100ask.net/index.html韦东山嵌入式资料中心,有些STM32和linux的相关资料也可以来这里找。
博客参考http://www.openedv.com/开源网-原子哥个人博客
http://blog.chinaaet.com/jihceng0622博主是原Freescale现NXP的现场应用工程师
cortex-m-resources这其实并不算是一个博客,这是ARM公司专家Joseph Yiu收集整理的所有对开发者有用的官方Cortex-M资料链接(也包含极少数外部资源链接)
点击查看相关文件下载
分类 网址 说明
STM32相关 STM32F103xx英文数据手册 STM32F103xC/D/E系列的英文数据手册
STM32F103xx中文数据手册 STM32F103xC/D/E系列的中文数据手册
STM32F10xxx英文参考手册(RM0008) STM32F10xxx系列的英文参考手册
STM32F10xxx中文参考手册(RM0008) STM32F10xxx系列的中文参考手册
Arm Cortex-M3 处理器技术参考手册-英文版 Cortex-M3技术参考手册-英文版
STM32F10xxx Cortex-M3编程手册-英文版(PM0056) STM32F10xxx/20xxx/21xxx/L1xxxx系列Cortex-M3编程手册-英文版
STM32 HAL库开发实战 野火STM32开发教程在线文档——基于F103系列开发板
STM32库开发实战指南 野火STM32开发教程在线文档——基于野火霸道开发板
SD卡相关 SD卡相关资料——最新版本 有关SD卡的一些资料可以从这里下载
SD卡相关资料——历史版本 有关SD卡的一些历史版本资料可以从这里下载,比如后边看的SD卡2.0协议
SD 2.0 协议标准完整版 这是一篇关于SD卡2.0协议的中文文档,还是比较有参考价值的,可以一看
ESP32 SD卡相关资料——最新版本 这个⼿册介绍了 ESP8266EX 的产品参数。
ESP8266 系列入门教程 一个入门手册(安信可官网)
ESP8266 AT 指令集 这是一篇关于ESSP8266的AT指令集的文档(安信可官网)
ESP8266 AT 指令使用实例 这是一篇关于ESSP8266的AT指令集使用实例的文档(安信可官网)
ESP-AT 用户指南 本指南详细介绍 ESP-AT 是什么、如何连接硬件、以及如何下载和烧录 AT 固件(乐鑫官网)
乐鑫官方技术文档 这里是乐鑫官方技术文档的入口,文档都可以来这里找(乐鑫官网)

一、OV7725简介

1. CCD Sensor与CMOS Sensor

目前市场上采用的图像传感器(Sensor)主要有CCD与CMOS这两种。CCD Sensor的技术比较成熟,一致性较好,色彩还原逼真,在尺寸方面也有一定的优势,但是其工艺复杂、成本高、功耗大,像素提高难度大,技术遇到瓶颈。而CMOS Sensor制造工艺简单,成本相对较低,功耗小,开发简便,在现阶段有较大的发展空间。相关参数的对比如表所示。

image-20240114142822888

CCD Sensor的优势在于分辨率高、动态范围大、成像效果好,但会受到价格和耗电的限制。专业级别的相机及成本不敏感的领域基本都采用大面积的CCD Sensor来获得更好的色彩还原。而CMOS Sensor有动态范围低、噪声大等缺陷,但其优势在于便宜、省电。正是由于CMOs Sensor成本低、开发容易,同时近几年在技术上不断地突破,性能不断提升,通过一定的数字图像处理能够改善其成像的质量,所以在手机、笔记本等移动终端设备中一般都采用CMOS Sensor。

2. CMOS Sensor

目前市场上的摄像头产品大多采用CMOS传感器,主流的有Sony(日本索尼公司)、Panasonic(日本松下公司)、OmniVison(豪威公司)、Onse (Micron公司被Aptina公司收购后又被ONSE公司收购,目前在安森美公司旗下)、Smartsens(思特微公司)、GalaxyCore(格科微公司)等。

image-20240114143032445

3. OV7725

OV7725是OmniVision(豪威科技)公司生产的一颗CMOS图像传感器,该传感器功耗低、可靠性高以及采集速率快,主要应用在玩具、安防监控、电脑多媒体等领域。

二、寄存器配置

在 OV7725 图像传感器的初始化阶段, 主机 MCU 需要使用 SCCB 协议配置 OV7725 中大量的寄存器, 有关 OV7725 寄存器的介绍,可以参考《OV7725_datasheet.pdf》和《OV7725 Software Application Note.pdf》。

三、输出时序

1. 一些定义

  • VGA,即分辨率为 640*480 的输出格式
  • QVGA,即分辨率为 320*240 的输出格式
  • QQVGA, 即分辨率为 160*120 的输出格式
  • PCLK, 即像素时钟,一个 PCLK 时钟, 输出一个像素(或一个 16 位像素数据的高/低 8 位数据)
  • VSYNC, 即场同步信号,也叫帧信号,由摄像头输出,用于标志一帧图像数据的开始与结束。
  • HREF/HSYNC, 即行同步信号

2. RGB565格式下的输出时序

OV7725 图像传感器的 RGB565 输出时序图,如下图所示:

image-20240114143434181

从上图可以看出, OV7725 图像传感器的图像数据从 D[9:2]输出, 并且由于 RGB565 的图像格式中,一个像素占用 2 个字节,因此一个像素的数据被拆分为两个 8 位数据从 D[9:2]输出(上图中的 first byte 和 second byte)。

从时序上看, HREF 变为高电平后, OV7725 图像传感器开始输出一行数据( row data),1 个 PCLK 时钟传输 1 个字节的像素数据,当传输完最后一个字节数据( last byte)后, HREF变为低电平。

3. VGA格式

我们以 VGA 模式为例子,即 OV7725 输出的图像分辨率为 640*480,下面分析一下时序图:

image-20240114143556144

VSYNC:场同步信号,也叫帧信号,由摄像头输出,用于标志一帧图像数据的开始与结束。上图中 VSYNC 的高电平作为一帧的同步信号,在低电平时输出的数据有效。场同步的极性可以通过寄存器 0x15 去设置的。

HREF/HSYNC:行同步信号,由摄像头输出,用来标志一行数据的开始与结束。上图中的HREF 和 HSYNC 是由同一引脚输出的,只是数据的同步方式不一样。 HREF 上升沿就马上输出图像数据,而 HSYNC 会等待一段时间再输出图像数据,如果行中断里需要处理事情再开始采集,显然用 HREF 上升沿是不容易采集到第一个像素数据的。而我们本实验使用的是 HREF 格式输出,当 HREF 为高电平时, 图像数据马上输出并有效。该引脚的极性也是可以通过寄存器0x15 进行设置。

D[9:0]:数据信号,由摄像头输出,在 RGB 格式输出中,只用到 8 个数据引脚,即高 8 位D[9:2]是有效的。

tPCLK:一个像素时钟周期。

tp:单个数据周期,这里我们需要注意上图中左下角的 Note1 和 2 描述,在 RGB 模式中,tp 代表两个 tPCLK(像素时钟)。以 RGB565 数据格式为例, RGB565 采用 16bit 数据表示一个像素点,而 OV7725 在一个像素周期(tPCLK)内只能传输 8bit 数据,因此需要两个时钟周期才能输出一个 RGB565 数据。

tLine:摄像头输出一行数据的时间,共 784 个 tp,包含 640tp 个高电平和 144tp 个低电平,其中, 640tp 为有效像素数据输出的时间。以RGB565 数据格式为例, 640tp 实际上就是640*2=1280 个 tPCLK。

由上图可知, VSYNC 的上升沿作为一帧的开始,高电平同步脉冲时间为 4*tLine,紧接着等待 18*tLine 时间后, HREF 开始拉高,此时 OV7725 输出一行有效图像数据,这里是一行数据即 640 个像素点(VGA 模式); HREF 由 640tp 个高电平和 144tp 个低电平构成;输出480 行数据之后等待 8*tLine 时间会产生一个 VSYNC 上升沿标志一帧数据传输结束。所以输出一帧图像的时间实际上是 tFrame = (4 + 18 + 480 + 8) * tLine = 510 tLine。

利用以上的公式,结合摄像头的输出时钟 fPCLK 得到 tPCLK,便可算出摄像头输出帧率:摄像头输出帧率: 1s / tFrame = 1s / (510 * 784 * 2 tPCLK)

OV7725 模块的输入时钟为 12MHz,通过 OV7725 初始化的配置(主要查看 0x0D 和 0x11寄存器),输出时钟为 24MHz(周期为 42ns),所以代入以上公式,帧率达到 30Hz。 这里要跟LCD 的刷新率进行区分, 由于我们本实验用到的是带 FIFO 的 OV7725 模块, MCU 不是直接去接收传感器输出的图像数据,而是通过从 FIFO 里进行获得,所以说这个刷新率是比摄像头的输出帧率要低很多。

4. 图像数据存储和读取说明

4.1 FIFO

由于 OV7725 的像素时钟(PCLK)最高可达 24Mhz,我们用 STM32F103 的 IO 口直接抓取, 会十分消耗 CPU(可以通过降低 PCLK 输出频率,来实现 IO 口抓取,但是不推荐)。所以,我们并不是采取直接抓取 OV7725 输出的图像数据,而是通过 FIFO 读取。 正点原子 OV7725摄像头模块自带了一个 FIFO 芯片,用于暂存图像数据,有了这个芯片,我们就可以很方便的获取图像数据了,而不再要求单片机具有高速 IO,也不会耗费多少 CPU,可以说,只要是个单片机,都可以通过正点原子 OV7725 摄像头模块实现拍照的功能。

FIFO 芯片, 型号是 AL422B,本质是一种 RAM 存储器,容量为 393216 字节,不足以存放一帧 VGA 分辨率 RGB 格式的图像数据(640*480*2),但是能存放 2 帧 QVGA 分辨率 RGB 格式的图像数据(320*240*2)。由于 AL422B 写操作相关引脚和读操作相关引脚都是独立开来的,其引脚图如图下所示,所以支持同时写入和读出数据。

image-20240114144013779
  • 写操作相关引脚: WCK、 WRST、 DI7~0、 WE

  • 读操作相关引脚: RCK、 RRST、 DO7~0、 RE、 OE

4.2 写 FIFO 时序图

image-20240114144632919

上图中 WCK 是写 FIFO 时钟,它与 OV_PCLK 相连,也就是 OV7725 的 PCLK 时钟信号直接提供写 FIFO 时钟。 WRST 是 FIFO 写指针复位引脚,由 MCU 控制,低电平时,写指针会复位到 FIFO 的 0 地址处。 WE 是 FIFO 写使能引脚即 FIFO_WE,低电平时, FIFO 允许写入,但该引脚的电平是通过一个与非门进行决定, 详看模块原理图中的 SN74LVC1G00部分(FIFO_WEN 和 OV_HREF 都为高电平, FIFO_WE 才为低电平), 具体使用:当 OV_HREF为高电平就是一行图像数据到来,而 FIFO_WEN 引脚是引出来的,所以我们只需要在此刻拉高FIFO_WEN 引脚, WE 引脚就输出低电平,允许图像数据写入到 FIFO。 而 DI7~0 是直接与OV7725 传感器的数据引脚 D2~D9 相连。

总的来说,写 FIFO 时序就是: OV7725 输出有效的行图像数据时(HREF 高电平),我们需要保持写使能引脚为低电平(FIFO_WEN 拉高)。在复位写指针(拉低后又重新拉高) 后, 需要一定的复位周期,然后才开始往 FIFO 的 0 地址处写数据,且数据会按地址递增方式存入 FIFO。通常,我们会根据帧同步信号进而以上操作,这个存储图像数据的工程为:

(1)等待OV7725帧同步信号;

(2)FIFO写指针复位;

(3)FIFO写使能;

(4)等待第二个OV7725帧同步信号;

(5)FIFO写禁止。

通过以上5个步骤,我们就可以完成1帧图像数据在AL422B的存储。注意: FIFO写禁止操作不是必须的,只有当我们想将一帧图片数据存储在FIFO,并在外部MCU读取完这帧图片数据之前,不再采集新的图片数据的时候,才需要进行FIFO写禁止。

4.3 读 FIFO时序图

image-20240114144845903

上图中的RCK是读FIFO时钟,由MCU控制; RRST是FIFO读指针复位引脚, 由MCU控制,低电平时,读指针会复位到FIFO的0地址处; RE是读使能引脚,硬件设计直接接地; OE是输出使能,由MCU控制,要保持低电平才能使能FIFO数据输出; DO7~0是数据引脚,获取图像数据。在存储完一帧图像以后,我们就可以开始读取图像数据了。读取过程如下:

(1)FIFO读指针复位(RRST);

(2)给FIFO读时钟(FIFO_RCLK);

(3)读取第一个像素高字节(D[7:0]);

(4)给FIFO读时钟(FIFO_RCLK);

(5)读取第一个像素低字节(D[7:0]);

(6)给FIFO读时钟(FIFO_RCLK);

(7)读取第二个像素高字节(D[7:0]);

(8)循环读取剩余像素;

(9)结束。

可以看出,摄像头模块数据的读取也是十分简单,比如 QVGA 模式, RGB565 格式,我们总共循环读取 320*240*2 次,就可以读取 1 帧图像数据,把这些数据写入 LCD 模块,我们就可以看到摄像头捕捉到的画面了。

注意: 如果摄像头要使用 VGA 模式输出,由于 FIFO 是没办法缓存一帧的 VGA 图像,就需要在 FIFO 写满之前开始读 FIFO 数据, 否则数据可能被覆盖。 OV7725 还可以对输出图像进行各种设置,数据手册和应用笔记可以看《 OV7725_datasheet.pdf》和《OV7725 Software Application Note.pdf》。对 AL422B 的操作时序,可以参考 AL422B 的数据手册。