摄像头在阳光下照的就很多斜线 在暗的地方就比较少纹!这是什么情况没初始化好吗?
我的摄像头是没FIFO的也没晶振我用MCO给了时钟;
[mw_shl_code=c,true]u16 ili9320_BGR2RGB(u16 c)
{
u16 r, g, b, rgb;
b = (c>>0) & 0x1f;
g = (c>>5) & 0x3f;
r = (c>>11) & 0x1f;
rgb = (b<<11) + (g<<5) + (r<<0);
return( rgb );
}
int main(void)
{
// static unsigned long TimerCnt = 0;
// static unsigned int temp7670 = 0;
u16 value,val,val1,val2;
u32 j;
u16 color;
delay_init(168);
LCD_Init();
LCD_Clear(0);;
LCD_SetAdd(0,0,239,319);
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 关
while(TimerCnt < 76800*2)
{
OV7670_RST_SETB;
XCLK_L;
XCLK_H;
XCLK_L;
OV7670_RST_CLR;
XCLK_H;
value = GPIOC->IDR;
temp7670 ++;
if(value & 0x0100) // HREF = H ||(LCD_PCLK_STATE)
{
//value = GPIOC->IDR;
//display[TimerCnt]=value;
if(temp7670 == 1)// 高字节||(value & 0x0200) ||(LCD_PCLK_STATE)
{
val1=value& 0x00ff;
}
else // 低字节 if((temp7670 != 1)||(LCD_PCLK_STATE))
{
val2= value<<8 ; //
val =ili9320_BGR2RGB(val1 |val2);
temp7670 = 0;
LCD_WR_INT(val); //TFT GRAM 数据
TimerCnt ++;
}
}
}*/
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 关*/
OV7670_RST_CLR; //开始复位读指针
XCLK_L;
XCLK_H;
XCLK_L;
OV7670_RST_SETB; //复位读指针结束
XCLK_H;
for(j=0;j<76800;j++)
{
XCLK_L;
color=GPIOC->IDR&0XFF; //读数据
XCLK_H;
color<<=8;
XCLK_L;
color|=GPIOC->IDR&0XFF; //读数据
XCLK_H;
LCD_WR_INT(ili9320_BGR2RGB(color));
}
//CLK_init_OFF();
}
}
↓↓↓↓↓↓驱动程序↓↓↓↓↓
void CLK_init_ON(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* Configure MCO2 pin(PC9) in alternate function */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_Pin_8,GPIO_AF_MCO);
/* System clock selected to output on MCO2 pin(PC9)*/
RCC_MCO1Config(RCC_MCO1Source_HSE,RCC_MCO1Div_2);
//RCC_HSICmd(ENABLE);
}
void CLK_init_OFF(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void OV7670_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOC clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
/* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|
GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//GPIO_Mode_AF_OD GPIO_Mode_AF_PP GPIO_Mode_IPU GPIO_Mode_IN_FLOATING
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF, &GPIO_InitStructure);*/
/* Enable GPIOC clock */
GPIO_InitStructure.GPIO_Pin = 0X0BFF;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void OV7670_GPIO_CONTRL_CONFIG(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = LCD_HREF_BIT|LCD_VSYNC_BIT|LCD_PCLK_BIT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* System clock selected to output on MCO2 pin(PC9)*/
RCC_MCO2Config(RCC_MCO2Source_HSE, RCC_MCO2Div_2);
}
////////////////////////////
//功能:写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)
{
//通过写操作设置寄存器地址
startSCCB();
if(0==SCCBwriteByte(0x42))
{
stopSCCB();
return(0);
}
delay_us(100);
if(0==SCCBwriteByte(regID))
{
stopSCCB();
return(0);
}
stopSCCB();
delay_us(100);
//设置寄存器地址后,才是读
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 );
}
void set_OV7670reg(void)
{
wrOV7670Reg(0x8c, 0x00);
wrOV7670Reg(0x3a, 0x04);
wrOV7670Reg(0x40, 0xd0); //原来10,通用COM15,设置输出数据范围和输出格式
wrOV7670Reg(0x8c, 0x00);
wrOV7670Reg(0x12, 0x14); //输出格式QVGA,原设置为0x14
wrOV7670Reg(0x32, 0x80);
wrOV7670Reg(0x17, 0x16);
wrOV7670Reg(0x18, 0x04);
wrOV7670Reg(0x19, 0x02);
wrOV7670Reg(0x1a, 0x7b);//0x7a, 原来0x7b
wrOV7670Reg(0x03, 0x06);//0x0a, 原来0x06
wrOV7670Reg(0x0c, 0x04);//原来0x04 com3,设置缩放,省电,模式等
wrOV7670Reg(0x3e, 0x00);// 原来0x00 com14,dcw和pclk缩放设置,以及分频等
wrOV7670Reg(0x70, 0x3a); //原来0x04
wrOV7670Reg(0x71, 0x35); //原来0x35
wrOV7670Reg(0x72, 0x11); //原来0x11
wrOV7670Reg(0x73, 0x00);//原来f0 已改这里改变很重要
wrOV7670Reg(0xa2, 0x00); //原来0x02
wrOV7670Reg(0x11, 0xff); //时钟频率,这里改为最大值,原来为0x81 (改变)
//wrOV7670Reg(0x15 , 0x31);
wrOV7670Reg(0x7a, 0x20); //原来0x20 寄存器7a--89为伽马曲线设置
wrOV7670Reg(0x7b, 0x1c); //原来0x1c
wrOV7670Reg(0x7c, 0x28); //原来0x28
wrOV7670Reg(0x7d, 0x3c); //原来0x3c
wrOV7670Reg(0x7e, 0x55); //原来0x55
wrOV7670Reg(0x7f, 0x68); //原来0x68
wrOV7670Reg(0x80, 0x76); //原来0x76
wrOV7670Reg(0x81, 0x80); //原来0x80
wrOV7670Reg(0x82, 0x88); //原来0x88
wrOV7670Reg(0x83, 0x8f); //原来0x8f
wrOV7670Reg(0x84, 0x96); //原来0x96
wrOV7670Reg(0x85, 0xa3); //原来0xa3
wrOV7670Reg(0x86, 0xaf); //原来0xaf
wrOV7670Reg(0x87, 0xc4); //原来0xc4
wrOV7670Reg(0x88, 0xd7); //原来0xd7
wrOV7670Reg(0x89, 0xe8); //原来0xe8
wrOV7670Reg(0x32,0xb6);
wrOV7670Reg(0x13, 0xff); //原来0xe0 com13 AGC,AWB,AEC使能控制 (改变)
wrOV7670Reg(0x00, 0x00);//AGC //原来0x00
wrOV7670Reg(0x10, 0x00);//原来0x00 曝光值
wrOV7670Reg(0x0d, 0x00);//原来0x00 COM4
wrOV7670Reg(0x14, 0x4e);//原来0x28, limit the max gain 自动增益设置 没变化
wrOV7670Reg(0xa5, 0x05); //原来0x05 50Hz bangding step limting
wrOV7670Reg(0xab, 0x07); //原来0x07 60Hz bangding step limting
wrOV7670Reg(0x24, 0x75); //原来0x75 agc/aec-稳定运行区域上限
wrOV7670Reg(0x25, 0x63); //原来0x63 agc/aec-稳定运行区域下限
wrOV7670Reg(0x26, 0xA5); //原来0xa5 agc/aec-快速运行区域
wrOV7670Reg(0x9f, 0x78); //原来0x78 基于直方图的aec/agc的控制1
wrOV7670Reg(0xa0, 0x68); //原来0x68 基于直方图的aec/agc的控制2
// wrOV7670Reg(0xa1, 0x03);//0x0b,
wrOV7670Reg(0xa6, 0xdf);//0xd8, 原来0xdf 基于直方图的aec/agc的控制3
wrOV7670Reg(0xa7, 0xdf);//0xd8, 原来0xdf 基于直方图的aec/agc的控制4
wrOV7670Reg(0xa8, 0xf0); //原来0xf0 基于直方图的aec/agc的控制5
wrOV7670Reg(0xa9, 0x90); //原来0x90 基于直方图的aec/agc的控制6
wrOV7670Reg(0xaa, 0x94); //原来0x94 基于直方图的aec/agc的控制7
//wrOV7670Reg(0x13, 0xe5); //原来0xe5
wrOV7670Reg(0x0e, 0x61); //原来0x61 COM5
wrOV7670Reg(0x0f, 0x43); //原来0x4b COM6
wrOV7670Reg(0x16, 0x02); //原来0x02 保留
wrOV7670Reg(0x1e, 0x37);//0x07, 原来0x37 水平镜像/竖直翻转使能 设置为01后发生翻转
wrOV7670Reg(0x21, 0x02); //原来0x02 保留
wrOV7670Reg(0x22, 0x91); //原来0x91 保留
wrOV7670Reg(0x29, 0x07); //原来0x07 保留
wrOV7670Reg(0x33, 0x0b); //原来0x0b href控制,改为初始值80时改变
wrOV7670Reg(0x35, 0x0b); //原来0xe0 保留
wrOV7670Reg(0x37, 0x3f); //原来0x1d adc控制
wrOV7670Reg(0x38, 0x01); //原来0x71 adc和模拟共模控制
wrOV7670Reg(0x39, 0x00); //原来0x2a adc偏移控制
wrOV7670Reg(0x3c, 0x78); //原来0x78 COM12
wrOV7670Reg(0x4d, 0x40); //原来0x40 保留
wrOV7670Reg(0x4e, 0x20); //原来0x20 保留
wrOV7670Reg(0x69, 0x00); //原来0x00 固定增益控制
wrOV7670Reg(0x6b, 0x4a); //PLL原来0x00 pll控制 重要设置
wrOV7670Reg(0x74, 0x19); //原来0x19 手动数字增益
wrOV7670Reg(0x8d, 0x4f); //原来0x4f 保留
wrOV7670Reg(0x8e, 0x00); //原来0x00 保留
wrOV7670Reg(0x8f, 0x00); //原来0x00 保留
wrOV7670Reg(0x90, 0x00); //原来0x00 保留
wrOV7670Reg(0x91, 0x00); //原来0x00 保留
wrOV7670Reg(0x92, 0x00); //0x19,//0x66 原来0x00 空行低8位
wrOV7670Reg(0x96, 0x00); //原来0x00 保留
wrOV7670Reg(0x9a, 0x80); //原来0x80 保留
wrOV7670Reg(0xb0, 0x84); //原来0xe0 保留
wrOV7670Reg(0xb1, 0x0c); //原来0x0c ablc设置
wrOV7670Reg(0xb2, 0x0e); //原来0x0e 保留
wrOV7670Reg(0xb3, 0x82); //原来0x82 ablc target
wrOV7670Reg(0xb8, 0x0a); //原来0x0a 保留
wrOV7670Reg(0x43, 0x14); //原来0x14 43-48为保留
wrOV7670Reg(0x44, 0xf0); //原来0xf0
wrOV7670Reg(0x45, 0x34); //原来0x34
wrOV7670Reg(0x46, 0x58); //原来0x58
wrOV7670Reg(0x47, 0x28); //原来0x28
wrOV7670Reg(0x48, 0x3a); //原来0x3a
wrOV7670Reg(0x59, 0x88); //原来0x88 51-5e保留
wrOV7670Reg(0x5a, 0x88); //原来0x88
wrOV7670Reg(0x5b, 0x44); //原来0x44
wrOV7670Reg(0x5c, 0x67); //原来0x67
wrOV7670Reg(0x5d, 0x49); //原来0x49
wrOV7670Reg(0x5e, 0x0e); //原来0xe0
wrOV7670Reg(0x64, 0x04); //原来0x04 64-66镜头补偿
wrOV7670Reg(0x65, 0x20); //原来0x20
wrOV7670Reg(0x66, 0x05); //原来0x05
wrOV7670Reg(0x94, 0x04); //原来0x04 94-95镜头补偿
wrOV7670Reg(0x95, 0x08); //原来0x08
wrOV7670Reg(0x6c, 0x0a); //原来0x0a 6c-6fawb设置
wrOV7670Reg(0x6d, 0x55); //原来0x55
wrOV7670Reg(0x6e, 0x11); //原来0x11
wrOV7670Reg(0x6f, 0x9f); //0x9e for advance AWB 原来9f
wrOV7670Reg(0x6a, 0x40); //原来0x40 g通道awb增益
wrOV7670Reg(0x01, 0x40); //原来0x40 b通道awb增益控制
wrOV7670Reg(0x02, 0x40); //原来0x40 r通道awb增益控制
//wrOV7670Reg(0x13, 0xe7); //原来0xe7
wrOV7670Reg(0x15, 0x00); //00 cmos10 含有pclk输出选择
wrOV7670Reg(0x4f, 0x80); //原来0x80 以下为 {MOD}彩矩阵系数设置
wrOV7670Reg(0x50, 0x80); //原来0x80
wrOV7670Reg(0x51, 0x00); //原来0x00
wrOV7670Reg(0x52, 0x22); //原来0x22
wrOV7670Reg(0x53, 0x5e); //原来0x5e
wrOV7670Reg(0x54, 0x80); //原来0x80
wrOV7670Reg(0x58, 0x9e); //原来0x9e
wrOV7670Reg(0x41, 0x08); //原来0x08 com16 以下为边缘设置
wrOV7670Reg(0x3f, 0x00); //原来0x00 边缘增强调整
wrOV7670Reg(0x75, 0x05); //原来0x05
wrOV7670Reg(0x76, 0xe1); //原来0xe1
wrOV7670Reg(0x4c, 0x00); //原来0x00 噪声抑制强度
wrOV7670Reg(0x77, 0x01); //原来0x01 噪声去除偏移
wrOV7670Reg(0x3d, 0xc1); //0xc0, com13 输出设置
wrOV7670Reg(0x4b, 0x09); //原来0x09 寄存器4b设置
wrOV7670Reg(0xc9, 0x60); //原来0x60 饱和度控制
//wrOV7670Reg(0x41, 0x38); //原来0x38 com16边缘设置设置
wrOV7670Reg(0x56, 0x40);//0x40, change according to Jim's request 对比度控制
wrOV7670Reg(0x34, 0x11); //原来0x11 感光阵列参考电压控制
wrOV7670Reg(0x3b, 0x02);//0x00,//原来0x02, com11控制
wrOV7670Reg(0xa4, 0x89);//0x88, 原来89 nt控制
wrOV7670Reg(0x96, 0x00); //原来0x00 以下96-9c保留
wrOV7670Reg(0x97, 0x30); //原来0x30
wrOV7670Reg(0x98, 0x20); //原来0x20
wrOV7670Reg(0x99, 0x30); //原来0x30
wrOV7670Reg(0x9a, 0x84); //原来0x84
wrOV7670Reg(0x9b, 0x29); //原来0x29
wrOV7670Reg(0x9c, 0x03); //原来0x03
wrOV7670Reg(0x9d, 0x4c); //原来0x4c 50HZ条纹滤波的值
wrOV7670Reg(0x9e, 0x3f); //原来0x3f 60HZ条纹滤波的值
wrOV7670Reg(0x09, 0x00); //原来0x00 通用控制器com2
wrOV7670Reg(0x3b, 0xc2);//0x82,//0xc0,//原来0xc2, //night mode 原来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
}
[/mw_shl_code]
一周热门 更多>