一。OV7670简介
二。硬件连接
读取传感器ID这步可以不要,是为了确定传感器是不是好的,能读出ID说明传感器是好的。
FIFO写使能后摄像头的数据就可以存入FIFO中,不写使能FIFO摄像头中的数据就存不进去。
等到第二个帧同步信号来时,说明一帧图像已经采集完了,采集完成后禁止FIFO写入,从而完成一帧图像的采集。然后MCU就可以读取数据,摄像头中的数据不能存取FIFO中,从而不会影响FIFO中的数据。
本实验中图像是以RGB565数据,一个像素为16位数据,因此要读2个字节。
读完数据后又可以重新采集数据,然后从FIFO中读取数据。
战舰开发板与摄像头模块连接电路图:
实物连接图:
初始化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
}
上一篇:47. 电阻型触摸屏实验
下一篇:STM32初识I2C
- 热门资源推荐
- 热门放大器推荐