0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

标签 > OV7620

OV7620

+关注 0人关注

ov7620是一款CMOS摄像头器件,是彩色CMOS型图像采集集成芯片,提供高性能的单一小体积封装,该器件分辨率可以达到640X480,传输速率可以达到30帧。

文章: 4
浏览: 30267
帖子: 8

OV7620简介

  ov7620是一款CMOS摄像头器件,是彩色CMOS型图像采集集成芯片,提供高性能的单一小体积封装,该器件分辨率可以达到640X480,传输速率可以达到30帧。

  OV7620

  HQ7620摄像头模块是基于Omnivision公司的CMOS图像传感器--- OV7620的方案设计;1/3英寸数字式CMOS图像传感器OV7620,总有效像素单元为664(水平方向)×492(垂直方向)像素;内置10位双通道A/D转换器,输出8位图像数据;具有自动增益和自动白平衡控制,能进行亮度、对比度、饱和度、γ校正等多种调节功能;其视频时序产生电路可产生行同步、场同步、混合视频同步等多种同步信号和像素时钟等多种时序信号;5V电源供电,工作时功耗《120mW,待机时功耗《10μW。可应用于数码相机、电脑摄像头、可视电话、第三代网络摄像机、手机、智能型安全系统、汽车倒车雷达、玩具,以及工业、医疗等多种用途。OV7620是1/3”CMOS彩色/黑白图像传感器。它支持连续和隔行两种扫描方式,VGA与QVGA两种图像格式;最高像素为664×492,帧速率为30fps;数据格式包括YUV、YCrCb、RGB三种,能够满足一般图像采集系统的要求。

