一、簡介:??
OV7670一般模塊指低成本數(shù)字輸出CMOS攝像頭,其攝像頭包含30w像素的CMOS圖像感光芯片,3.6mm焦距的鏡頭和鏡頭座,板載CMOS芯片所需要的各種不同電源(電源要求詳見芯片的數(shù)據(jù)文件),板子同時引出控制管腳和數(shù)據(jù)管腳,方便操作和使用。
二、管腳定義
3V3-----輸入電源電壓(推薦使用3.3,5V也可,但不推薦)?
GDN-----接地點?
SIO_C---SCCB接口的控制時鐘(注意:部分低級單片機(jī)需要上拉控制,和I2C接口類似) SIO_D---SCCB接口的串行數(shù)據(jù)輸入(出)端(注意:部分低級單片機(jī)需要上拉控制,和I2C接口類似)?
VSYNC---幀同步信號(輸出信號)?
HREF----行同步信號(輸出信號)?
PCLK----像素時鐘(輸出信號)?
XCLCK---時鐘信號(輸入信號,時鐘速度可以高達(dá)24M)?
D0-D7---數(shù)據(jù)端口(輸出信號)?
RESTE---復(fù)位端口(正常使用拉高)?
PWDN----功耗選擇模式(正常使用拉低)?
三、SCCB通訊時序
其作用是設(shè)置芯片內(nèi)部寄存器,以控制圖像的各種所需功能。其時序和一般的I2C時序相似,部分低級單片機(jī)要接上拉電阻。
行輸出時序?
行輸出時序可用來控制一行像素的輸出情況,HREF即一行輸出的開始和結(jié)束信號,同時在像素時鐘的同步下,輸出8位的像素信號行輸出時序圖:
全幀輸出下的時序情況:?
該圖顯示的是一副圖像輸出的情況下,各控制信號和數(shù)據(jù)信號的輸出。圖中,VGA=640X480大小情況下,幀同步信號,行同步信號(HREF或 者HSYNC,注:HSYNC在其它場合下使用,CMOS可以設(shè)置,更多時候用HREF即可)如圖:
//ov7670.c
void CLK_init_ON(void)
{
? ?GPIO_InitTypeDef GPIO_InitStructure;
?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;?
? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;?
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ;?
? ? GPIO_Init(GPIOA, &GPIO_InitStructure);
? ? RCC_MCOConfig(RCC_MCO_HSE ?);//hsi
}
void CLK_init_OFF(void)
{
? ? GPIO_InitTypeDef GPIO_InitStructure;
??RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;?
? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;?
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
? ? GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void OV7670_GPIO_Init(void)
{
? GPIO_InitTypeDef GPIO_InitStructure;
??RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
? GPIO_InitStructure.GPIO_Pin = ?0X0BFF;
? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//GPIO_Mode_AF_OD ?GPIO_Mode_AF_PP GPIO_Mode_IPU?? ?GPIO_Mode_IN_FLOATING ??
? //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
? GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void OV7670_GPIO_CONTRL_CONFIG(void)
{
? ? GPIO_InitTypeDef GPIO_InitStructure;
?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
? ? GPIO_InitStructure.GPIO_Pin = LCD_HREF_BIT|LCD_VSYNC_BIT|LCD_PCLK_BIT;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;?
? ? GPIO_Init(GPIOC, &GPIO_InitStructure);
? ? RCC_MCOConfig(RCC_MCO_HSE ?);//hsi
}
//功能:寫OV7670寄存器
//返回:1-成功?? ?0-失敗
unsigned char wrOV7670Reg(unsigned char regID, unsigned char regDat)
{
?? ?startSCCB();
?? ?if(0==SCCBwriteByte(0x42))
?? ?{
?? ??? ?stopSCCB();
?? ??? ?return(0);
?? ?}
?? ?delay_us(100);
? ?? ?if(0==SCCBwriteByte(regID))
?? ?{
?? ??? ?stopSCCB();
?? ??? ?return(0);
?? ?}
?? ?delay_us(100);
? ?? ?if(0==SCCBwriteByte(regDat))
?? ?{
?? ??? ?stopSCCB();
?? ??? ?return(0);
?? ?}
? ?? ?stopSCCB();
?? ?
? ?? ?return(1);
}
//功能:讀OV7670寄存器
//返回:1-成功?? ?0-失敗
unsigned char rdOV7670Reg(unsigned char regID, unsigned char *regDat)
{
?? ?//通過寫操作設(shè)置寄存器地址
?? ?startSCCB();
?? ?if(0==SCCBwriteByte(0x42))
?? ?{
?? ??? ?stopSCCB();
?? ??? ?return(0);
?? ?}
?? ?delay_us(100);
? ?? ?if(0==SCCBwriteByte(regID))
?? ?{
?? ??? ?stopSCCB();
?? ??? ?return(0);
?? ?}
?? ?stopSCCB();
?? ?
?? ?delay_us(100);
?? ?
?? ?//設(shè)置寄存器地址后,才是讀
?? ?startSCCB();
?? ?if(0==SCCBwriteByte(0x43))
?? ?{
?? ??? ?stopSCCB();
?? ??? ?return(0);
?? ?}
?? ?delay_us(100);
? ?? ?*regDat=SCCBreadByte();
? ?? ?noAck();
? ?? ?stopSCCB();
? ?? ?return(1);
}
//(140,16,640,480) is good for VGA
//(272,16,320,240) is good for QVGA
/* config_OV7670_window */
void OV7670_config_window(unsigned int startx,unsigned int starty,unsigned int width, unsigned int height)
{
?? ?unsigned int endx;
?? ?unsigned int endy;// "v*2"必須
?? ?unsigned char temp_reg1, temp_reg2;
?? ?unsigned char temp=0;
?? ?endx=(startx+width);
?? ?endy=(starty+height+height);// "v*2"必須
? ? ? ? rdOV7670Reg(0x03, &temp_reg1 );
?? ?temp_reg1 &= 0xf0;
?? ?rdOV7670Reg(0x32, &temp_reg2 );
?? ?temp_reg2 &= 0xc0;
?? ?// Horizontal
?? ?temp = temp_reg2|((endx&0x7)<<3)|(startx&0x7);
?? ?wrOV7670Reg(0x32, temp );
?? ?temp = (startx&0x7F8)>>3;
?? ?wrOV7670Reg(0x17, temp );
?? ?temp = (endx&0x7F8)>>3;
?? ?wrOV7670Reg(0x18, temp );
?? ?// Vertical
?? ?temp =temp_reg1|((endy&0x3)<<2)|(starty&0x3);
?? ?wrOV7670Reg(0x03, temp );
?? ?temp = starty>>2;
?? ?wrOV7670Reg(0x19, temp );
?? ?temp = endy>>2;
?? ?wrOV7670Reg(0x1A, temp );
}set_OV7670reg(void)
{
?? ?wrOV7670Reg(0x8c, 0x00);
?? ?wrOV7670Reg(0x3a, 0x04);
?? ?wrOV7670Reg(0x40, 0xd0);
?? ?wrOV7670Reg(0x8c, 0x00);
?? ?wrOV7670Reg(0x12, 0x14);
?? ?wrOV7670Reg(0x32, 0x80);
?? ?wrOV7670Reg(0x17, 0x16);
?? ?wrOV7670Reg(0x18, 0x04);
?? ?wrOV7670Reg(0x19, 0x02);
?? ?wrOV7670Reg(0x1a, 0x7b);
?? ?wrOV7670Reg(0x03, 0x06);
?? ?wrOV7670Reg(0x0c, 0x04);
?? ?wrOV7670Reg(0x3e, 0x00);
?? ?wrOV7670Reg(0x70, 0x3a);
?? ?wrOV7670Reg(0x71, 0x35);?
?? ?wrOV7670Reg(0x72, 0x11);?
?? ?wrOV7670Reg(0x73, 0x00);
?? ?wrOV7670Reg(0xa2, 0x00);
?? ?wrOV7670Reg(0x11, 0xff);?
?? ?//wrOV7670Reg(0x15 , 0x31);
?? ?wrOV7670Reg(0x7a, 0x20);?
?? ?wrOV7670Reg(0x7b, 0x1c);?
?? ?wrOV7670Reg(0x7c, 0x28);?
?? ?wrOV7670Reg(0x7d, 0x3c);
?? ?wrOV7670Reg(0x7e, 0x55);?
?? ?wrOV7670Reg(0x7f, 0x68);?
?? ?wrOV7670Reg(0x80, 0x76);
?? ?wrOV7670Reg(0x81, 0x80);?
?? ?wrOV7670Reg(0x82, 0x88);
?? ?wrOV7670Reg(0x83, 0x8f);
?? ?wrOV7670Reg(0x84, 0x96);?
?? ?wrOV7670Reg(0x85, 0xa3);
?? ?wrOV7670Reg(0x86, 0xaf);
?? ?wrOV7670Reg(0x87, 0xc4);?
?? ?wrOV7670Reg(0x88, 0xd7);
?? ?wrOV7670Reg(0x89, 0xe8);
?? ??
?? ?wrOV7670Reg(0x32,0xb6);
?? ?
?? ?wrOV7670Reg(0x13, 0xff);?
?? ?wrOV7670Reg(0x00, 0x00);
?? ?wrOV7670Reg(0x10, 0x00);
?? ?wrOV7670Reg(0x0d, 0x00);
?? ?wrOV7670Reg(0x14, 0x4e);
?? ?wrOV7670Reg(0xa5, 0x05);
?? ?wrOV7670Reg(0xab, 0x07);?
?? ?wrOV7670Reg(0x24, 0x75);
?? ?wrOV7670Reg(0x25, 0x63);
?? ?wrOV7670Reg(0x26, 0xA5);
?? ?wrOV7670Reg(0x9f, 0x78);
?? ?wrOV7670Reg(0xa0, 0x68);
//?? ?wrOV7670Reg(0xa1, 0x03);//0x0b,
?? ?wrOV7670Reg(0xa6, 0xdf);
?? ?wrOV7670Reg(0xa7, 0xdf);
?? ?wrOV7670Reg(0xa8, 0xf0);?
?? ?wrOV7670Reg(0xa9, 0x90);?
?? ?wrOV7670Reg(0xaa, 0x94);?
?? ?//wrOV7670Reg(0x13, 0xe5);?
?? ?wrOV7670Reg(0x0e, 0x61);
?? ?wrOV7670Reg(0x0f, 0x43);
?? ?wrOV7670Reg(0x16, 0x02);?
?? ?wrOV7670Reg(0x1e, 0x37);
?? ?wrOV7670Reg(0x21, 0x02);
?? ?wrOV7670Reg(0x22, 0x91);
?? ?wrOV7670Reg(0x29, 0x07);
?? ?wrOV7670Reg(0x33, 0x0b);
?? ?wrOV7670Reg(0x35, 0x0b);
?? ?wrOV7670Reg(0x37, 0x3f);
?? ?wrOV7670Reg(0x38, 0x01);
?? ?wrOV7670Reg(0x39, 0x00);
?? ?wrOV7670Reg(0x3c, 0x78);
?? ?wrOV7670Reg(0x4d, 0x40);
?? ?wrOV7670Reg(0x4e, 0x20);
?? ?wrOV7670Reg(0x69, 0x00);
?? ?wrOV7670Reg(0x6b, 0x4a);
?? ?wrOV7670Reg(0x74, 0x19);
?? ?wrOV7670Reg(0x8d, 0x4f);
?? ?wrOV7670Reg(0x8e, 0x00);
?? ?wrOV7670Reg(0x8f, 0x00);
?? ?wrOV7670Reg(0x90, 0x00);
?? ?wrOV7670Reg(0x91, 0x00);
?? ?wrOV7670Reg(0x92, 0x00);
?? ?wrOV7670Reg(0x96, 0x00);
?? ?wrOV7670Reg(0x9a, 0x80);
?? ?wrOV7670Reg(0xb0, 0x84);
?? ?wrOV7670Reg(0xb1, 0x0c);
?? ?wrOV7670Reg(0xb2, 0x0e);
?? ?wrOV7670Reg(0xb3, 0x82);
?? ?wrOV7670Reg(0xb8, 0x0a);
?? ?wrOV7670Reg(0x43, 0x14);
?? ?wrOV7670Reg(0x44, 0xf0);
?? ?wrOV7670Reg(0x45, 0x34);
?? ?wrOV7670Reg(0x46, 0x58);
?? ?wrOV7670Reg(0x47, 0x28);
?? ?wrOV7670Reg(0x48, 0x3a);
?? ?
?? ?wrOV7670Reg(0x59, 0x88);
?? ?wrOV7670Reg(0x5a, 0x88);
?? ?wrOV7670Reg(0x5b, 0x44);
?? ?wrOV7670Reg(0x5c, 0x67);
?? ?wrOV7670Reg(0x5d, 0x49);
?? ?wrOV7670Reg(0x5e, 0x0e);
?? ?
?? ?wrOV7670Reg(0x64, 0x04);
?? ?wrOV7670Reg(0x65, 0x20);
?? ?wrOV7670Reg(0x66, 0x05);?? ?wrOV7670Reg(0x94, 0x04);
?? ?wrOV7670Reg(0x95, 0x08);?? ???? ?wrOV7670Reg(0x6c, 0x0a);
?? ?wrOV7670Reg(0x6d, 0x55);
?? ?wrOV7670Reg(0x6e, 0x11);
?? ?wrOV7670Reg(0x6f, 0x9f);??? ?wrOV7670Reg(0x6a, 0x40);
?? ?wrOV7670Reg(0x01, 0x40);
?? ?wrOV7670Reg(0x02, 0x40);
?? ?
?? ?//wrOV7670Reg(0x13, 0xe7);
?? ?wrOV7670Reg(0x15, 0x00);
?? ?wrOV7670Reg(0x4f, 0x80);
?? ?wrOV7670Reg(0x50, 0x80);
?? ?wrOV7670Reg(0x51, 0x00);
?? ?wrOV7670Reg(0x52, 0x22);
?? ?wrOV7670Reg(0x53, 0x5e);
?? ?wrOV7670Reg(0x54, 0x80);
?? ?wrOV7670Reg(0x58, 0x9e);?? ?wrOV7670Reg(0x41, 0x08);
?? ?wrOV7670Reg(0x3f, 0x00);
?? ?wrOV7670Reg(0x75, 0x05);
?? ?wrOV7670Reg(0x76, 0xe1);?? ?wrOV7670Reg(0x4c, 0x00);
?? ?wrOV7670Reg(0x77, 0x01);
?? ?
?? ?wrOV7670Reg(0x3d, 0xc1);
?? ?wrOV7670Reg(0x4b, 0x09);
?? ?wrOV7670Reg(0xc9, 0x60);
?? ?//wrOV7670Reg(0x41, 0x38);?? ?
?? ?wrOV7670Reg(0x56, 0x40);
?? ?wrOV7670Reg(0x34, 0x11);
?? ?wrOV7670Reg(0x3b, 0x02);
?? ?wrOV7670Reg(0xa4, 0x89);
?? ?
?? ?wrOV7670Reg(0x96, 0x00);
?? ?wrOV7670Reg(0x97, 0x30);
?? ?wrOV7670Reg(0x98, 0x20);
?? ?wrOV7670Reg(0x99, 0x30);
?? ?wrOV7670Reg(0x9a, 0x84);
?? ?wrOV7670Reg(0x9b, 0x29);
?? ?wrOV7670Reg(0x9c, 0x03);
?? ?wrOV7670Reg(0x9d, 0x4c);
?? ?wrOV7670Reg(0x9e, 0x3f);?? ??? ?wrOV7670Reg(0x09, 0x00);
?? ?wrOV7670Reg(0x3b, 0xc2);}
/* OV7670_init() */
//返回1成功,返回0失敗
unsigned char OV7670_init(void)
{
?? ?unsigned char temp;?? ?
?? ?unsigned int i=0;?? ?OV7670_GPIO_Init();
?? ?OV7670_GPIO_CONTRL_CONFIG();
?? ?SCCB_GPIO_Config(); // io init..? ? CLK_init_ON();
?? ?temp=0x80;
?? ?if(0==wrOV7670Reg(0x12, temp)) //Reset SCCB
?? ?{
? ? ? ? return 0 ;
?? ?}
?? ?delay_ms(100);
? ?? ?set_OV7670reg();? OV7670_config_window(272,12,320,240);// set 240*320
?? ?return 0x01; //ok?? ??? ??? ? ?
}?
//main.c
?? ?while(1!=OV7670_init());?? ?
? ? while(1)?
? ? {
? ? ? ? TimerCnt = 0;
? ? ? ? temp7670 = 0;
? ? ? ? CLK_init_ON(); // OV7670 XCLK 開
? ? ? ? while(value & 0x0800) ? ?value = GPIOC->IDR; ? // Vsync=H ? ?
? ? ? ? while((~value) & 0x0800) value = GPIOC->IDR; ? // Vhync=L?
? ? ? ? CLK_init_OFF(); //OV7670 XCLK 關(guān)
?? ??? ?while(TimerCnt < 76800)
? ? ? ? {
?? ??? ??? ?XCLK_L;?
? ? ? ? ? ? XCLK_H;
?? ??? ??? ?value = GPIOC->IDR;
?? ??? ??? ?temp7670 ++;
?? ??? ??? ?if(value & 0x0100) // HREF = H ||(LCD_PCLK_STATE)
? ? ? ? ? ? {? ?
?? ??? ??? ? ? if((temp7670 == 1))// 高字節(jié)||(value & 0x0200) ||(LCD_PCLK_STATE)?
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ?? ?val1=value& 0x00ff;文章來源:http://www.zghlxwxcb.cn/news/detail-638189.html? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else // 低字節(jié)?? ? if((temp7670 != 1)||(LCD_PCLK_STATE)) ?
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ??? ?val2= value<<8 ?; ?? ? //
? ? ? ? ? ? val =ili9320_BGR2RGB(val1|val2);
? ? ? ? ? ? ? ? ? ? temp7670 = 0;
? ? ? ? ? ? ? ? ? ? LCD_WriteRAM(val); //TFT GRAM 數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? TimerCnt ++;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }?
?? ??? ?
?? ??? ??? ??? ?
?? ??? ?}
? } ?文章來源地址http://www.zghlxwxcb.cn/news/detail-638189.html
到了這里,關(guān)于stm32(SCCB)+ov7670攝像頭輸出圖像程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!