OV7670使用说明和程序讲解
- 格式:pdf
- 大小:1.11 MB
- 文档页数:27
OV7670带FIFO的CMOS摄像头使用说明OV7670是一款带有FIFO的CMOS摄像头芯片,广泛应用于各种嵌入式系统中。
它具有低功耗、高灵敏度和高图像质量等特点,适合于图像采集和处理应用。
以下是OV7670带FIFO的CMOS摄像头的使用说明。
一、硬件连接1.连接供电:将模块的VCC引脚连接到3.3V的电源,GND引脚连接到地。
2.数据传输:-使用I2C协议进行配置:将模块的SDA引脚连接到主控芯片的SDA 引脚,SCL引脚连接到主控芯片的SCL引脚。
-使用FIFO模式进行数据传输:将模块的FIFO_WR引脚连接到主控芯片的写使能引脚,FIFO_RD引脚连接到主控芯片的读使能引脚,FIFO_WE 引脚连接到主控芯片的写时钟引脚,FIFO_OE引脚连接到主控芯片的读时钟引脚,FIFO_RST引脚连接到主控芯片的复位引脚,DATA引脚连接到主控芯片的数据引脚。
二、软件配置1.I2C配置:通过I2C协议对OV7670进行配置。
首先初始化I2C总线,然后发送配置指令给OV7670的I2C地址,通过写入特定的寄存器来配置图像参数,如分辨率、亮度、对比度等。
2.FIFO配置:通过FIFO模式进行数据传输。
首先对OV7670进行FIFO模式的配置,设置FIFO的像素格式、帧率等参数。
然后初始化主控芯片的访问FIFO的接口,设置读写使能信号并根据需要配置写时钟和读时钟。
最后,在读取FIFO数据之前,先进行FIFO的复位以确保数据的正确读取。
三、数据采集和处理1.数据采集:通过FIFO模式进行数据采集,将摄像头拍摄到的图像数据存储到FIFO缓存中。
2. 数据处理:从FIFO缓存中读取图像数据,并进行相关的图像处理操作,如图像解码、颜色空间转换、图像滤波等。
可以使用各种图像处理算法和库来实现不同的功能,如OpenCV等。
四、常见问题和解决方案1.图像质量问题:如果发现图像质量差,可以尝试调整摄像头的参数,如增加亮度、对比度等,或者使用图像后处理算法进行图像增强。
OV7670 的SCCB (I2C)调试1.几个基本概念A)在数据传输阶段,SDA的变化只能在SCK为低电平的时候,如果在SCK高电平的时候有SDA的变化,则可能表示的是I2C的Start或者StopB)Start:当SCK为高时,SDA从高跳变到低表示I2C总线的StartC)Stop:当SCK为高时,SDA从低跳变到高表示总线的StopD)ACK:每次传输8个bit以后,接收方都会有一个回应,如果为低表示ACK,表示OK,如果为高表示NACK,但不表示就有问题,比如Master接收Slave的数据的过程中不想接收了,就可以发送NACKE)地址 Address:在寻址段,在7位格式的地址中,发送的8位数据前七位为地址,如下图中的0x42, 最后一位表示此次发起的是读还是写,读为高电平,写为低电平。
F)子地址 SubAddress:这个东东在I2C的规范里面其实是没有的,不过很多厂家都喜欢整这个,其实就是地址段后面的一个或者两个自己的数据(一般使用写入R/W=0)。
比如俺们以前的BB没有这个概率,现在新的BB有了这个概念,还支持8位和16位。
1.一个写时序下面是一个写的地址段,加两个数据段的波形,先发送芯片ID,0x42和R/W=0, 然后发送两个写入的数据:0x32,0xb6。
1.一个写加一个读先写一个地址段,0x42,然后写入(RW=0)subaddress 0x0B。
然后重新启动一次传输,发送地址段,0x42, 读取之前写入的subaddress里面的值,读出的值为0x76,因为Master此时为receiver,要终止传输了,所以Master给Salve的回应为NACK。
也就是SCCB规范里面的一个2-phase write加一个2-phase read.4.最后来一个总线上没有设备的波形,上拉很弱。
OV7670
OV7670图像传感器:OV7670是美国OmniVision 公司的彩色/黑白CMOS 图像传感器。
这是一种自带图像敏感阵列和A/D 转换元件、能直接提供8位RGB/YUV等格式视频数字信号的彩色/黑白图像传感器,图像输出最高速度可达30帧/s,最大图像分辨率为640×480,3.3V 供电;它具有自动增益、自动白平衡、边缘增强、伽玛校正等控制功能;可以通过SCCB(兼容I2C总线)总线进行设置;同时OV7670 具有图像开窗输出的功能,即允许用户可根据实际使用需要设置其内部寄存器,使其只输出完整图像中的任意一个矩形区域内的信号,支持VGA,CIF和从CIF到40×30的各种尺寸。
基于FPGA的OV7670摄像头和液晶显示产品简介
一、总体介绍
该产品以ALTERA公司Cyclone II系列FPGA的EP2C8Q208C8N芯片为主控核心,通过在FPGA 外围扩展1片SDRAM、1片SRAM、1片Nor FLASH、1个SD卡座、一个OV7670摄像头模块、一块2.8寸TFT液晶显示屏等外围设备构成的图像采集、分析和存储系统。
在此硬件基础上,产品配套有以上外设的Verilog HDL或者NIOSII的驱动程序。
用户可以在此基础上开发设计基于FPGA硬件编码或者NIOSII的图像处理程序。
图1整体图片
二、产品硬件结构介绍
1.FPGA底板
图2FPGA底板正面
图2中,1为K4S641632,64M bit,2为EP2C8Q208C8N FPGA芯片,3为IS61LV25616A-10TI 512Kbyte的SRAM芯片,4为AM29LV320DB32Mbit芯片。
5为FPGA的AS模式编程接口,6为FPGA的JTAG模式编程接口。
图3FPGA底板反面
钟。
2.中间层扩展板
该板主要起转接作用,板子下面跟FPGA底板连接,上面跟液晶扩展板和摄像头模块连接。
3.液晶扩展板
该板带一块2.8寸TFT触摸液晶屏,带触摸屏AD转换芯片。
OV7670-CMOS摄像头使用说 明2014.2.10 参赛平台1.OV7670带FIFO 模块1.简介:OV7670带FIFO 模块,是针对慢速的MCU 能够实现图像采集控制推出的带有缓冲存储空间的一种模块。
这种模块增加了一个FIFO (先进先出)存储芯片,同样包含30w 像素的CMOS 图像感光芯片,3.6mm 焦距的镜头和镜头座,板载CMOS 芯片所需要的各种不同电源(电源要求详见芯片的数据文件),板子同时引出控制管脚和数据管脚,方便操作和使用。
图1.OV7670带FIFO模块 2.管脚定义:参赛平台如图,控制传感器所需的管脚定义如下:3V3-----输入电源电压(推荐使用3.3,5V 也可,但不推荐)GDN-----接地点SIO_C---SCCB 接口的控制时钟(注意:部分低级单片机需要上拉控制,和I2C 接口类似)SIO_D---SCCB 接口的串行数据输入(出)端(注意:部分低级单片机需要上拉控制,和I2C 接口类似) VSYNC---帧同步信号(输出信号)HREF----行同步信号(输出信号)PCLK----像素时钟(输出信号)XCLCK---时钟信号(输入信号)D0-D7---数据端口(输出信号)RESTE---复位端口(正常使用拉高)PWDN----功耗选择模式(正常使用拉低)STROBE—拍照闪光控制端口(正常使用可以不需要)FIFO_RCK---FIFO 内存读取时钟控制端FIFO_WR_CTR----FIFO 写控制端(1为允许CMOS 写入到FIFO,0为禁止) FIFO_OE----FIFO 关断控制FIFO_WRST—FIFO 写指针服务端FIFO_RRST—FIFO 读指针复位端 参赛平台图7.FIFO摄像头接口定义3.控制方式说明由于采用了FIFO 做为数据缓冲,数据采集大大简便,用户只需要关心是如何读取即可,不需要关心具体数据是如何采集到的,这样可减小甚至不用关心CMOS 的控制以及时序关系,就能够实现图像的采集。
用STM32F207 的DCMI接口驱动OV7670摄像头,目前我已经获取了摄像头图像,速度也很不错,图像也清晰,但是不知道为什么我的图像会一直走动,如图(原文件名:Catch(09-09-14-49-12).jpg)整个屏幕的图像会一直往下走,如此循环反复。
但是图像又是动态的,比如手在摄像头前晃动,图像里面的手也会动的,只是图像没有固定住,一直走动,请问下高手,这是什么原因啊?LCD驱动是ST官方的ili9320,摄像头的是在官方的9655驱动上改动初始化代码的。
DCMI 接口代码如下:/******************************************************************************** @函数名称DCMI_Config* @函数说明DCMI接口配置* @输入参数无* @输出参数无* @返回参数无*******************************************************************************/ void DCMI_Config(void){DCMI_InitTypeDef DCMI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;DMA_InitTypeDef DMA_InitStructure;//使能DAMI 的GPIO时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE);//使能DCMI时钟RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);//连接DCMI管脚到AF13功能GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_DCMI);// DCMI GPIO 配置// D0..D4(PC6/7/8/9/11)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;GPIO_Init(GPIOC, &GPIO_InitStructure);// D5..D7(PB6/8/9), VSYNC(PB7)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;GPIO_Init(GPIOB, &GPIO_InitStructure);// PCLK(PA6) HSYNC(PA4)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);// DCMI 配置DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Falling;DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_High;DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b;DCMI_Init(&DCMI_InitStructure);// 配置DMA2 传输数据从DCMI 到LCD// 使能DMA2 时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//DMA2 Stream1 配置DMA_DeInit(DMA2_Stream1);DMA_InitStructure.DMA_Channel = DMA_Channel_1;DMA_InitStructure.DMA_PeripheralBaseAddr = DCMI_DR_ADDRESS;DMA_InitStructure.DMA_Memory0BaseAddr = FSMC_LCD_ADDRESS;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;DMA_InitStructure.DMA_BufferSize = 1;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;DMA_Init(DMA2_Stream1, &DMA_InitStructure);}摄像头的初始化数组,移植的是网友的,稍微动了以下。