48.OV7670摄像头实验

发布者:画意人生最新更新时间:2017-11-10 来源: eefocus关键字:OV7670  摄像头实验 手机看文章 扫描二维码
随时随地手机看文章

一。OV7670简介

48.OV7670摄像头实验

OV7670的特点:
48.OV7670摄像头实验

OV7670的时序:


48.OV7670摄像头实验

48.OV7670摄像头实验

48.OV7670摄像头实验

二。硬件连接


48.OV7670摄像头实验

48.OV7670摄像头实验
48.OV7670摄像头实验

三。源码讲解及例程测试

 

48.OV7670摄像头实验
读取传感器ID这步可以不要,是为了确定传感器是不是好的,能读出ID说明传感器是好的。

 

48.OV7670摄像头实验

以上步骤是MCU控制将图像存入到FIFO中的过程。

FIFO写使能后摄像头的数据就可以存入FIFO中,不写使能FIFO摄像头中的数据就存不进去。

等到第二个帧同步信号来时,说明一帧图像已经采集完了,采集完成后禁止FIFO写入,从而完成一帧图像的采集。然后MCU就可以读取数据,摄像头中的数据不能存取FIFO中,从而不会影响FIFO中的数据。

 

48.OV7670摄像头实验
以上是MCU如何读取已经存储在FIFO中的数据。

本实验中图像是以RGB565数据,一个像素为16位数据,因此要读2个字节。

读完数据后又可以重新采集数据,然后从FIFO中读取数据。

 

战舰开发板与摄像头模块连接电路图:

48.OV7670摄像头实验

实物连接图:

48.OV7670摄像头实验

驱动代码:


48.OV7670摄像头实验
1. SCCB_Init函数

初始化SCCB接口,也就是2个IO口的初始化。

SCL接PD3,SDA接PG13

 

//初始化SCCB接口
//CHECK OK
void SCCB_Init(void)
{             
 
  GPIO_InitTypeDef  GPIO_InitStructure;
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);  //使能PB端口时钟
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;     // 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
  GPIO_SetBits(GPIOG,GPIO_Pin_13);       // 输出高

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;     // 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //输输出
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  GPIO_SetBits(GPIOD,GPIO_Pin_3);       // 输出高
 
 SCCB_SDA_OUT();   
}   

在头文件中定义了:

SDA做输入时:

#define SCCB_SDA_IN()     {GPIOG->CRH&=0XFF0FFFFF;GPIOG->CRH|=0X00800000;}

SDA做输入时:
#define SCCB_SDA_OUT()    {GPIOG->CRH&=0XFF0FFFFF;GPIOG->CRH|=0X00300000;}

SCCB协议与I2C协议类似。

 

2. OV7670初始函数

 

//初始化OV7670
//返回0:成功
//返回其他值:错误代码
u8 OV7670_Init(void)
{
 u8 temp;
 u16 i=0;
 
  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);  //使能相关端口时钟
 

 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;  //VSYNC(帧同步信号)PA8 输入 上拉
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;     // 端口配置PB3-FIFO WEN,PB4-FIFO RCLK
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4); 

//注意:这里PB3和PB4默认是给JTAG用的,用的时候要先把JTAG禁止,然后才能当不同IO使用。


 GPIO_InitStructure.GPIO_Pin  = 0xff; //PC0~7 输入 上拉,PC0-PC7 接D0-D7
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

 

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6; //PD6-FIFO WRST
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
 GPIO_SetBits(GPIOD,GPIO_Pin_6);

   
 
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_14|GPIO_Pin_15; //PG14-FIFO RRST,PG15-FIFO OE
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
 GPIO_SetBits(GPIOG,GPIO_Pin_14|GPIO_Pin_15); 

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //SWD

  SCCB_Init();          //初始化SCCB 的IO口      
  if(SCCB_WR_Reg(0x12,0x80))return 1; //复位SCCB  
 delay_ms(50);
 //读取产品型号
  temp=SCCB_RD_Reg(0x0b);  
 if(temp!=0x73)return 2; 
  temp=SCCB_RD_Reg(0x0a);  
 if(temp!=0x76)return 2;


 //初始化OV7670序列  
 for(i=0;i
 {
     SCCB_WR_Reg(ov7670_init_reg_tbl[i][0],ov7670_init_reg_tbl[i][1]); //要初始化一百多个寄存器的值
  delay_ms(2);
  }
    return 0x00;  //ok
}


关键字:OV7670  摄像头实验 引用地址:48.OV7670摄像头实验

上一篇:47. 电阻型触摸屏实验
下一篇:STM32初识I2C

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved