444 lines
11 KiB
C
444 lines
11 KiB
C
|
|
#include "sys.h"
|
|||
|
|
#include "ov5640.h"
|
|||
|
|
#include "ov5640cfg.h"
|
|||
|
|
#include "ov5640af.h"
|
|||
|
|
#include "timer.h"
|
|||
|
|
#include "delay.h"
|
|||
|
|
#include "usart.h"
|
|||
|
|
#include "sccb.h"
|
|||
|
|
#include "pcf8574.h"
|
|||
|
|
#include "ltdc.h"
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
|
|||
|
|
//ALIENTEK STM32<33><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//OV5640 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2016/1/6
|
|||
|
|
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
|||
|
|
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
|
|||
|
|
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2014-2024
|
|||
|
|
//All rights reserved
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
|
|||
|
|
//OV5640д<30>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>;1,ʧ<><CAA7>.
|
|||
|
|
u8 OV5640_WR_Reg(u16 reg,u8 data)
|
|||
|
|
{
|
|||
|
|
u8 res=0;
|
|||
|
|
SCCB_Start(); //<2F><><EFBFBD><EFBFBD>SCCB<43><42><EFBFBD><EFBFBD>
|
|||
|
|
if(SCCB_WR_Byte(OV5640_ADDR))res=1; //д<><D0B4><EFBFBD><EFBFBD>ID
|
|||
|
|
if(SCCB_WR_Byte(reg>>8))res=1; //д<>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>8λ<38><CEBB>ַ
|
|||
|
|
if(SCCB_WR_Byte(reg))res=1; //д<>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>8λ<38><CEBB>ַ
|
|||
|
|
if(SCCB_WR_Byte(data))res=1; //д<><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
SCCB_Stop();
|
|||
|
|
return res;
|
|||
|
|
}
|
|||
|
|
//OV5640<34><30><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>ֵ
|
|||
|
|
u8 OV5640_RD_Reg(u16 reg)
|
|||
|
|
{
|
|||
|
|
u8 val=0;
|
|||
|
|
SCCB_Start(); //<2F><><EFBFBD><EFBFBD>SCCB<43><42><EFBFBD><EFBFBD>
|
|||
|
|
SCCB_WR_Byte(OV5640_ADDR); //д<><D0B4><EFBFBD><EFBFBD>ID
|
|||
|
|
SCCB_WR_Byte(reg>>8); //д<>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>8λ<38><CEBB>ַ
|
|||
|
|
SCCB_WR_Byte(reg); //д<>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>8λ<38><CEBB>ַ
|
|||
|
|
SCCB_Stop();
|
|||
|
|
//<2F><><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><F3A3ACB2>Ƕ<EFBFBD>
|
|||
|
|
SCCB_Start();
|
|||
|
|
SCCB_WR_Byte(OV5640_ADDR|0X01);//<2F><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
val=SCCB_RD_Byte(); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
SCCB_No_Ack();
|
|||
|
|
SCCB_Stop();
|
|||
|
|
return val;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷģ<CDB7><C4A3>PWDN<44>ŵ<EFBFBD>״̬
|
|||
|
|
//sta:0,PWDN=0,<2C>ϵ<EFBFBD>.
|
|||
|
|
// 1,PWDN=1,<2C><><EFBFBD><EFBFBD>
|
|||
|
|
void OV5640_PWDN_Set(u8 sta)
|
|||
|
|
{
|
|||
|
|
PCF8574_WriteBit(DCMI_PWDN_IO,sta);
|
|||
|
|
}
|
|||
|
|
//<2F><>ʼ<EFBFBD><CABC>OV5640
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD>,Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1600*1200<30>ߴ<EFBFBD><DFB4><EFBFBD>ͼƬ!!
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u8 OV5640_Init(void)
|
|||
|
|
{
|
|||
|
|
u16 i=0;
|
|||
|
|
u16 reg;
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>IO
|
|||
|
|
GPIO_InitTypeDef GPIO_Initure;
|
|||
|
|
__HAL_RCC_GPIOG_CLK_ENABLE(); //<2F><><EFBFBD><EFBFBD>GPIOAʱ<41><CAB1>
|
|||
|
|
|
|||
|
|
GPIO_Initure.Pin=GPIO_PIN_12; //PG12
|
|||
|
|
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
GPIO_Initure.Pull=GPIO_PULLUP; //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
HAL_GPIO_Init(GPIOG,&GPIO_Initure); //<2F><>ʼ<EFBFBD><CABC>
|
|||
|
|
|
|||
|
|
PCF8574_Init(); //<2F><>ʼ<EFBFBD><CABC>PCF8574
|
|||
|
|
OV5640_RST(0); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OV5640<34><30>RST<53><54>,<2C><><EFBFBD>ϵ<EFBFBD>
|
|||
|
|
delay_ms(20);
|
|||
|
|
OV5640_PWDN_Set(0); //POWER ON
|
|||
|
|
delay_ms(5);
|
|||
|
|
OV5640_RST(1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
|||
|
|
delay_ms(20);
|
|||
|
|
SCCB_Init(); //<2F><>ʼ<EFBFBD><CABC>SCCB <20><>IO<49><4F>
|
|||
|
|
delay_ms(5);
|
|||
|
|
reg=OV5640_RD_Reg(OV5640_CHIPIDH); //<2F><>ȡID <20>߰<EFBFBD>λ
|
|||
|
|
reg<<=8;
|
|||
|
|
reg|=OV5640_RD_Reg(OV5640_CHIPIDL); //<2F><>ȡID <20>Ͱ<EFBFBD>λ
|
|||
|
|
if(reg!=OV5640_ID)
|
|||
|
|
{
|
|||
|
|
printf("ID:%d\r\n",reg);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
OV5640_WR_Reg(0x3103,0X11); //system clock from pad, bit[1]
|
|||
|
|
OV5640_WR_Reg(0X3008,0X82); //<2F><><EFBFBD><EFBFBD>λ
|
|||
|
|
delay_ms(10);
|
|||
|
|
//<2F><>ʼ<EFBFBD><CABC> OV5640,<2C><><EFBFBD><EFBFBD>SXGA<47>ֱ<EFBFBD><D6B1><EFBFBD>(1600*1200)
|
|||
|
|
for(i=0;i<sizeof(ov5640_uxga_init_reg_tbl)/4;i++)
|
|||
|
|
{
|
|||
|
|
OV5640_WR_Reg(ov5640_uxga_init_reg_tbl[i][0],ov5640_uxga_init_reg_tbl[i][1]);
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
OV5640_Flash_Ctrl(1);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
delay_ms(50);
|
|||
|
|
OV5640_Flash_Ctrl(0);//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
return 0x00; //ok
|
|||
|
|
}
|
|||
|
|
//OV5640<34>л<EFBFBD>ΪJPEGģʽ
|
|||
|
|
void OV5640_JPEG_Mode(void)
|
|||
|
|
{
|
|||
|
|
u16 i=0;
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>JPEG<45><47><EFBFBD><EFBFBD>
|
|||
|
|
for(i=0;i<(sizeof(OV5640_jpeg_reg_tbl)/4);i++)
|
|||
|
|
{
|
|||
|
|
OV5640_WR_Reg(OV5640_jpeg_reg_tbl[i][0],OV5640_jpeg_reg_tbl[i][1]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//OV5640<34>л<EFBFBD>ΪRGB565ģʽ
|
|||
|
|
void OV5640_RGB565_Mode(void)
|
|||
|
|
{
|
|||
|
|
u16 i=0;
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>:RGB565<36><35><EFBFBD><EFBFBD>
|
|||
|
|
for(i=0;i<(sizeof(ov5640_rgb565_reg_tbl)/4);i++)
|
|||
|
|
{
|
|||
|
|
OV5640_WR_Reg(ov5640_rgb565_reg_tbl[i][0],ov5640_rgb565_reg_tbl[i][1]);
|
|||
|
|
}
|
|||
|
|
if(lcdltdc.pwidth!=0)OV5640_WR_Reg(0X3821,0X06);//RGB<47><42>,ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
//<2F>ƹ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,֧<><D6A7>5<EFBFBD><35>ģʽ
|
|||
|
|
const static u8 OV5640_LIGHTMODE_TBL[5][7]=
|
|||
|
|
{
|
|||
|
|
0x04,0X00,0X04,0X00,0X04,0X00,0X00,//Auto,<2C>Զ<EFBFBD>
|
|||
|
|
0x06,0X1C,0X04,0X00,0X04,0XF3,0X01,//Sunny,<2C>չ<EFBFBD>
|
|||
|
|
0x05,0X48,0X04,0X00,0X07,0XCF,0X01,//Office,<2C>칫<EFBFBD><ECB9AB>
|
|||
|
|
0x06,0X48,0X04,0X00,0X04,0XD3,0X01,//Cloudy,<2C><><EFBFBD><EFBFBD>
|
|||
|
|
0x04,0X10,0X04,0X00,0X08,0X40,0X01,//Home,<2C><><EFBFBD><EFBFBD>
|
|||
|
|
};
|
|||
|
|
//<2F><>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//0:<3A>Զ<EFBFBD>
|
|||
|
|
//1:<3A>չ<EFBFBD>sunny
|
|||
|
|
//2,<2C>칫<EFBFBD><ECB9AB>office
|
|||
|
|
//3,<2C><><EFBFBD><EFBFBD>cloudy
|
|||
|
|
//4,<2C><><EFBFBD><EFBFBD>home
|
|||
|
|
void OV5640_Light_Mode(u8 mode)
|
|||
|
|
{
|
|||
|
|
u8 i;
|
|||
|
|
OV5640_WR_Reg(0x3212,0x03); //start group 3
|
|||
|
|
for(i=0;i<7;i++)OV5640_WR_Reg(0x3400+i,OV5640_LIGHTMODE_TBL[mode][i]);//<2F><><EFBFBD>ñ<EFBFBD><C3B1>Ͷ<EFBFBD>
|
|||
|
|
OV5640_WR_Reg(0x3212,0x13); //end group 3
|
|||
|
|
OV5640_WR_Reg(0x3212,0xa3); //launch group 3
|
|||
|
|
}
|
|||
|
|
//ɫ<>ʱ<EFBFBD><CAB1>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>,֧<><D6A7>7<EFBFBD><37><EFBFBD>ȼ<EFBFBD>
|
|||
|
|
const static u8 OV5640_SATURATION_TBL[7][6]=
|
|||
|
|
{
|
|||
|
|
0X0C,0x30,0X3D,0X3E,0X3D,0X01,//-3
|
|||
|
|
0X10,0x3D,0X4D,0X4E,0X4D,0X01,//-2
|
|||
|
|
0X15,0x52,0X66,0X68,0X66,0X02,//-1
|
|||
|
|
0X1A,0x66,0X80,0X82,0X80,0X02,//+0
|
|||
|
|
0X1F,0x7A,0X9A,0X9C,0X9A,0X02,//+1
|
|||
|
|
0X24,0x8F,0XB3,0XB6,0XB3,0X03,//+2
|
|||
|
|
0X2B,0xAB,0XD6,0XDA,0XD6,0X04,//+3
|
|||
|
|
};
|
|||
|
|
//ɫ<><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//sat:0~6,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>-3~3.
|
|||
|
|
void OV5640_Color_Saturation(u8 sat)
|
|||
|
|
{
|
|||
|
|
u8 i;
|
|||
|
|
OV5640_WR_Reg(0x3212,0x03); //start group 3
|
|||
|
|
OV5640_WR_Reg(0x5381,0x1c);
|
|||
|
|
OV5640_WR_Reg(0x5382,0x5a);
|
|||
|
|
OV5640_WR_Reg(0x5383,0x06);
|
|||
|
|
for(i=0;i<6;i++)OV5640_WR_Reg(0x5384+i,OV5640_SATURATION_TBL[sat][i]);//<2F><><EFBFBD>ñ<EFBFBD><C3B1>Ͷ<EFBFBD>
|
|||
|
|
OV5640_WR_Reg(0x538b, 0x98);
|
|||
|
|
OV5640_WR_Reg(0x538a, 0x01);
|
|||
|
|
OV5640_WR_Reg(0x3212, 0x13); //end group 3
|
|||
|
|
OV5640_WR_Reg(0x3212, 0xa3); //launch group 3
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//bright:0~8,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-4~4.
|
|||
|
|
void OV5640_Brightness(u8 bright)
|
|||
|
|
{
|
|||
|
|
u8 brtval;
|
|||
|
|
if(bright<4)brtval=4-bright;
|
|||
|
|
else brtval=bright-4;
|
|||
|
|
OV5640_WR_Reg(0x3212,0x03); //start group 3
|
|||
|
|
OV5640_WR_Reg(0x5587,brtval<<4);
|
|||
|
|
if(bright<4)OV5640_WR_Reg(0x5588,0x09);
|
|||
|
|
else OV5640_WR_Reg(0x5588,0x01);
|
|||
|
|
OV5640_WR_Reg(0x3212,0x13); //end group 3
|
|||
|
|
OV5640_WR_Reg(0x3212,0xa3); //launch group 3
|
|||
|
|
}
|
|||
|
|
//<2F>Աȶ<D4B1><C8B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//contrast:0~6,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-3~3.
|
|||
|
|
void OV5640_Contrast(u8 contrast)
|
|||
|
|
{
|
|||
|
|
u8 reg0val=0X00;//contrast=3,Ĭ<>϶Աȶ<D4B1>
|
|||
|
|
u8 reg1val=0X20;
|
|||
|
|
switch(contrast)
|
|||
|
|
{
|
|||
|
|
case 0://-3
|
|||
|
|
reg1val=reg0val=0X14;
|
|||
|
|
break;
|
|||
|
|
case 1://-2
|
|||
|
|
reg1val=reg0val=0X18;
|
|||
|
|
break;
|
|||
|
|
case 2://-1
|
|||
|
|
reg1val=reg0val=0X1C;
|
|||
|
|
break;
|
|||
|
|
case 4://1
|
|||
|
|
reg0val=0X10;
|
|||
|
|
reg1val=0X24;
|
|||
|
|
break;
|
|||
|
|
case 5://2
|
|||
|
|
reg0val=0X18;
|
|||
|
|
reg1val=0X28;
|
|||
|
|
break;
|
|||
|
|
case 6://3
|
|||
|
|
reg0val=0X1C;
|
|||
|
|
reg1val=0X2C;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
OV5640_WR_Reg(0x3212,0x03); //start group 3
|
|||
|
|
OV5640_WR_Reg(0x5585,reg0val);
|
|||
|
|
OV5640_WR_Reg(0x5586,reg1val);
|
|||
|
|
OV5640_WR_Reg(0x3212,0x13); //end group 3
|
|||
|
|
OV5640_WR_Reg(0x3212,0xa3); //launch group 3
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//sharp:0~33,0,<2C>ر<EFBFBD>;33,auto;<3B><><EFBFBD><EFBFBD>ֵ,<2C><><EFBFBD>ȷ<EFBFBD>Χ.
|
|||
|
|
void OV5640_Sharpness(u8 sharp)
|
|||
|
|
{
|
|||
|
|
if(sharp<33)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
{
|
|||
|
|
OV5640_WR_Reg(0x5308,0x65);
|
|||
|
|
OV5640_WR_Reg(0x5302,sharp);
|
|||
|
|
}else //<2F>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
OV5640_WR_Reg(0x5308,0x25);
|
|||
|
|
OV5640_WR_Reg(0x5300,0x08);
|
|||
|
|
OV5640_WR_Reg(0x5301,0x30);
|
|||
|
|
OV5640_WR_Reg(0x5302,0x10);
|
|||
|
|
OV5640_WR_Reg(0x5303,0x00);
|
|||
|
|
OV5640_WR_Reg(0x5309,0x08);
|
|||
|
|
OV5640_WR_Reg(0x530a,0x30);
|
|||
|
|
OV5640_WR_Reg(0x530b,0x04);
|
|||
|
|
OV5640_WR_Reg(0x530c,0x06);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
//<2F><>Ч<EFBFBD><D0A7><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>,֧<><D6A7>7<EFBFBD><37><EFBFBD><EFBFBD>Ч
|
|||
|
|
const static u8 OV5640_EFFECTS_TBL[7][3]=
|
|||
|
|
{
|
|||
|
|
0X06,0x40,0X10,//<2F><><EFBFBD><EFBFBD>
|
|||
|
|
0X1E,0xA0,0X40,//<2F><>ɫ
|
|||
|
|
0X1E,0x80,0XC0,//ůɫ
|
|||
|
|
0X1E,0x80,0X80,//<2F>ڰ<EFBFBD>
|
|||
|
|
0X1E,0x40,0XA0,//<2F><><EFBFBD><EFBFBD>
|
|||
|
|
0X40,0x40,0X10,//<2F><>ɫ
|
|||
|
|
0X1E,0x60,0X60,//ƫ<><C6AB>
|
|||
|
|
};
|
|||
|
|
//<2F><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
|||
|
|
//0:<3A><><EFBFBD><EFBFBD>
|
|||
|
|
//1,<2C><>ɫ
|
|||
|
|
//2,ůɫ
|
|||
|
|
//3,<2C>ڰ<EFBFBD>
|
|||
|
|
//4,ƫ<><C6AB>
|
|||
|
|
//5,<2C><>ɫ
|
|||
|
|
//6,ƫ<><C6AB>
|
|||
|
|
void OV5640_Special_Effects(u8 eft)
|
|||
|
|
{
|
|||
|
|
OV5640_WR_Reg(0x3212,0x03); //start group 3
|
|||
|
|
OV5640_WR_Reg(0x5580,OV5640_EFFECTS_TBL[eft][0]);
|
|||
|
|
OV5640_WR_Reg(0x5583,OV5640_EFFECTS_TBL[eft][1]);// sat U
|
|||
|
|
OV5640_WR_Reg(0x5584,OV5640_EFFECTS_TBL[eft][2]);// sat V
|
|||
|
|
OV5640_WR_Reg(0x5003,0x08);
|
|||
|
|
OV5640_WR_Reg(0x3212,0x13); //end group 3
|
|||
|
|
OV5640_WR_Reg(0x3212,0xa3); //launch group 3
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//mode:0,<2C>ر<EFBFBD>
|
|||
|
|
// 1,<2C><><EFBFBD><EFBFBD>
|
|||
|
|
// 2,ɫ<><C9AB>
|
|||
|
|
void OV5640_Test_Pattern(u8 mode)
|
|||
|
|
{
|
|||
|
|
if(mode==0)OV5640_WR_Reg(0X503D,0X00);
|
|||
|
|
else if(mode==1)OV5640_WR_Reg(0X503D,0X80);
|
|||
|
|
else if(mode==2)OV5640_WR_Reg(0X503D,0X82);
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD>
|
|||
|
|
//mode:0,<2C>ر<EFBFBD>
|
|||
|
|
// 1,<2C><><EFBFBD><EFBFBD>
|
|||
|
|
void OV5640_Flash_Ctrl(u8 sw)
|
|||
|
|
{
|
|||
|
|
OV5640_WR_Reg(0x3016,0X02);
|
|||
|
|
OV5640_WR_Reg(0x301C,0X02);
|
|||
|
|
if(sw)OV5640_WR_Reg(0X3019,0X02);
|
|||
|
|
else OV5640_WR_Reg(0X3019,0X00);
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
//OV5640<34><30><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>Ĵ<EFBFBD>С(<28>ֱ<EFBFBD><D6B1><EFBFBD>),<2C><>ȫ<EFBFBD>ɸú<C9B8><C3BA><EFBFBD>ȷ<EFBFBD><C8B7>
|
|||
|
|
//offx,offy,Ϊ<><CEAA><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>OV5640_ImageWin_Set<65>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD>(<28><><EFBFBD>賤<EFBFBD><E8B3A4>Ϊxsize<7A><65>ysize)<29>ϵ<EFBFBD>ƫ<EFBFBD><C6AB>
|
|||
|
|
//<2F><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD>scale<6C><65><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD>Ϊ:xsize-2*offx,ysize-2*offy
|
|||
|
|
//width,height:ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>Ŀ<EFBFBD><C4BF>Ⱥ߶<CDB8>
|
|||
|
|
//ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(width,height),<2C><><EFBFBD><EFBFBD>xsize-2*offx,ysize-2*offy<66>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>Ͻ<EFBFBD><CFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>.
|
|||
|
|
//һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>offx<66><78>offy<66><79>ֵΪ16<31><36>4,<2C><>СҲ<D0A1>ǿ<EFBFBD><C7BF><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD>16<31><36>4
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD>óɹ<C3B3>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
|
u8 OV5640_OutSize_Set(u16 offx,u16 offy,u16 width,u16 height)
|
|||
|
|
{
|
|||
|
|
OV5640_WR_Reg(0X3212,0X03); //<2F><>ʼ<EFBFBD><CABC>3
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>þ<EFBFBD><C3BE><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
OV5640_WR_Reg(0x3808,width>>8); //<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȸ<EFBFBD><C8B8>ֽ<EFBFBD>
|
|||
|
|
OV5640_WR_Reg(0x3809,width&0xff);//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5>ֽ<EFBFBD>
|
|||
|
|
OV5640_WR_Reg(0x380a,height>>8);//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶ȸ<DFB6><C8B8>ֽ<EFBFBD>
|
|||
|
|
OV5640_WR_Reg(0x380b,height&0xff);//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶ȵ<DFB6><C8B5>ֽ<EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>ISP<53><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡͼ<C8A1><CDBC>Χ
|
|||
|
|
//<2F><>Χ:xsize-2*offx,ysize-2*offy
|
|||
|
|
OV5640_WR_Reg(0x3810,offx>>8); //<2F><><EFBFBD><EFBFBD>X offset<65><74><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
OV5640_WR_Reg(0x3811,offx&0xff);//<2F><><EFBFBD><EFBFBD>X offset<65><74><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
|
|||
|
|
OV5640_WR_Reg(0x3812,offy>>8); //<2F><><EFBFBD><EFBFBD>Y offset<65><74><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
OV5640_WR_Reg(0x3813,offy&0xff);//<2F><><EFBFBD><EFBFBD>Y offset<65><74><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
|
|||
|
|
OV5640_WR_Reg(0X3212,0X13); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3
|
|||
|
|
OV5640_WR_Reg(0X3212,0Xa3); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD>
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><F1BFAAB4><EFBFBD>С(ISP<53><50>С),<2C>DZ<EFBFBD>Ҫ,һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô˺<C3B4><CBBA><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>濪<EFBFBD><E6BFAA>(<28><><EFBFBD><EFBFBD>2592*1944),<2C><><EFBFBD><EFBFBD>OV5640_OutSize_Set<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//ע<><D7A2>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>Ⱥ߶<CDB8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>OV5640_OutSize_Set<65><74><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>Ⱥ߶<CDB8>
|
|||
|
|
// OV5640_OutSize_Set<65><74><EFBFBD>õĿ<C3B5><C4BF>Ⱥ߶<CDB8>,<2C><><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĿ<C3B5><C4BF>Ⱥ߶<CDB8>,<2C><>DSP
|
|||
|
|
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD>豸.
|
|||
|
|
//width,height:<3A><><EFBFBD><EFBFBD>(<28><>Ӧ:horizontal)<29>߶<CDB8>(<28><>Ӧ:vertical)
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD>óɹ<C3B3>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
|
u8 OV5640_ImageWin_Set(u16 offx,u16 offy,u16 width,u16 height)
|
|||
|
|
{
|
|||
|
|
u16 xst,yst,xend,yend;
|
|||
|
|
xst=offx;
|
|||
|
|
yst=offy;
|
|||
|
|
xend=offx+width-1;
|
|||
|
|
yend=offy+height-1;
|
|||
|
|
OV5640_WR_Reg(0X3212,0X03); //<2F><>ʼ<EFBFBD><CABC>3
|
|||
|
|
OV5640_WR_Reg(0X3800,xst>>8);
|
|||
|
|
OV5640_WR_Reg(0X3801,xst&0XFF);
|
|||
|
|
OV5640_WR_Reg(0X3802,yst>>8);
|
|||
|
|
OV5640_WR_Reg(0X3803,yst&0XFF);
|
|||
|
|
OV5640_WR_Reg(0X3804,xend>>8);
|
|||
|
|
OV5640_WR_Reg(0X3805,xend&0XFF);
|
|||
|
|
OV5640_WR_Reg(0X3806,yend>>8);
|
|||
|
|
OV5640_WR_Reg(0X3807,yend&0XFF);
|
|||
|
|
OV5640_WR_Reg(0X3212,0X13); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3
|
|||
|
|
OV5640_WR_Reg(0X3212,0Xa3); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD>
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
//<2F><>ʼ<EFBFBD><CABC><EFBFBD>Զ<EFBFBD><D4B6>Խ<EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>;1,ʧ<><CAA7>.
|
|||
|
|
u8 OV5640_Focus_Init(void)
|
|||
|
|
{
|
|||
|
|
u16 i;
|
|||
|
|
u16 addr=0x8000;
|
|||
|
|
u8 state=0x8F;
|
|||
|
|
OV5640_WR_Reg(0x3000, 0x20); //reset MCU
|
|||
|
|
for(i=0;i<sizeof(OV5640_AF_Config);i++) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
OV5640_WR_Reg(addr,OV5640_AF_Config[i]);
|
|||
|
|
addr++;
|
|||
|
|
}
|
|||
|
|
OV5640_WR_Reg(0x3022,0x00);
|
|||
|
|
OV5640_WR_Reg(0x3023,0x00);
|
|||
|
|
OV5640_WR_Reg(0x3024,0x00);
|
|||
|
|
OV5640_WR_Reg(0x3025,0x00);
|
|||
|
|
OV5640_WR_Reg(0x3026,0x00);
|
|||
|
|
OV5640_WR_Reg(0x3027,0x00);
|
|||
|
|
OV5640_WR_Reg(0x3028,0x00);
|
|||
|
|
OV5640_WR_Reg(0x3029,0x7f);
|
|||
|
|
OV5640_WR_Reg(0x3000,0x00);
|
|||
|
|
i=0;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
state=OV5640_RD_Reg(0x3029);
|
|||
|
|
delay_ms(5);
|
|||
|
|
i++;
|
|||
|
|
if(i>1000)return 1;
|
|||
|
|
}while(state!=0x70);
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
//ִ<><D6B4>һ<EFBFBD><D2BB><EFBFBD>Զ<EFBFBD><D4B6>Խ<EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>;1,ʧ<><CAA7>.
|
|||
|
|
u8 OV5640_Focus_Single(void)
|
|||
|
|
{
|
|||
|
|
u8 temp;
|
|||
|
|
u16 retry=0;
|
|||
|
|
OV5640_WR_Reg(0x3022,0x03); //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Զ<EFBFBD><D4B6>Խ<EFBFBD>
|
|||
|
|
while(1)
|
|||
|
|
{
|
|||
|
|
retry++;
|
|||
|
|
temp=OV5640_RD_Reg(0x3029); //<2F><><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD>״̬
|
|||
|
|
if(temp==0x10)break; // focus completed
|
|||
|
|
delay_ms(5);
|
|||
|
|
if(retry>1000)return 1;
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>Խ<EFBFBD>,<2C><>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD>,<2C><><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ɹ<EFBFBD>;<3B><><EFBFBD><EFBFBD>,ʧ<><CAA7>.
|
|||
|
|
u8 OV5640_Focus_Constant(void)
|
|||
|
|
{
|
|||
|
|
u8 temp=0;
|
|||
|
|
u16 retry=0;
|
|||
|
|
OV5640_WR_Reg(0x3023,0x01);
|
|||
|
|
OV5640_WR_Reg(0x3022,0x08);//<2F><><EFBFBD><EFBFBD>IDLEָ<45><D6B8>
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
temp=OV5640_RD_Reg(0x3023);
|
|||
|
|
retry++;
|
|||
|
|
if(retry>1000)return 2;
|
|||
|
|
delay_ms(5);
|
|||
|
|
} while(temp!=0x00);
|
|||
|
|
OV5640_WR_Reg(0x3023,0x01);
|
|||
|
|
OV5640_WR_Reg(0x3022,0x04);//<2F><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD>Խ<EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
retry=0;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
temp=OV5640_RD_Reg(0x3023);
|
|||
|
|
retry++;
|
|||
|
|
if(retry>1000)return 2;
|
|||
|
|
delay_ms(5);
|
|||
|
|
}while(temp!=0x00);//0,<2C>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD>;1:<3A><><EFBFBD>ڶԽ<DAB6>
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|