查看: 11400|回复: 16

OV7670摄像头模块配STM32F107VCT6开发板使用教程

[复制链接]

该用户从未签到

发表于 2015-3-4 10:33:25 | 显示全部楼层 |阅读模式
分享到:
一、 专业英文名词解释
OV        豪威科技,美商半导体公司,OmniVision
SCCB        串行相机控制总线,全称Serial Camera Control Bus
Sensor        传感器;图像传感器;感光芯片;通常指摄像头感光芯片
Camera照相机摄影机名词复数 cameras
Chip        芯片,集成电路IC
ID        身份标识号码,也就是芯片的产品,全称IDentity
I2C        两线式串行总线,全称InterIntegrated Circuit
SDA        I2C总线的数据信号线,全称SerialData
SCL        I2C总线的时钟信号线,全称SerialClock
CMOS        影像器材的感光元件,互补金属氧化物半导体。
全称Complementary Metal Oxide Semiconductor
CCD        影像器材的感光元件,电荷耦合器件。全称Charge Couple Device
ADC        模拟/数字转换器,全称Analog-to-Digital Converter
MCU        微控制单元,全称Micro Control Unit
LCD         液晶显示器,全称Liquid Crystal Display
FIFO        先进先出的数据缓存器,全称First In First Out
VGA        显示绘图阵列,全称Video Graphics Array
RGB:        RGB是Red、Green、Blue(红绿蓝)三种原色的组合,也是工业界的一种颜色标准。是通过对三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色。
RGB几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
RGB565:是一种色彩标准,也是一种图像的接口标准,它是由R(红色)5根信号线、G(蓝色)6根信号线、B(蓝色)5根信号线组成的16根信号线(16位色彩深度)的硬件通信接口。
RGB888:跟RGB565一样,它是由红绿蓝3种原色,每种原色8位数据(8根信号线)组成的24位色彩深度的通信接口,也是目前色彩度最高的一种原色标准。
二、 摄像头的基本概念1 什么是摄像头
摄像头(CAMERAWEBCAM)又称为电脑相机、电脑眼、电子眼等,是一种视频输入设备,被广泛的运用于视频会议,远程医疗及实时监控等方面。普通的人也可以彼此通过摄像头在网络进行有影像、有声音的交谈和沟通。另外,人们还可以将其用于当前各种流行的数码影像,影音处理。
2 摄像头分类
摄像头可分为数字摄像头和模拟摄像头两大类。数字摄像头可以将视频采集设备产生的模拟视频信号转换成数字信号,进而将其储存在计算机里。模拟摄像头捕捉到的视频信号必须经过特定的视频捕捉卡将模拟信号转换成数字模式,并加以压缩后才可以转换到计算机上运用。数字摄像头可以直接捕捉影像,然后通过串、并口或者USB接口传到计算机里。电脑市场上的摄像头基本以数字摄像头为主,而数字摄像头中又以使用新型数据传输接口的USB数字摄像头为主,市场上可见的大部分都是这种产品。除此之外还有一种与视频采集卡配合使用的产品,但还不是主流。由于个人电脑的迅速普及,模拟摄像头的整体成本较高,而且不能满足BSV液晶拼接屏接口等原因,USB接口的传输速度远远高于串口、并口的速度,因此市场USB接口的数字摄像头。模拟摄像头可和视频采集卡或者USB视频采集卡配套使用,很方便的跟电脑连接使用,典型应用是一般的录像监控。
摄像头(webcam)一般具有视频摄像/传播和静态图像捕捉等基本功能,它是借由镜头采集图像后,由摄像头内的感光组件电路及控制组件对图像进行处理并转换成电脑所能识别的数字信号,然后借由并行端口或USB连接输入到电脑后由软件再进行图像还原。
3 分辨率
分辨率是用于度量位图图像内数据量多少的一个参数,通常表示成dpi(dot per inch,每英寸点)。简单地说,摄像头的分辨率是指摄像头解析图象的能力,也即摄像头的影像传感器的像素数。最高分辨率就是指摄像头能最高分辨图像的能力的大小,即摄像头的最高像素数。现在市面上较多的30万像素CMOS的最高分辨率一般为640×48050万像素CMOS的最高分辨率一般为800×600。分辨率的两个数字表示的是图片在长和宽上占的点数的单位,一张数码图片的长宽比通常是43
在实际应用中,如果将摄像头用于网络聊天或者视频会议,那么分辨率越高则需要的网络带宽就越大。因此消费者在这方面应该注意,应根据自己的需要选择一款像素适合自己的产品。
4 结构组件
我们从摄像头的日常工作原理就可以列出摄像头的主要结构和组件。
l 镜头(LENS
透镜结构,由几片透镜组成,有塑胶透镜(Plastic)或玻璃透镜(Glass)。
l 图像传感器
可以分为两类,CCDCMOS
l 电源
摄像头内部需要两种工作电压:2.8V1.8V,最新工艺芯片有用到1.5V
l FIFO缓冲器
从应用模块上可分为两种,一种带FIFO缓冲器,另一种不带FIFO缓冲器。带FIFO缓冲器的应用场合适应于单片机和本身不带摄像头驱动的MCU,通过FIFO芯片驱动摄像头和做图像缓存功能。不带FIFO缓冲器的,主控MCU一定要有自带摄像驱动接口,一般应用在DSP上。
5 技术指标5.1 图像解析度/分辨率(Resolution)
SXGA(1280x1024)又称130万像素
XGA(1024x768)又称80万像素
SVGA(800x600)又称50万像素
VGA(640x480)又称30万像素(35万是指648X488)
CIF(352x288)又称10万像素
SIF/QVGA(320x240)
QCIF(176x144)
QSIF/QQVGA(160x120)
5.2 图像格式(imageFormat/Colorspace)
RGB24420是最常用的两种图像格式。
RGB24:表示RGB三种颜色各8bit,最多可表现256级浓淡,从而可以再现
  256*256*256种颜色。
I420YUV格式之一。
●其它格式有:RGB565RGB444YUV4:2:2等。
5.3 自动白平衡调整(AWB)
定义:要求在不同色温环境下,照白色的物体,屏幕中的图像应也是白色的。色温表示光谱成份,光的颜色。色温低表示长波光成分多。当色温改变时,光源中三基色(红、绿、蓝)的比例会发生变化,需要调节三基色的比例来达到彩色的平衡,这就是白平衡调节的实际。
5.4 图像压缩方式
JPEG:(joint photographic experts group)静态图像压缩方式。一种有损图像的压缩方式。压缩比越大,图像质量也就越差。当图像精度要求不高存储空间有限时,可以选择这种格式。大部分数码相机都使用JPEG格式。
5.5 彩色深度(色彩位数)
反映对色彩的识别能力和成像的色彩表现能力,实际就是A/D转换器的量化精度,是指将信号分成多少个等级。常用色彩位数(bit)表示。彩色深度越高,获得的影像色彩就越艳丽动人。市场上的摄像头均已达到24位,有的甚至是32位。
5.6 图像噪音
指的是图像中的杂点干扰。表现为图像中有固定的彩色杂点。
5.7 视角
与人的眼睛成像是相同原理,简单说就是成像范围。跟使用的镜头有关
5.8 输出/输入接口
串行接口(RS232/422):传输速率慢,为115kbit/s
并行接口(PP):速率可以达到1Mbit/s
红外接口(IrDA):速率也是115kbit/s,一般笔记本电脑有此接口。
通用串行总线USB:即插即用的接口标准,支持热插拔。USB1.1速率可达12Mbit/s,USB2.0可达480Mbit/s
IEEE1394(火线)接口(亦称ilink):其传输速率可达100M~400Mbit/s


旺宝电子OV7670 教程.pdf (1.61 MB, 下载次数: 83)
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2015-3-16 11:51:22 | 显示全部楼层
一、 摄像头的工作原理
图片2.png
1 基本原理
摄像头的工作原理大致为:景物通过镜头(LENS)生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再经过LCD驱动器在LCD上显示或通过USB接口传输到电脑中处理,通过显示器就可以看到图像了。
1.1 控制接口
RESET信号
初始化Sensor寄存器列表时,首先就要对Sensor进行复位,然后再对控制寄存器进行初始化设置。
MCLK信号(系统时钟)
Sensor的输入时钟,这个时钟信号可以用外部晶振提供,也可以用MCU引脚提供时钟。
SDA、SCL信号(SCCB)
这是对Sensor寄存器进设置或读取信息的通讯接口
1.2 数据输出
YUV RGB data
这个是指图像的输出格式,可以寄存器设置输出各种Sensor有支持的格式。
PCLK(像素时钟)
Sensor的输出时钟,这个时钟信号由Sensor内部PLL配置产生,可以配置不同的输出频率以适应各种不同的应用环境,同步图像数据输出。
HSYNC
行同步信号,如下图时序,同一个有效信号内传输的都是同一行图像的像素点数据,每个像素点由D0D7八位数据组成。信号拉高后开始传输一行图像的像素点数据,信号拉低时表示同一行的图像数据已经传输结束,下一行图像数据从下一个信号拉高后开始传输。
VSYNC
帧(列)同步信号,同一个有效信号内传输的都是同一帧图像的数据,信号拉高后开始传输一帧图像的像素点数据,信号拉低时表示同一帧的图像数据已经传输结束,下一帧图像数据从下一个信号拉高后开始传输。
图片1.png
2 图像实现过程
摄像头的点亮过程主要是通过控制接口对摄像头感光芯片进行初始化设置,说白了就是通过I2C对感光芯片的寄存器基本参数进行初始化设置,也就是把预先准备好的Sensor初始化列表填写到感光芯片对应的寄存器上,具体实现请见后面OV7670初始化列表配置。
Sensor初始化列表包括了图像的输出格式、帧频、分辨率、窗口大小、色彩效果等等。读取和输出图像时要注意读取的图像大小(行多少个像素点,列多少个像素点)应和显示输出的图像大小保持一致,否则会出现图像歪斜或杂色。一般可以设置感光芯片的输出窗口大小和要显示的窗口大小一样(这种应用必须设置感光芯片的输出大小为任意尺寸输出),也可以后端的DSP加工处理成所需要的尺寸。
完成初始化之后,Sensor处于正常工作状态,这时我们只要对图像缓冲器进行图像采集就可以,Sensor工作过程中可以动态改变各种参数以适应各种采集环境,如拍照模式、录像模式、预览显示模式等等。
图像实现过程,我们会用到一个先进先出(队列)数据缓存器FIFO(AL422B),它的主要作用是作图像高速缓存器,Sensor正常工作时,先把图像数据存入到高速缓存器中,再由用户端从高速缓存器中读取图像数据,不用和Sensor数据信号同步就可以读取出完整的图像数据。
2.1 图像实现步骤
1)硬件连接
连接图请参照“应用编程—>硬件连接图”,Sensor数据线连接到AL422B的数据输入端,
作为图像缓存输入,用户端的数据线连接到AL422B的数据输出端,作为图像缓存输出。
2)初始化LCD,准备显示图像。
3SCCB总线端口配置,配置Sensor控制总线IO口,以便后面设置Sensor寄存器值用。
4)提供Sensor输入时钟,可以有源晶振提供,也可以IOPWM提供。
5)复位Sensor,使所有寄存器值恢复到出厂设置。
6)初始化Sensor寄存器列表。
配置Sensor工作模式。详细请见OV7670常用寄存器设置说明。
7)从高速缓存器AL422B中读取图像数据到LCD屏上显示。

