OV7725之AL422B-FIFO及摄像头的驱动原理

今日入手了一块正点原子家OV7725摄像头模块,这是一篇关于模块内部的AL422B-FIFO芯片的学习笔记。学习资料为野火家的相关模块视频教程。链接如下:【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕)_哔哩哔哩_bilibili

STM32F4系列的控制器主频高、一般会扩展外部SRAM、SDRAM等存储器。且具有DCMI外设,故可以与OV7725直接进行硬件通讯,速度更快。

而STM32F1系列的控制器一般主频较低、为节省成本可能不扩展SRAM存储器,而且不具有DCMI外设,难以直接接收和存储OV7725图像传感器输出的数据。

那么为何需要扩展 FIFO 呢?我们举例进行说明:
        OV7725能够设置的分辨率有 240*320 或 640*320 ,假设为 240*320;

        则一帧图像占的字节数为:240*320*2(一个像素占两字节) = 153600;

        153600/1024 = 150.0 KB ;

        然而我所使用的STM32F1ZET6的内部SRAM仅为 64KB,连一帧的图像都存储不了;

        所以在扩展了FIFO后能够利用FIFO缓存数据图像,stm32再慢慢提取处理数据。

AL422B的容量大小为393216字节,至少能够缓存两帧 240*320 的图像。但如果选择分辨率为 640*320 的话, 640*320*2 = 409600 > 393216,也就是说FIFO连一帧图像数据也缓存不了,这时候需要OV7725一边往FIFO写入数据,stm32一边从FIFO读出来,确保在OV7725覆盖旧数据前,stm32端已经把这部分数据读取出来了。

AL422B芯片引脚图和功能图:

AL422B芯片引脚图

 

管脚名称管脚类型

管脚描述

DI [0:7]输入数据输入引脚
WCK输入数据输入同步时钟
/WE输入写使能信号,低电平有效
/WRST输入写指针复位信号,低电平有效
DO [0:7]输出数据输出引脚
RCK输入数据输出同步时钟
/RE输入读使能信号,低电平有效
/RRST输入读指针复位信号,低电平有效
/OE输入数据输出使能,低电平有效
TST输入测试引脚,实际使用时设置为低电平

                        

由于AL422B支持同时写入和读出数据,所以它的输入和输出的控制信号线都是互相独立的。写入和读出数据的时序类似,跟VGA的像素输出时序一致,AL422B读写时序介绍如下:

写时序

 

读时序

        FIFO的读时序类似,不过读使能由两个引脚共同控制,即OE和RE引脚均为低电平时,输出处于使能状态,随着读时钟RCK的运转,在数据输出管脚 DO[0:7] 就会按地址递增的方式输出数据。

摄像头的驱动原理

        OV7725摄像头模块中包含有FIFO,所以外部控制器驱动摄像头时,需要协调好FIFO与OV7725传感器的关系,下面配合摄像头的原理图介绍驱动原理。

        原理图主要分为外部引出接口、OV7725及FIFO部分。

OV7725

 

AL422B

 

引出接口
引出的引脚功能说明

 

XCLK外接晶振

 

摄像头控制过程图

整个摄像头的采集过程:
摄像头本身有个OV7725传感器,背面有FIFO。
假如说OV7725跟stm32直接相连的话,由于OV7725输出的时钟很快,比24hz还高,超过stm32读取的速度。所以我们不希望这样直接读取7725的内容,而且32的sram空间不够大,根本无法完整地接收一帧图像。
所以stm32利用fifo。stm32通过读取ov7725的vsync信号,当出现vsync信号的时候,即7725输出了一帧,那32就让7725把ov7725的数据输出来的图像写入到FIFO(即这个时候控制FIFO去使能)(即图片中的"允许ov7725允许向fifo写入数据")。当检测到第二次vsync的时候,就表示一帧的图像结束,AL422B中存储了一帧的图像数据。
那么stm32就控制WE引脚输出高电平,即fifo不能写入(比前能写入状态是因为32控制WE为低电平)。这样子ov7725输出的图像数据就不能写入fifo了。ov7725的图像数据是一直在输出的,所以我们通过控制WE来控制fifo是否接受数据。

如图所示,WEN和HREF通过与非门对WE进行控制。只有WEN、HREF都为高电平时,WE才为低电平(有效),才能写入数据到FIFO。
当我们禁止了fifo接受图像数据时,stm32就赶紧地从fifo把刚刚缓存的那帧图像读回来。但!刚刚又有提及stm32的sram没法完全地缓存一帧图像,但是因为图像数据已经缓存在fifo内了,我们可以慢慢来读,也就没有必要一次性读一帧了,stm32可以自己控制fifo的时钟(RCK)慢慢地读回来,可以把速度调到32可以接收的速度去读取(而不是像7725那样速度快到32都来不及读取)。
由于sram太小,我们可以一行一行地读。即240/320×2=480/640字节,这对32来说是肯定可以接受的。那么我们可以这样处理(处理方法之一而已):如果我们想要直接把数据显示在液晶屏上,那我们可以直接把这一行数据通过32的fsmc传给液晶屏的ILI9341,那液晶屏也就可以一行一行地显示出来。
当32处理完一帧数据之后,又重复图片中的步骤继续传输!

 

  • 16
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值