×
单片机 > 单片机程序设计 > 详情

48.OV7670摄像头实验

发布时间:2020-06-08 发布时间:
|

一。OV7670简介

OV7670的特点:


OV7670的时序:







二。硬件连接







三。源码讲解及例程测试

 


读取传感器ID这步可以不要,是为了确定传感器是不是好的,能读出ID说明传感器是好的。

 



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

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

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

 


以上是MCU如何读取已经存储在FIFO中的数据。

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

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

 

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


实物连接图:



驱动代码:



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  摄像头实验

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32 USB HID 键盘