回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2015-3-18 10:22:13 | 显示全部楼层
一座城 发表于 2015-3-16 11:51
一、 摄像头的工作原理 1 基本原理摄像头的工作原理大致为:景物通过镜头(LENS)生成的光学图像投射到图像 ...

一、 常见定义及参数说明1 OV7670模块介绍
OV7670是OV最经典的一款30万摄像头CMOS感光芯片,体积小、工作电压低,提供单片 VGA 摄像头和影像处理器的所有功能。通过SCCB总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率8位影像数据。该产品VGA图像最高达到30/秒。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理功能过程包括伽玛曲线、白平衡、饱和度、色彩度等都可以通过SCCB接口编程。OV图像传感器应用独有的传感器技术,通过减少或消除光学或电子缺陷如固定图案噪声、托尾、浮散等,提高图像质量,得到清晰的稳定的彩色图像。
图片1.png 图片2.png
1.1 引脚定义

3V3        电源供电,3V5V
GND        电源接地。
CS        AL422B片选脚
RRST        读地址复位,信号拉低(至少一个RCLK周期)后再拉高,
这时候FIFO读地址指针就复位到0地址
WRST        写地址复位,重新复位写地址指针到0地址
RD        数据存储器的信号脚
WE        写使能脚,控制数据输入的启用/禁用
PWDN睡眠模式,低电平正常使用,高电平进入睡眠省电模式。


VSYNC:帧同步信号,信号拉高,开始传输一帧(1张)图片的数据,传输完后信号拉低
表示一帧图像传输完毕,等待下一个信号拉高开始传输下一帧图像。
SCL        SCCB时钟信号
SDA        SCCB数据信号
XCLK        系统时钟输入
D0D7:数据位07RGB565色彩组合:RRRRRGGGGGGBBBBB
先输出高8位数据,再输出低8位数据构成一个16RGB565像素点。

回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2015-3-20 14:54:37 | 显示全部楼层
一座城 发表于 2015-3-18 10:22
一、 常见定义及参数说明1 OV7670模块介绍OV7670是OV最经典的一款30万摄像头CMOS感光芯片,体积小、工作 ...

2  Al422B FIFO芯片介绍
FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,没有外部读写地址线,但只能顺序写入、读出数据,其内部读写指针自动加1,不能决定读取或写入某个指定的地址。FIFO一般用于不同时钟域之间的数据传输。对于单片FIFO来说,主要有两种结构:触发导向结构和零导向传输结构。触发导向传输结构的FIFO是由寄存器阵列构成的,零导向传输结构的FIFO是由具有读和写地址指针的双口RAM构成,如图:
图片7.jpg
1.1 FIFO的一些重要参数
FIFO的宽度:THE WIDTH,指的是FIFO一次读写操作的数据位。
FIFO的深度:THE DEEPTH,指的是FIFO可以存储多少个N位的数据(如果宽度为N)。
满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。
空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。
读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。
写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。
读指针:指向下一个读出地址。读完后自动加1
写指针:指向下一个要写入的地址的,写完自动加1
读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。
1.2 AL422B的性能特点
AL422B是由AverLogic公司推出的存储容量为3Mbits的视频帧存储器,存储容量为384k×8bits,由于目前1帧图像信息通常包含640×480720×480个字节, 而市面上很多视频存储器由于容量有限只能存储1场图像信息,无法存储1帧图像信息。AL422B由于容量很大,可存储1帧图像的完整信息,其工作频率达50MHz
1)存储体为384k×8bits FIFO
2)支持VGACCIRNTSCPALHDTV分辨率。
3)独立的读/写操作(可接受不同的I/O数据率)。
4)高速异步串行存取。
5)读写时钟周期为20ns
6)存取时间为15ns
7)内部DRAM自行刷新数据。
8)输出使能控制。
9)工作电压可为5V3.3V
10)标准28SOP封装。       

