444 lines
11 KiB
C
Raw Permalink Normal View History

2021-07-28 13:15:22 +08:00
#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><38><CEBB>ַ
if(SCCB_WR_Byte(reg))res=1; //д<>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><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><38><CEBB>ַ
SCCB_WR_Byte(reg); //д<>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><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;
}