一、简介:
OV7670一般模块指低成本数字输出CMOS摄像头,其摄像头包含30w像素的CMOS图像感光芯片,3.6mm焦距的镜头和镜头座,板载CMOS芯片所需要的各种不同电源(电源要求详见芯片的数据文件),板子同时引出控制管脚和数据管脚,方便操作和使用。
二、管脚定义
3V3-----输入电源电压(推荐使用3.3,5V也可,但不推荐)
GDN-----接地点
SIO_C---SCCB接口的控制时钟(注意:部分低级单片机需要上拉控制,和I2C接口类似) SIO_D---SCCB接口的串行数据输入(出)端(注意:部分低级单片机需要上拉控制,和I2C接口类似)
VSYNC---帧同步信号(输出信号)
HREF----行同步信号(输出信号)
PCLK----像素时钟(输出信号)
XCLCK---时钟信号(输入信号,时钟速度可以高达24M)
D0-D7---数据端口(输出信号)
RESTE---复位端口(正常使用拉高)
PWDN----功耗选择模式(正常使用拉低)
三、SCCB通讯时序
其作用是设置芯片内部寄存器,以控制图像的各种所需功能。其时序和一般的I2C时序相似,部分低级单片机要接上拉电阻。
行输出时序
行输出时序可用来控制一行像素的输出情况,HREF即一行输出的开始和结束信号,同时在像素时钟的同步下,输出8位的像素信号行输出时序图:
全帧输出下的时序情况:
该图显示的是一副图像输出的情况下,各控制信号和数据信号的输出。图中,VGA=640X480大小情况下,帧同步信号,行同步信号(HREF或 者HSYNC,注:HSYNC在其它场合下使用,CMOS可以设置,更多时候用HREF即可)如图:
//MAIN.C
uint16_t Row[320];
int main(void)
{
uint16_t linecnt=0;
uint16_t pixcnt=0;
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init();
printf("\r\n按下KEY1,测试KEY1按下的时间\r\n");
static unsigned long TimerCnt = 0;
static unsigned int temp7670 = 0;
uint16_t value,val,val1,val2;
ILI9341_Init (); //LCD 初始化
ILI9341_GramScan( 3 );
LCD_SetFont(&Font8x16);
LCD_SetColors(RED,BLACK);
ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH); /* 清屏,显示全黑 */
ILI9341_DispStringLine_EN(LINE(0),"BH OV7725 Test Demo");
while(1!=OV7660_init());
while(1)
{
while(value & 0x0800) value = GPIOB->IDR;
while((~value) & 0x0800) value = GPIOB->IDR;
LI9341_OpenWindow(0,0,320,240);
ILI9341_Write_Cmd ( 0x2C );
for(linecnt=0;linecnt<240;linecnt++)
{
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)==0);
for(pixcnt=0;pixcnt<320;pixcnt++)
{
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==0);
Row[pixcnt]=GPIOC->IDR&0XFF;
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==1);
Row[pixcnt]<<=8;
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==0);
Row[pixcnt]|=GPIOC->IDR&0XFF;
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==1);
}
for(pixcnt=0;pixcnt<320;pixcnt++)
{
val =ili9320_BGR2RGB(Row[pixcnt]);
ILI9341_Write_Data(val);
}
}
}
}