回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2015-3-23 15:48:55 | 显示全部楼层
2.3 AL422B引脚功能定义
引脚名称
引脚编号
引脚功能
IO口类型
DI0DI7
14,1114
[size=10.5000pt]Data [size=10.5000pt]Input        数据输入
输入脚
DO0DO7
15182528
[size=10.5000pt]Data [size=10.5000pt]Output        数据输出
输出脚
WCK
9
Write Clock        写入时钟
输入脚
/WE
5
Write Enable        写入使能
输入脚,低电平有效
/WRST
8
Write Reset        写入复位
输入脚,低电平有效
RCK
20
Read Clock        读取时钟
输入脚
/RE
24
Read Enable        读取使能
输入脚,低电平有效
/RRST
21
Read Reset        读取复位
输入脚,低电平有效
/OE
22
Output Enable输出使能
输入脚,低电平有效
TST
7
Test测试脚,接下拉电阻
输入脚
VDD
10
电源输入5V3.3V
DEC/VDD
19
去耦电容输入
GND
6,23
接地脚


2.4 AL422B引脚排列
图片9.png
2.5 AL422B使用方法2.5.1 初始化
上电后,分别给/WRST/RRST0.1ms的初始化脉冲,使AL422B初始化。
2.5.2 复位操作
通常,复位信号可在任何时候给出而不应考虑/WE,/RE/OE的状态, 但是它们仍然要参照时钟信号的输入情况,使它们满足建立时间和保持时间的要求。如果在禁止时钟周期内给出复位信号,必须要等到允许周期到来后才会执行复位操作。当/WRST/RRST均为低电平时,数据的输入和输出均从地址0开始。
2.5.3 写入操作,见图(AL422B时序图,/WE
/WE为低电平时,在WCK信号的上升沿,数据通过DI7DI0写入到写寄存器,参照WCK的输入周期,写入的数据须满足建立时间和保持时间的要求。当/WE为高电平时,写操作被禁止,写地址指针停在当前位置上;当/WE再次变为低电平时,写地址指针从当前位置开始。
2.5.4 读取操作,见图(AL422B时序图,/RE
/RE/OE均为低电平时,在RCK信号的上升沿,数据由DI7DI0输出。当/RE为高电平时,读地址指针停在当前位置上;当/RE再次变为低电平时,读地址指针从当前位置开始。执行读操作时,/OE须为低电平,如/OE为高电平,则数据输出端均为高阻态,且读地址指针仍然同步加1/RE/OE须参照RCK的输入周期,满足建立时间和保持时间的要求。
2.5.5 内部功能框图
由于其所有的寻址、刷新等操作都由集成在芯片内部的控制系统完成,如下图:
图片8.png
2.5.6 AL422B的工作时序图2.5.6.1 写入复位时序图(/WRST
图片7.png
2.5.6.2 读取复位时序图(/RRST
图片6.png
2.5.6.3 读取使能时序图(/RE
图片5.png
2.5.6.4 输出使能时序图(/OE
图片4.png
2.5.6.5 输出使能时序图(/WE
图片3.png
2.5.6.6 读取使能、复位时序图(/RE/RRST
图片2.png
2.5.6.7 写入使能、复位时序图(/WE/RRST
图片1.png

回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2015-3-24 10:58:00 | 显示全部楼层
五、 SCCB通讯协议
1 I2C 总线
I2C总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I2C 总线支持任何IC 生产过程(CMOS、双极性)。通过串行数据(SDA)线和串行时钟 (SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别(无论是微控制器——MCULCD 驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。LCD 驱动器只能作为接收器,而存储器则既可以接收又可以发送数据。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机。主机是初始化总线的数据传输并产生允许传输的时钟信号 的器件。此时,任何被寻址的器件都被认为是从机。
图片3.png
2 SCCB总线
SCCB是OmniVision公司定制的串行摄像头控制总线,用于对摄像头的寄存器进行读写,以达到对摄像头输出图像的控制。两线制SCCB I2C 总线类似,是一种双向二线制同步串行总线。SCCB 的数据传输由主器件控制,主器件能够发出数据传输启动信号、时钟信号以及传送结束时的停止信号。通常主器件都是微处理器,它寻址访问的设备称为从器件。为了进行通讯,每个接到SCCB 的设备都有一个唯一的地址( ID) ,使用软件来识别总线上的从器件,省去了从器件的片选。因此,只需要两根线(串行时钟线SIO_C 和串行数据线SIO_D) ,挂接到总线上的器件就能相互进行信息传递。组成SCCBSIO_C和SIO_D必须经过上拉电阻RP接到正电源上,连接到总线的器件的输出级必需为“开漏”或“开集”的形式,以便在多个主或从需求仲裁的况下完成线与的功能。
SCCB 协议中定义开始和停止条件如下:
开始条件:在SIO_C为高电平时,SIO_D 出现一个下降则SCCB 开始传输;
停止条件:在SIO_C 为高电平时,SIO_D 出现一个上升沿,则SCCB 停止传输。
图片2.png
除了开始和停止状态,在数据传输时,当SIO_C为高电平时,必需保证SIO_D上的数据的稳定,也就是说,SIO_D上的数据只能在SIO_C 为低电平时改变。
I2C总线类似,SCCB的基本传输格式如图3所示,完整的数据传输包括两个或三个阶段。每一阶段包中含9 位二进制数据,其中高8 位为所要传输的8 位数据,最低位根据主器件的数据传输是读操作还是写操作而确定。在进行主器件写操作时,全部阶段的最低位均是无关位(低或高电平均可) ;读操作时,第一阶段的最低位是无关位,第二阶段的最低位位NA ———主器件驱动为高电平有效。
图片1.png
SCCB 协议定义了两种写操作,即三相写操作和两相写操作。三相写操作是往从器件的目的寄存器中写入数据。在三相写操作中,第一阶段写从器件的8 IDW 和无关位,第二阶段写从器件目标寄存器的8 位地址和无关位,第三阶段写要求写入寄存器的8 位数据和无关位;两相写操作只有三相写操作的前两个阶段。两相写操作的目的是
为了确定读操作中的从器件地址,这是因为两相读操作不能提供所要求读取的寄存器的地址。SCCB 协议定义了两读操作,它用于读取从器件目的寄存器中的数据。在第一阶段中写从器件读操作8 IDR 和无关位,在第二阶段中读取寄
存器中的8 位数据和写NA bit 。在两阶段读循环操作前,必需有一个两相或三相的写循环操作,以提供读操作中的寄存器地址。

回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2015-3-25 10:16:16 | 显示全部楼层
六、 应用编程
1 硬件连接图
图片1.png
2 软件设计2.1 系统初始化(SystemInit
对系统设备进行初始化设置,初始化完成后所有设备都处于正常工作状态,这时可以进行图像采集和LCD输出显示。
以下为金龙107的参考代码:
Init_KEY();                                        //初始化按键
Init_Usart();                                        //初始化串口
Usart_Configuration(115200);        //配置波特率
Printf("串口初始化完成\r\n");
LCD_Init();                                        //初始化显示屏
LCD_Clear(0x0000);                        //显示黑色背景
Init_OV7670();                                //初始化Sensor
LCD_WindowMax(0,0,240,320);        //设置显示窗口大小
while(1)
{
图像采集过程
}
2.2 OV7670初始化过程
摄像头初始化包括SCCB总线端口配置、ID号检测和寄存器初始化列表配置。
uint8_t Init_OV7670(void)
{
        GPIO_SCCB();                         //SCCB总线端口配置
Init_XCLK_ON();                         //OV7670的输入时钟配置
wrOV7670Reg(0x12, 0x80);        //复位SCCB总线
(……)                                //检测OV7670芯片ID
(……)                                //OV7670初始化列表配置
GPIO_OV7670();                        //初始化FIFO和中断引脚
set_qvga();                                //设置Sensor图像输出格式为QVGA
}
2.2.1 SCCB总线端口配置
GPIO_SCCB();        //这是函数名,以下为函数内容
GPIO_InitTypeDef  GPIO_InitStructure;                                                  //定义初始化结构变量
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC, ENABLE); //启用SCCBIO口时钟
GPIO_InitStructure        .GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;                  //定义SCCB总线IO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置IO口输出模式为复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //配置SCCB输出速率为50赫兹
GPIO_Init (GPIOC, &GPIO_InitStructure);                                  //初始化SCCB总线IO
2.2.2 OV7670的输入时钟配置
OV7670要正常工作必须外部提供一个时钟信号MCLKMCLK可以通过配置IO口提供一个时钟源,也可以通过外部晶振提供时钟源。当OV7670完成初始化之后会产生一个数据输出的同步时钟PCLKPCLK是通过OV7670内部寄存器配置产生,可以配置想要的频率输出,这个频率会直接影响OV7670的图像输出帧率。
Init_XCLK_ON();        //这是函数名,以下为函数内容
GPIO_InitTypeDef  GPIO_InitStructure;                                                  //定义初始化结构变量
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);//启用摄像头IO口时钟
GPIO_InitStructure        .GPIO_Pin = OV7670_XCLK_BIT;                 //定义摄像头输入时钟IO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置IO口输出模式为复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //配置时钟输出速率为50赫兹
GPIO_Init (GPIOA, &GPIO_InitStructure);                                  //初始化时钟输出IO
RCC_MCOConfig( RCC_MCO_HSE);                                          //使能外部晶振作为OV7670时钟
2.2.3 检测OV7670芯片ID
wrOV7670Reg(0x12, temp);                                                //复位SCCB
rdOV7660Reg(0x0a, &ovidmsb);                                        //读产品的高位序列号
if(ovidmsb !=0x76)  return 0;                                        //检测ID值,OV7670的高位ID值是0x76
rdOV7660Reg(0x0b, &ovidlsb );                                         //读产品的低位序列号
if(ovidlsb !=0x73)  return 0;                                         //检测ID值,OV7670的低位ID值是0x73
2.2.4 OV7670初始化列表配置
初始化摄像头主要就是把配置列表的地址和值填写到OV7670对应的寄存器地址和寄存器值。填写完OV7670的寄存器后,OV7670就会按寄存器配置列表的配置模式进行工作。
CHANGE_REG_NUM:指定配置寄存器列表有多少组
change_reg[CHANGE_REG_NUM][2]:OV7670寄存器初始化列表
每一组数据都是由寄存器地址和寄存器值构成,通过FOR循环把所有数组的寄存器值填写到OV7670对应的寄存器里面,看下面代码:
        for(i=0;i<CHANGE_REG_NUM;i++)                                                //循序填写寄存器值
        {
                if( 0 == wrOV7670Reg(change_reg[0],change_reg[1]))//填写寄存器值
                {
                        return 0;                                                                                 //错误反回0
                }
        }
2.2.5 初始化FIFO和中断引脚
void GPIO_OV7670(void)
{
        GPIO_FIFO();                  //AL422缓存引脚配置
        EXTI_OV7670();                //摄像头帧同步信号中断引脚配置 VSYNC
}

回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2015-3-26 15:07:26 | 显示全部楼层
2.2.6设置OV7670图像输出格式
void set_qvga(void)        //设置QVGA输出
{   
        while(1!= wrOV7670Reg(0x12, 0x14));//设置输出格式RAW,大小QVGA
        wrOV7670Reg(0x17, 0x16);//HSTART,输出格式-行频开始高八位(低三位在HREF[2:0])
        wrOV7670Reg(0x18, 0x04);        //HSTOP,输出格式-行频结束高八位(低三位在HREF[5:3])
        wrOV7670Reg(0x19, 0x03); //VSTRT 输出格式-场频开始高八位(低二位在VREF[1:0])
        wrOV7670Reg(0x1A, 0x7B); //VSTOP,输出格式-场频结束高八位(低二位在VREF[3:2])
        wrOV7670Reg(0x03, 0x0a);        //VREF        位[3:2]VREF结束的低两位(高八位见VSTOP[7:0])
                                                                        位[1:0]VREF开始的低两位(高八位见VSTOP[7:0])
        wrOV7670Reg(0x70, 0x35);        //SCALING_XSC,水平缩放系数
        wrOV7670Reg(0x71, 0x3a);         //SCALING_YSC,垂直缩放系数
        wrOV7670Reg(0x72, 0x11);        //SCALING_DCWCTR,DCW控制
        wrOV7670Reg(0x73, 0xF7);        //SCALING_PC,旁路DSP缩放时钟分频控制
        wrOV7670Reg(0xA2, 0x02);        //SCALING_PCLK_DELAY,像素始终延迟
        wrOV7670Reg(0xac, 0x0);        //亮度
}
void set_cif(void)                //设置CIF输出
{      
        while(1!= wrOV7670Reg(0x12, 0x24)); //设置输出格式RAW,大小CIF
        wrOV7670Reg(0x17, 0x15);//HSTART,输出格式-行频开始高八位(低三位在HREF[2:0])
        wrOV7670Reg(0x18, 0x0B);        //HSTOP,输出格式-行频结束高八位(低三位在HREF[5:3])
        wrOV7670Reg(0x19, 0x03); //VSTRT 输出格式-场频开始高八位(低二位在VREF[1:0])
        wrOV7670Reg(0x1A, 0x7b); //VSTOP,输出格式-场频结束高八位(低二位在VREF[3:2]);
        wrOV7670Reg(0x03, 0x0a);        //VREF        位[3:2]VREF结束的低两位(高八位见VSTOP[7:0])
                                                                        位[1:0]VREF开始的低两位(高八位见VSTOP[7:0])
        wrOV7670Reg(0x32, 0xb6);        //HREF,HREF控制
[7:6]:HREF沿距数据输出的偏移
[5:3]:HREF结束的低3(8位在HSTOP)
[2:0]:HREF开始的低3(8位在HSTOP)
        wrOV7670Reg(0x70, 0x3A); //SCALING_XSC,水平缩放系数
        wrOV7670Reg(0x71, 0x35); //SCALING_YSC,垂直缩放系数
        wrOV7670Reg(0x72, 0x11); //SCALING_DCWCTR,DCW控制
        wrOV7670Reg(0x73, 0xF2);        //SCALING_PC,旁路DSP缩放时钟分频控制
        wrOV7670Reg(0xA2, 0x03); //SCALING_PCLK_DELAY,像素始终延迟
}
void set_light(unsigned char i)        //设置亮度
{
        wrOV7670Reg(0x55, i);                //BRIGHT,亮度控制
}

回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2015-4-3 11:19:50 | 显示全部楼层
2.3图像采集过程
2.3.1采集思路
图像采集就是从FIFO缓冲器AL422B读取一帧图像,然后在LCD屏上显示出来。
(1)检测当前一帧是否被读取过,如果被读取过就直接跳过,等待下一帧新的图像;
(2)按照AL422B的工作时序读取一帧图像数据;
一个FOR循环读两次,一次读8位,两次就刚好一个16位RGB565的像素点。
一帧图像宽高是320×240=76800个像素点,循环76800次读完一帧图像。
(3)等待读取下一帧新的图像数据,也就是下一次While(1) 循环的开始。
2.3.2代码分析:
While(1)                //循环扫描图像,一个循环显示一帧图像。
{
if(Frame_Writed)                        //检测当前一帧图像地否被读取过
{                                                //如果是新的一帧图像,就进行图像采集
        Frame_Write_Status=1;        //标记图像采集状态
        FIFO_RCLK_L;                 //数据在上升沿输出,下面可直接给一个上升沿
        LCD_WR_REG(0x22);
        LCD_RD(1);                        //读使能
        LCD_CS(0);
        LCD_RS(1);                        //1表示数据
        for(index = 0; index <76800; index++)        //320*240=76800个像素点
        {                                                                //读一帧图像,在屏上显示
                FIFO_RCLK_H;         //数据在上升沿输出
                FIFO_RCLK_L;
                Dat=FIFO_DATA_PIN<<8;        //读取高8位数据到Dat
FIFO_RCLK_H;         //数据在上升沿输出
                FIFO_RCLK_L;
                GPIOE->ODR=(Dat|(FIFO_DATA_PIN));        //读取低8位数据到Dat
//从PE口输出16位数据Dat
                GPIOD->BRR = (1<<14);//0x4000;        // LCD_WR(PD14)置0
                GPIOD->BSRR = (1<<14);//0x4000;        //LCD_WR(PD14)置1
//显示16位数据图像
        }
        LCD_CS(1);       
        Frame_Write_Status=0; //清除图像采集状态
        Frame_Writed=0;                //标记当前一帧图像已经被读取过
        while(Frame_Writed);         //等待下一帧图像数据
}
}
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2020-7-2 09:48
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-1-15 18:40:54 | 显示全部楼层
    极高度赞扬楼主的无私奉献精神!!!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 16:34 , Processed in 0.189340 second(s), 34 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.