OV7620百科

  ov7620是一款CMOS摄像头器件,是彩色CMOS型图像采集集成芯片,提供高性能的单一小体积封装,该器件分辨率可以达到640X480,传输速率可以达到30帧。

  OV7620

  HQ7620摄像头模块是基于Omnivision公司的CMOS图像传感器--- OV7620的方案设计;1/3英寸数字式CMOS图像传感器OV7620,总有效像素单元为664(水平方向)×492(垂直方向)像素;内置10位双通道A/D转换器,输出8位图像数据;具有自动增益和自动白平衡控制,能进行亮度、对比度、饱和度、γ校正等多种调节功能;其视频时序产生电路可产生行同步、场同步、混合视频同步等多种同步信号和像素时钟等多种时序信号;5V电源供电,工作时功耗《120mW,待机时功耗《10μW。可应用于数码相机、电脑摄像头、可视电话、第三代网络摄像机、手机、智能型安全系统、汽车倒车雷达、玩具,以及工业、医疗等多种用途。

  OV7620是1/3”CMOS彩色/黑白图像传感器。它支持连续和隔行两种扫描方式,VGA与QVGA两种图像格式;最高像素为664×492,帧速率为30fps;数据格式包括YUV、YCrCb、RGB三种,能够满足一般图像采集系统的要求。

  基本参数:

  大 小:33x27x24(mm)电 源:DC+5V ±5%扫描方式:逐行/隔行扫描最低照度:2.5 lux at f1.4 (3000k)信 噪 比:》 48 dB最大像素:(H)664 x (V)492; 缺省有效像素:(H)640 x (V)480数据输出格式:YCrCb 16bit/8bit selectable60Hz 16 Bit YCrCb 4:2:2 - 640x48060Hz 8 Bit YCrCb 4:2:2 - 640x480RGB Raw Data Digital Output 16Bit/8Bit selectableCCIR601, CCIR656, ZV 端口:支持8/16 位视频数据SCCB接口:最大速率支持400 kBit/sYCrCB或YUV输出格式:支持TV或监视器显示

  OV7620扫描方式

  OV7620是CMOS彩色/黑白图像传感器。它支持连续和隔行两种扫描方式,VGA与QVGA两种图像格式;最高像素为664492,帧速率为30fp8;数据格式包括YUV、YCrCb、RGB三种,能够满足一般图像采集系统的要求。OV7620内部可编程功能寄存器的设置有上电模式和SCCB编程模式。OV7620的控制采用SCCB(SeriaI Camera ControlBus)协议。SCCB是简化的I2C协议,SIO-l是串行时钟输入线,SIO-O是串行双向数据线,分别相当于I2C协议的SCL和SDA。SCCB的总线时序与I2C基本相同,它的响应信号ACK被称为一个传输单元的第9位,分为Don’t care和NA。Don’t care位由从机产生;NA位由主机产生,由于SCCB不支持多字节的读写,NA位必须为高电平。另外,SCCB没有重复起始的概念,因此在SCCB的读周期中,当主机发送完片内寄存器地址后,必须发送总线停止条件。不然在发送读命令时,从机将不能产生Don’t care响应信号。由于I2C和SCCB的一些细微差别,所以采用GPIO模拟SCCB总线的方式。SCL所连接的引脚始终设为输出方式,而SDA所连接的引脚在数据传输过程中,通过设置IODIR的值,动态改变引脚的输入/输出方式。SCCB的写周期直接使用I2C总线协议的写周期时序;而SC-CB的读周期,则增加一个总线停止条件。OV7620功能寄存器的地址为0x00~0x7C(其中,不少是保留寄存器)。通过设置相应的寄存器,可以使OV7620工作于不同的模式。例如,设置OV7620为连续扫描、RGB原始数据16位输出方式,需要进行如下设置:I2CSendByte()为写寄存器函数,它的第1个参数OV7620为宏定义的芯片地址0x42,第2个参数为片内寄存器地址,第3个参数为相应的寄存器设定值。OV7620有4个同步信号:VSYNC(垂直同步信号)、FODD(奇数场同步信号)、HSYNC(水平同步信号)和PCLK(像素同步信号)。当采用连续扫描方式时,只使用VSYNC和HSYNC、PCLK三个同步信号,还引入了HREF水平参考信号。LPC2210的3个外部中断引脚分别作为3个同步信号的输入,相应的中断服务程序分别为Vsync_IRQ()、Hsync_IRQ()和Pclk_IRQ()。在内存中定义一个二维数组存储图像数据,一维用变量y表示,用于水平同步信号计数;二维用变量x表示,用于像素同步信号计数。图像采集的基本流程当用SCCB初始化好OV7620后,使能VSYNC对应的中断,在Vsync_IRQ()中断服务程序中判断是否已取得一帧数据。若是,则在主程序的循环体中进行数据处理;若不是,则使能HSYNC对应的中断,并将y置为O。在Hsync_IRQ()中断服务程序中,判断HREF的有效电平,若有效,则y加1,x置为O,并使能PCLK对应的中断。在Pclk_IRQ()中断服务程序中,判断HREF的有效电平,若有效,则z增加,同时采集一个像素点的图像数据。在OV7620的3个同步信号中,PCLK的周期最短。当OV7620使用27 MHz的系统时钟时,默认的PCLK的周期为74 ns。而LPC2210的中断响应时间远远大于这个值。LPC2210的最大中断延迟时问为27个处理器指令周期,最小延迟时问为4个指令周期,再加上中断服务时间、现场恢复时间等,完成一次中断响应的时问要大于7~30个指令周期。当LPC2210使用最高系统频率60 MHz时,它的中断响应时间远大于O.2~0,6 μs,所以只能将OV7620的PCLK降频。通过设置时钟频率控制寄存器,可将PCLK的周期设为4μs左右。

  OV7620作为主设备的工作方式

  当OV7620工作于主设备方式时,它的YUV通道将连续不断地向总线上输出数据。如果将OV7620的YUV通道直接接在LPC2210的DO~D15数据总线上,则会干扰数据总线,使LPC2210不能正常运行;如果使用74HC244等隔离,分时使用数据总线的方法,则会大大降低系统的运行速度,使得LPC2210不能及时取走总线上的数据,造成图像数据不完整。由于LPC2210的数据总线宽度为32位,而Flash和SRAM仅占用了低16位数据线D0~D15,因此可以采用图l中的方法,将空闲的高16位数据线D16~D31设为GPIO,用于采集OV7620输出的16位图像数据。OV7620采用16位输出方式时,Y通道和UV通道的数据输出格式如表l所列。从表l中可以看出,每一行Y通道和UV通道交替输出上一行的重复数据和本行的新数据。而在一行之内,B数据只在奇数列出现,R数据只在偶数列出现。

  OV7620应用举例

  下面以一个55的像素点阵为例,详细介绍图像数据的恢复。首先定义一个515的字节型数组,在Pclk_IRQ()中断服务程序中读取55个像素点的图像数据;然后对图像数据进行插值,奇数点则在数组的连续3个字节中存入B、G、0,偶数点则存入O、G、R;最后对当前行的每一个字节与下一行对应列的每一个字节求平均值,即可算出当前行的RGB值。而在每一行内,奇数点的R数据和偶数点的B数据可通过分别对其两侧的2个点的R和B数据求平均值得到。这样,一幅图像就恢复好了。可以直接存成二进制文件(本系统采用串口输出到PC进行显示),或者增加BMP位图文件头信息,存成biBitCouNt=24的DIB位图文件;也可用LPC2210对此图像数据进行进一步的处理,如指纹识别等。如果采用带有DMA控制器,并且具有更高处理速度的ARM芯片,可大大提高整个图像采集系统的速度。例如,采用具有ARM9内核的S3C2410,其最高系统频率达203 MHz,完成一次DMA传送的时间约为30 ns。小于默认的PCLK的周期74 ns,可以实现30 fps的图像采集速度。 与搭配OV511+或CPLD/FPGA的图像采集系统相比,此图像采集系统极大地简化了系统结构,降低了系统设计成本,缩短了开发周期;图像数据的采集与处理均由ARM芯片完成,因而降低了数据中转过程中传输错误的几率,提高了系统的可靠性。

  OV7620的使用

  有人会奇怪为什么使用OV系列的摄像头每次都要进行SCCB的操作呢?难道它自己不会保存上次的操作结果吗?

  原因是:OV系列的摄像头的寄存器是EEPROM,不稳定,数据很容易丢失,因此程序每次初始化时我们都要重新写入寄存器设置。

  PS:常见需要修改的寄存器有,PCLK速率,帧率、图像亮度、对比度、色饱和度、镜像等功能。

  智能车摄像头组的初期学习中,虽然有不少摄像头优于OV7620,但是相信大部分的车友第一个接触的都是OV7620。下面从其特性和性能等角度,剖析摄像头的特点。

  摄像头的输出格式有RGB565,YUY422等格式,我所接触的第一个摄像头OV7620的输出格式是YUV422。下面给大家介绍一下YUV422。

  什么是YUV422?

  人的眼睛对低频信号比对高频信号具有更高的敏感度,事实上,人的眼睛对明视度的改变比对色彩的改变要敏感的多。因此,人们将RGB三色信号改为YUV来表示,其中Y为灰度,UV为色差。如果是表示一副彩色图像,同样的道理,YUV444是无损的存储方式,但是需要3个字节,存储空间开销很大。由于Y分量比UV分量重要的多,因此人们用YUV422来表示。这样一来图像被压缩了很多,一个字节就可以表示其彩色的信息。

  对于OV7620,它有2 组并行的数据口Y[7..0]和UV[7..0],其中对于数据口Y[7..0],输出的是灰度值Y,对于UV[7..0]输出的色度信号UV。下图给出了k 个像素(K 个字节)输出的格式。

  

  OV762的控制采用SCCB(Serial Camera ControlBus)协议。SCCB的简化的I2C协议,SIO-I是串行时钟输入线,SIO-O是串行双向数据线,分别相当于I2C协议的SCL和SDA。SCCB的总线时序与I2C基本相同,他的响应信号ACK被陈伟一个传输单元的第9位,分别Do not care和NA.Do not care位由从机产生;NA位由主机产生,由于SCCB不支持多字节的读写,NA位必须为高电平。另外SCCB没有重复起始的概念,因此在SCCB的读周期中,当主机发送读命令时,从机将不能产生Do not care响应信号。

  由于I2C和SCCB的一些细微差别,所以采用GPIO模拟SCCB总线的方式,SCL所连接的引脚始终设为输出方式,而SDA所连接的引脚在数据传输过程中,通过设置IODIR的值,动态改变引脚的输入/输出方式。SCCB的写周期直接使用I2C总线协议的写周期时序;而SC-CB的读周期,则增加一个总线停止条件。

  OV7620的几个优点:

  第一,OV7620的电平兼容3.3V和5V。目前智能车用户用到的处理器基本上可以分为XS128和K60和KL25三种控制器,而这三种控制器的工作电平分别是5V和3.3V和3.3V。OV7620可以完全适应这两种电平,XS128和K60和KL25可以随性切换,无需做电平匹配。(要注意的是当OV7620接5v和3.3v的时候,输出的效果是不同的,建议在5v的电压下使用,因为在3.3v的电压下使用比较难调,输出的16进制数据清一色偏小。)

  同样的情况下:

  3.3V下: 5v下:

  

  第二,OV7620的帧率是60帧/s。新手学习摄像头的时候,误以为摄像头帧率越快越好,其实不然。就拿OV7620来说,其PCLK(像素中断)的周期是73ns,该频率下的PCLK很容易被K60的IO捕捉,如果帧率更快的摄像头,其PCLK的周期就会更小,该频率下PCLK不易被K60的IO捕捉到。(但是鹰眼摄像头不然,火哥的鹰眼摄像头理论上宣传的是150帧每秒,但是他并不是通过PCLK的周期减小从而获得效果的,鹰眼摄像头的高明之处在于它在硬件二值化之后,每一次PCLK中断对外输出了8个像素,而不是1个像素。鹰眼摄像头已经买来了,以后有机会会试试效果。)

  第三:OV7620的分辨率也是非常合适的,在第三篇也提到OV7620是隔行扫描,采集VSYN的话,其输出分辨率是640*240。如果改为QVGA格式,默认输出分辨率是320*120,该分辨率下非常适合采集赛道,数据容量有限又不会失真图像。(OV7620的分辨率可以通过SCCB修改,有兴趣修改的可以去查看OV7620的寄存器配置,然后通过SCCB修改。)

  只有掌握了OV7620的时序,才能灵活得使用OV7620。下面开始本篇的重点:OV7620时序分析。

  对于OV7620,我们只关心场中断信号VSYN、行中断信号HREF、像素中断信号PCLK的波形。用示波器去监控这三个波形,可以看到一下关系。

  

  VSYN 的周期是16.64ms,高电平时间为换场时间,约80us;低电平时间内像素输出。我们在采集VSYN脉冲时,既可以采集上升沿,也可以采集下降沿,采集下降沿更准确些,这也是一场的开始。从VSYN的周期可以算出,1s/16.64ms=60帧,OV7620的帧率是60帧/s。

  HREF的周期63.6us,高电平时间为像素输出时间,约47us;低电平时间为换行时间,因此采集HREF一定要采集其上升沿,下降沿后的数据是无效的。从HREF的周期可以算出,16.64ms/63.6us≈261,除去期间的间隙时间,可以算出每场图像有240行。

  PCLK的周期是73ns,高电平输出像素,低电平像素无效。PCLK是一直输出的,因此一定要在触发VSYN并且触发HREF以后,再去捕捉PCLK才能捕捉到像素数据。从PCLK的周期可以算出,47us/73ns≈640,可以算出每行图像中有640个像素点。

  介绍完基本知识之后,下面开始写程序了(Keil--K60--C语言):

  在这我分成两部分着重介绍7620的时序程序和贴上SCCB的协议程序(其实原理和处理情况和I2C差不多):

  First :

  首先要对使用到的一些IO口进行初始化处理,四个部分的初始化,

  A.像素中断PCLK

  B.行中断HREF

  C.场中断VSYNC

  D.DMA

  程序如下:

  [objc] view plain copy//初始化OV7620模块

  void OV7620_Init()

  {

  //像素中断 PCLK

  GPIO_InitStruct1.GPIO_Pin = OV7620_PCLK_PIN;

  GPIO_InitStruct1.GPIO_InitState = Bit_SET;

  GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DMA_RISING;

  GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;

  GPIO_InitStruct1.GPIOx = OV7620_PCLK_PORT;

  GPIO_Init(&GPIO_InitStruct1);

  //行中断 HREF

  GPIO_InitStruct1.GPIO_Pin = OV7620_HREF_PIN;

  GPIO_InitStruct1.GPIO_InitState = Bit_SET;

  GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_RISING;

  GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;

  GPIO_InitStruct1.GPIOx = OV7620_HREF_PORT;

  GPIO_Init(&GPIO_InitStruct1);

  // 场中断 VSYNC

  GPIO_InitStruct1.GPIO_Pin = OV7620_VSYNC_PIN;

  GPIO_InitStruct1.GPIO_InitState = Bit_SET;

  GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_RISING; //GPIO_IT_RISING

  GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD; //GPIO_Mode_IPD

  GPIO_InitStruct1.GPIOx = OV7620_VSYNC_PORT;

  GPIO_Init(&GPIO_InitStruct1);

  //配置DMA

  DMA_InitStruct1.Channelx = DMA_CH1; //DMA 1通道

  DMA_InitStruct1.PeripheralDMAReq =PORTC_DMAREQ; //C端口(PCLK) 上升呀触发

  DMA_InitStruct1.MinorLoopLength = 170; //传输次数 超过摄像头每行像素数即可

  DMA_InitStruct1.TransferBytes = 1; //每次传输1个字节

  DMA_InitStruct1.DMAAutoClose = ENABLE; //连续采集

  DMA_InitStruct1.EnableState = ENABLE; //初始化后立即采集

  DMA_InitStruct1.SourceBaseAddr =(uint32_t)&PTD-》PDIR;//摄像头端口接D0-D7

  DMA_InitStruct1.SourceMajorInc = 0; //地址不增加

  DMA_InitStruct1.SourceDataSize = DMA_SRC_8BIT; //8BIT数据

  DMA_InitStruct1.SourceMinorInc = 0;

  DMA_InitStruct1.DestBaseAddr =(uint32_t)DMABuffer; //DMA 内存 //uint8_t DMABuffer[400];

  DMA_InitStruct1.DestMajorInc = 0;

  DMA_InitStruct1.DestDataSize = DMA_DST_8BIT;

  DMA_InitStruct1.DestMinorInc = 1; //每次传输 +1个字节

  DMA_Init(&DMA_InitStruct1);

  }

  然后开始编写场中断函数,编写之前我们需要在心里理一下思绪,在场中断函数里我们要按照顺序,做以下几件事情:

  A.确认是否是场中断,确认之后进入处理。

  B.清除标志位Flag。(Flag是用来观察是否处理完一场图像的标志)

  C.清除中断标志。

  D.计数全部清零。(因为新的一场已经开始)

  E.打开行中断,关闭场中断。

  [objc] view plain copyvoid PORTB_IRQHandler(void)//功 能:PORTB 外部中断服务 //V

  {

  u8 i=9;

  if((PORTB-》ISFR》》i)==1)

  {

  Flag = 0;

  PORTB-》ISFR|=(1《《9);

  Row = 0;

  Row_Num = 0;

  NVIC_EnableIRQ(PORTA_IRQn);//行

  NVIC_DisableIRQ(PORTB_IRQn);//场

  }

  接着编写行中断函数,在行中断中,我们要做以下几件事情:

  A.确认是否是行中断。

  B.关闭DMA中断,防止提前进入PCLK的采集。

  C.跳过消隐区。(消隐区:消隐区的出现,在电视机原理上,是因为电子束结束一行扫描,从一行尾换到另一行头,期间的空闲期,这叫做行消隐信号;同理,从一场尾换到另一场尾,期间也会有空闲期,这叫做场消隐信号。)

  D.进入行采集处理。

  E.配置DMA,并且打开DMA中断。

  F.行计数加1,表示已经采集完了一行。(因为PCLK的中断周期远远小于HREF的中断周期,所以不需要杞人忧天,担心中断搞得混乱。)

  G.当采集完了自己的目标行数之后,标志位Flag修改。并关闭行中断,打开场中断,等待下一次的场中断。

  [objc] view plain copyvoid PORTA_IRQHandler(void)//功 能:PORTA 外部中断服务//Herf

  {

  u8 i=14;

  DMA_SetEnableReq(DMA_CH1,DISABLE); //close DMA ISr

  if((PORTA-》ISFR》》i)==1);

  {

  PORTA-》ISFR|=(1《《14);

  if(Row_Num++ 》 15) //消隐区啦

  {

  if(Row_Num%5) //进入行采集

  {

  //配置DMA

  DMA_InitStruct1.Channelx = DMA_CH1; //DMA 1通道

  DMA_InitStruct1.PeripheralDMAReq =PORTC_DMAREQ; //C端口(PCLK) 上升呀触发

  DMA_InitStruct1.MinorLoopLength = 170; //传输次数 超过摄像头每行像素数即可

  DMA_InitStruct1.TransferBytes = 1; //每次传输1个字节

  DMA_InitStruct1.DMAAutoClose = ENABLE; //连续采集

  DMA_InitStruct1.EnableState = ENABLE; //初始化后立即采集

  DMA_InitStruct1.SourceBaseAddr =(uint32_t)&PTD-》PDIR;//摄像头端口接D0-D7

  DMA_InitStruct1.SourceMajorInc = 0; //地址不增加

  DMA_InitStruct1.SourceDataSize = DMA_SRC_8BIT; //8BIT数据

  DMA_InitStruct1.SourceMinorInc = 0;

  DMA_InitStruct1.DestBaseAddr =(uint32_t)Image[Row]; //DMA 内存 //uint8_t DMABuffer[400];

  DMA_InitStruct1.DestMajorInc = 0;

  DMA_InitStruct1.DestDataSize = DMA_DST_8BIT;

  DMA_InitStruct1.DestMinorInc = 1; //每次传输 +1个字节

  DMA_Init(&DMA_InitStruct1);

  ///////////////////////////////////////////////////////

  Row ++;

  if(Row==MAX_ROW)

  {

  Flag = 1;

  NVIC_DisableIRQ(PORTA_IRQn);//行

  NVIC_EnableIRQ(PORTB_IRQn);//场

  }

  }

  }

  }

  }

  最后给大家看一下,DMA的初始化函数,这个函数是超核的库里面的,不是我写的,但是上面的解释很详细了,相信都能看懂。

  [objc] view plain copyvoid DMA_Init(DMA_InitTypeDef *DMA_InitStruct)

  {

  //参数检查

  assert_param(IS_DMA_REQ(DMA_InitStruct-》PeripheralDMAReq));

  assert_param(IS_DMA_ATTR_SSIZE(DMA_InitStruct-》SourceDataSize));

  assert_param(IS_DMA_ATTR_DSIZE(DMA_InitStruct-》DestDataSize));

  assert_param(IS_DMA_CH(DMA_InitStruct-》Channelx));

  assert_param(IS_DMA_MINOR_LOOP(DMA_InitStruct-》MinorLoopLength));

  //打开DMA0和DMAMUX时钟源

  SIM-》SCGC6 |= SIM_SCGC6_DMAMUX_MASK;

  SIM-》SCGC7 |= SIM_SCGC7_DMA_MASK;

  //配置DMA触发源

  DMAMUX-》CHCFG[DMA_InitStruct-》Channelx] = DMAMUX_CHCFG_SOURCE(DMA_InitStruct-》PeripheralDMAReq);

  //设置源地址信息

  DMA0-》TCD[DMA_InitStruct-》Channelx].SADDR = DMA_InitStruct-》SourceBaseAddr;

  //执行完源地址操作后,是否在源地址基础上累加

  DMA0-》TCD[DMA_InitStruct-》Channelx].SOFF = DMA_SOFF_SOFF(DMA_InitStruct-》SourceMinorInc);

  //设置源地址传输宽度

  DMA0-》TCD[DMA_InitStruct-》Channelx].ATTR = 0;

  DMA0-》TCD[DMA_InitStruct-》Channelx].ATTR |= DMA_ATTR_SSIZE(DMA_InitStruct-》SourceDataSize);

  //主循环进行完后 是否更改源地址

  DMA0-》TCD[DMA_InitStruct-》Channelx].SLAST = DMA_InitStruct-》SourceMajorInc;

  //设置目的地址信息

  DMA0-》TCD[DMA_InitStruct-》Channelx].DADDR = DMA_InitStruct-》DestBaseAddr;

  //执行完源地址操作后,是否在源地址基础上累加

  DMA0-》TCD[DMA_InitStruct-》Channelx].DOFF = DMA_DOFF_DOFF(DMA_InitStruct-》DestMinorInc);

  //设置目的地址传输宽度

  DMA0-》TCD[DMA_InitStruct-》Channelx].ATTR |= DMA_ATTR_DSIZE(DMA_InitStruct-》DestDataSize);

  //主循环进行完后 是否更改源地址

  DMA0-》TCD[DMA_InitStruct-》Channelx].DLAST_SGA = DMA_InitStruct-》DestMajorInc;

  //设置计数器长度 循环次数

  //设置数据长度 长度每次递减 也被称作当前主循环计数 current major loop count

  DMA0-》TCD[DMA_InitStruct-》Channelx].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(DMA_InitStruct-》MinorLoopLength );

  //起始循环计数器 当主循环计数器为0 时候 将装载起始循环计数器的值

  DMA0-》TCD[DMA_InitStruct-》Channelx].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(DMA_InitStruct-》MinorLoopLength);

  //设置每一次传输字节的个数 个数到达上限时 DMA便将数据存入RAM

  DMA0-》TCD[DMA_InitStruct-》Channelx].NBYTES_MLNO = DMA_NBYTES_MLNO_NBYTES(DMA_InitStruct-》TransferBytes);

  //设置DMA TCD控制寄存器

  DMA0-》TCD[DMA_InitStruct-》Channelx].CSR = 0;

  if(DMA_InitStruct-》DMAAutoClose == ENABLE)

  {

  DMA0-》TCD[DMA_InitStruct-》Channelx].CSR |=DMA_CSR_DREQ_MASK;

  }

  else

  {

  DMA0-》TCD[DMA_InitStruct-》Channelx].CSR &=(~DMA_CSR_DREQ_MASK);

  }

  //使能此寄存器DMA开始工作

  DMA_SetEnableReq(DMA_InitStruct-》Channelx,DMA_InitStruct-》EnableState);

  //DMA 通道使能

  DMAMUX-》CHCFG[DMA_InitStruct-》Channelx] |= DMAMUX_CHCFG_ENBL_MASK;

  }

  Second:

  讲完OV7620的一些中断处理函数之后,我们来看看SCCB的库程序,这个库可以通用,需要的车友可以直接添加,只需要对照自己使用的库,在IO口初始化里面做出相应的修改即可。

  [objc] view plain copy#ifndef __SCCB_H

  #define __SCCB_H

  #define SCL_HIGH PEout(1) = 1 //设置为输出后输出1

  #define SCL_LOW PEout(1) = 0 //设置为输出后输出0

  #define SCL_OUT PTE-》PDDR|=(1《《1) //设置为输出

  //#define SCL_DDR_IN() PTE-》PDDR&=~(1《《1)//输入

  #define SDA_HIGH PEout(0)= 1 //设置为输出后输出1

  #define SDA_LOW PEout(0)= 0 //设置为输出后输出0

  #define SDA_DATA PEin(0)

  #define SDA_OUT PTE-》PDDR|=(1《《0) //设置为输出

  #define SDA_IN PTE-》PDDR&=~(1《《0) //设置为输入

  #define u8 unsigned char

  #define u16 unsigned short

  //#define ADDR_OV7725 0x42

  void sccb_init(void); //初始化SCCB端口为GPIO

  void sccb_wait(void); //SCCB时序延时

  void sccb_start(void); //起始标志

  void sccb_stop(void); //停止标志

  u8 sccb_sendByte(u8 data);

  void sccb_regWrite(u8 device,u8 address,u8 data);

  #endif

  #include “sys.h”

  #include “gpio.h”

  #include “sccb.h”

  #include “delay.h”

  #include “stdio.h”

  /*************************************************************************

  * 函数名称:sccb_init

  * 功能说明:初始化SCCB 其中SCL接PE1 SDA接PTE0

  *************************************************************************/

  void sccb_init(void)

  {

  int i ;

  GPIO_InitTypeDef GPIO_InitStruct1;

  for(i=0;i《8;i++)

  {

  GPIO_InitStruct1.GPIO_Pin = i;

  GPIO_InitStruct1.GPIO_InitState = Bit_RESET; //change as Bit_Set , it will shut.

  GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DISABLE;

  GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_InitStruct1.GPIOx = PTD;

  GPIO_Init(&GPIO_InitStruct1);

  }

  GPIO_InitStruct1.GPIO_Pin = 0;

  GPIO_InitStruct1.GPIO_InitState = Bit_RESET;

  GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DISABLE;

  GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_OPP;

  GPIO_InitStruct1.GPIOx = PTE;

  GPIO_Init(&GPIO_InitStruct1);

  GPIO_InitStruct1.GPIO_Pin = 1;

  GPIO_InitStruct1.GPIO_InitState = Bit_RESET;

  GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DISABLE;

  GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_OPP;

  GPIO_InitStruct1.GPIOx = PTE;

  GPIO_Init(&GPIO_InitStruct1);

  }

  /************************************************************************

  * 函数名称:sccb_wait

  * 功能说明:SCCB延时,不应太小

  *************************************************************************/

  void sccb_wait(void)

  {

  u8 i;

  u16 j;

  for( i=0; i《100; i++)

  {

  j++;

  }

  }

  /************************************************************************

  * 函数名称:sccb_start

  * 功能说明:SCCB启动位

  *************************************************************************/

  void sccb_start(void)

  {

  SCL_OUT;

  SDA_OUT;

  SDA_HIGH;

  //sccb_wait();

  SCL_HIGH;

  sccb_wait();

  SDA_LOW;

  sccb_wait();

  SCL_LOW;

  }

  /************************************************************************

  * 函数名称:sccb_stop

  * 功能说明:SCCB停止位

  *************************************************************************/

  void sccb_stop(void)

  {

  SCL_OUT;

  SDA_OUT;

  SDA_LOW;

  sccb_wait();

  SCL_HIGH;

  sccb_wait();

  SDA_HIGH;

  sccb_wait();

  }

  /************************************************************************

  * 函数名称:sccb_sendByte

  * 功能说明:在SCCB总线上发送一个字节

  * 参数说明:data 要发送的字节内容

  *************************************************************************/

  u8 sccb_sendByte(u8 data)

  {

  u8 i;

  u8 ack;

  SDA_OUT;

  for( i=0; i《8; i++)

  {

  if(data & 0x80)

  SDA_HIGH;

  else

  SDA_LOW;

  data 《《= 1;

  sccb_wait();

  SCL_HIGH;

  sccb_wait();

  SCL_LOW;

  sccb_wait();

  }

  SDA_HIGH;

  SDA_IN;

  sccb_wait();

  SCL_HIGH;

  sccb_wait();

  ack = SDA_DATA;

  SCL_LOW;

  sccb_wait();

  return ack;

  }

  /************************************************************************

  * 函数名称:sccb_regWrite

  * 功能说明:通过SCCB总线向指定设备的指定地址发送指定内容

  * 参数说明:device---设备号 读写有区别 42是写,43是写

  * address---写数据的寄存器

  * data---写的内容

  * 函数返回:ack=1未收到应答(失败) ack=0收到应答(成功)

  *************************************************************************/

  void sccb_regWrite(u8 device,u8 address,u8 data)

  {

  // u8 i;

  u8 ack;

  // for( i=0; i《20; i++)

  // {

  sccb_start();

  ack = sccb_sendByte(device);

  while( ack )

  {

  ack = sccb_sendByte(device);

  // printf(“device\n\r”);

  }

  ack = sccb_sendByte(address);

  while( ack )

  {

  ack = sccb_sendByte(address);;

  // printf(“address\n\r”);

  }

  ack = sccb_sendByte(data);

  while( ack )

  {

  ack = sccb_sendByte(data);

  // printf(“data\n\r”);

  }

  sccb_stop();

  // if( ack == 0 ) break;

  // }

  }

  贴上使用的SCCB的库之后,给大家看一下对SCCB的一段实例操作程序。程序上有详细的解释,我就不赘述了。

  [objc] view plain copysccb_init();

  sccb_regWrite(0x42,0x11,0x01); //地址0X11-中断四分频(1280*480) PCLK:166ns HREF:254.6us VSYN:133.6ms

  sccb_regWrite(0x42,0x14,0x24); //地址0X14-QVGA(320*240) PCLK:332ns HREF:509.6us VSYN:133.6ms

  sccb_regWrite(0x42,0x28,0x40); //地址0X28-黑白模式(320*240 PCLK:332ns HREF:127us VSYN:33.6ms

  sccb_wait();

  以上就是关于OV7620的使用了,看完之后大家是不是会使用了呢。关于后期图像的处理和调试,我目前正在使用一款智能车调试助手,感觉非常好用,完全免费,并且可以配合Visual Studio,在Visual Studio里面用C#编写一些图像处理的算法,生成dll文件,然后在调试助手的界面里面直接观察。非常好非常好。给大家看看图。

  

查看详情

ov7620技术

OV7620 cmos摄像头的使用

ov7620作为一款CMOS摄像头器件目前已经得到广泛运用。本文开始介绍了OV7620基本参数,其次介绍了摄像头工作原理,最后介绍了OV7620的使用。

2018-03-01 标签:摄像头OV7620 1.2万 1

ov7620怎么接线_ov7620硬件连接

本文开始介绍了OV7620的基本参数,其次介绍了ov7620硬件结构,最后阐述了ov7620的具体实现以及Ov7620的硬件连接。

2018-03-01 标签:摄像头ov7620 8983 0

一文看懂ov7620与ov7670的区别

本文开始对OV7620进行了介绍,其中包括了OV7620基本参数和OV7620应用实例,其次介绍了OV7670的参数与功能,最后分析了ov7620与ov...

2018-03-01 标签:摄像头ov7620ov7670 5.1万 1

基于FPGA的视觉导航小车设计与实现

基于FPGA的视觉导航小车设计与实现

视觉导航作为新兴起的技术,受众多研究者的青睐.设计了以现场可编程门列阵(FPGA)为控制核心的自主导航小车,采用一种新颖的自适应路径识别算法实现路径的识...

2017-11-18 标签:fpgaov7620 4307 0

查看更多>>

ov7620资讯

查看更多>>

ov7620数据手册

相关标签

相关话题

换一批
  • 加速度传感器
    加速度传感器
    +关注
    加速度传感器是一种能够测量加速度的传感器。通常由质量块、阻尼器、弹性元件、敏感元件和适调电路等部分组成。
  • OBD
    OBD
    +关注
    OBD是英文On-Board Diagnostic的缩写,中文翻译为“车载诊断系统”。这个系统随时监控发动机的运行状况和尾气后处理系统的工作状态,一旦发现有可能引起排放超标的情况,会马上发出警示。
  • 傅里叶变换
    傅里叶变换
    +关注
    尽管最初傅里叶分析是作为热过程的解析分析的工具,但是其思想方法仍然具有典型的还原论和分析主义的特征。“任意”的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式,而正弦函数在物理上是被充分研究而相对简单的函数类,这一想法跟化学上的原子论想法何其相似!
  • TOF
    TOF
    +关注
  • 角度传感器
    角度传感器
    +关注
    角度传感器,顾名思义,是用来检测角度的。它的身体中有一个孔,可以配合乐高的轴。当连结到RCX上时,轴每转过1/16圈,角度传感器就会计数一次。
  • L298
    L298
    +关注
  • DMD
    DMD
    +关注
    DMD是一种整合的微机电上层结构电路单元,利用COMS SRAM记忆晶胞所制成。DMD上层结构的制造是从完整CMOS内存电路开始,再透过光罩层的使用,制造出铝金属层和硬化光阻层交替的上层结构
  • MC9S12XS128
    MC9S12XS128
    +关注
    HCS12X系列单片机简介 Freescale 公司的16位单片机主要分为HC12 、HCS12、HCS12X三个系列。HC12核心是16位高速CPU12核,总线速度8MHZ;HCS12系列单片机以速度更快的CPU12内核为核心,简称S12系列,典型的S12总线速度可以达到25MHZ。
  • TDC-GP2
    TDC-GP2
    +关注
  • 干扰器
    干扰器
    +关注
    干扰器有多种类型,如GPS干扰器是适用于长途客车司机以及一些不想被GPS信号追踪到的人群的一个机器,手机信号干扰器主要针对各类考场、学校、加油站、教堂、法庭、图书馆、会议中心(室)、影剧院、医院、政府、金融、监狱、公安、军事重地等禁止使用手机的场所。
  • 重力传感器
    重力传感器
    +关注
    采用弹性敏感元件制成悬臂式位移器,与采用弹性敏感元件制成的储能弹簧来驱动电触点,完成从重力变化到电信号的转换,广泛应用在中高端智能手机和平板电脑内。
  • 线束
    线束
    +关注
  • 半导体工艺
    半导体工艺
    +关注
  • 机械臂
    机械臂
    +关注
  • MPSoC
    MPSoC
    +关注
  • Genesys
    Genesys
    +关注
  • 直流无刷电机
    直流无刷电机
    +关注
    无刷直流电机由电动机主体和驱动器组成,是一种典型的机电一体化产品。 无刷电机是指无电刷和换向器(或集电环)的电机,又称无换向器电机。早在十九纪诞生电机的时候,产生的实用性电机就是无刷形式,即交流鼠笼式异步电动机,这种电动机得到了广泛的应用。
  • 半导体制冷片
    半导体制冷片
    +关注
  • 声纹识别
    声纹识别
    +关注
    声纹识别,生物识别技术的一种,也称为说话人识别,包括说话人辨认和说话人确认。声纹识别就是把声信号转换成电信号,再用计算机进行识别。不同的任务和应用会使用不同的声纹识别技术,如缩小刑侦范围时可能需要辨认技术,而银行交易时则需要确认技术。
  • 零序
    零序
    +关注
  • ATmega16单片机
    ATmega16单片机
    +关注
  • 直流电压
    直流电压
    +关注
    凡是电流方向不随时间变化的电流称为直流电压。电流值可以全为正值,也可以全为负值。在直流电流中又可分为两种:稳恒直流和脉动直流。直流输电技术已经由简单的端对端工程朝着大规模多端输电的方向发展,这些工程将是未来直流电网的组成部分,将相同电压等级的直流工程连接成网远比不同电压等级下的独立工程更经济、便捷。
  • LPC2368
    LPC2368
    +关注
  • 缓冲电路
    缓冲电路
    +关注
  • Buck-Boost
    Buck-Boost
    +关注
    buck是降压型电路,boost是升压型电路,可以分开单独使用,buck-boost电路就是把2种电路合在一起,可升可降。buck-boost拓扑电路可以实现升降压功能,常见的buck-boost电路有两种,第一种是输入与输出电压极性相反,只需采用一个开关管和二极管。另外一种是采用两个开关管和两个二极管,可实现同极性电压升降压功能。
  • 识别技术
    识别技术
    +关注
    所谓识别技术,也称为自动识别技术,通过被识别物体与识别装置之间的交互自动获取被识别物体的相关信息,并提供给计算机系统供进一步处理。
  • 电磁继电器
    电磁继电器
    +关注
    电磁继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流、较低的电压去控制较大电流、较高的电压的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。
  • 制冷片
    制冷片
    +关注
  • VCM
    VCM
    +关注
  • 射频功放
    射频功放
    +关注

关注此标签的用户(3人)

陶骅骐 qq1094671095 纵使相逢不应识

编辑推荐厂商产品技术软件/工具OS/语言教程专题