⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csi.c

📁 凌阳32位单片机开发的小游戏
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Include/Csi.h"
#include "..\SysLib_Basic\Include\PPU_Texture.h"
#include "..\SysLib_Basic\Include\Temp.h"
#include "..\SysLib_Basic\Include\Sys_Define.h"
#include "..\SysLib_Basic\Include\Sys_Register.h"

#define CCIR656_TEST	1
#define PAL_TEST		0
#define YUVIN_TEST		0
#define YUVOUT_TEST		0
#define CSIINTL			0
#define RGB565_TEST		0		// For OV7660, Only RGB565 Output
#define Text1Index   	0xa0140000
#define Text2Index   	0xa0148000
#define Text3Index   	0xa0150000

void ov7648_vga(void);
void ov7660_vga(void);
void ov7648_qvga(void);
void ov7660_qvga(void);

//void s201_qcif(void);
//void CA202QVGA(void);

void init_ov7648(int qvga, int pal);
void init_ov7660_vga(int pal);
void init_ov7660_qvga(int pal);
//void CA202Init(int pal);
//void init_201(void);

void Enable_TV_Encoder(int PAL_ENABLE,int VGA_ENABLE,int YUV_ENABLE);
void Delay();

extern int framecnt;

//====================================================================
//I2C application 
//====================================================================

unsigned int Read8_I2C(int Addr)
{
	unsigned int a;

	*P_I2CADDR=Addr;
	
	*P_I2CCR=0x41;

	a=*P_I2CINTR;
	while(a==0) a=*P_I2CINTR;
	*P_I2CINTR=1;

	a=*P_I2CCR&0x08;

	a=*P_I2CRDATA;
	return a;
}

void Write8_I2C(int Addr, unsigned int Value)
{
	unsigned int a;
	
	*P_I2CADDR=Addr;
	*P_I2CWDATA=Value;
	
	*P_I2CCR=1;
	
	a=*P_I2CINTR;
	while(a==0) a=*P_I2CINTR;
	*P_I2CINTR=1;
	
	a=*P_I2CCR&0x08;

}

void InitSensor(U32 CSI_Mode,U32 TV_Mode,U32 FB_Mode,U32 TextMode,U32 FB1_Addr,U32 FB2_Addr,U32 FB3_Addr)
{
//	print1("SPG290 CSI Setting Start\n");
	// Setup Sensor's FB Address
	U32 *port;	
	S32 i;
	
	*P_CSI_TG_FBSADDR0 = FB1_Addr;//0x25800
	*P_CSI_TG_FBSADDR1 = FB2_Addr;
	*P_CSI_TG_FBSADDR2 = FB3_Addr;

	switch(FB_Mode)
	{
		case PPUFB:
		   // Setup PPU Buffer Start Address
			switch(TextMode)
			{
				case TEXT1:
					*P_PPU_TX1_START_ADR1 = FB1_Addr;
					*P_PPU_TX1_START_ADR2 = FB2_Addr;
					*P_PPU_TX1_START_ADR3 = FB3_Addr;
					*P_PTR_SETTING |= (CSI_HARD |TVE_C2P_HARD|PPUT1_HARD);			
					break;				
				case TEXT2:
					*P_PPU_TX2_START_ADR1 = FB1_Addr;
					*P_PPU_TX2_START_ADR2 = FB2_Addr;
					*P_PPU_TX2_START_ADR3 = FB3_Addr;
					*P_PTR_SETTING |= (CSI_HARD |TVE_C2P_HARD|PPUT2_HARD);			
					break;				
				case TEXT3:
					*P_PPU_TX3_START_ADR1 = FB1_Addr;
					*P_PPU_TX3_START_ADR2 = FB2_Addr;
					*P_PPU_TX3_START_ADR3 = FB3_Addr;
					*P_PTR_SETTING |= (CSI_HARD |TVE_C2P_HARD|PPUT3_HARD);			
					break;
			}
//			*P_PTR_SETTING |= (CSI_HARD |TVE_C2P_HARD);			
//			*P_PTR_SETTING |= TVE_C2P_HARD;			
			*P_C2P_SETTING = C2PEN|TRIPLEBUF|CSI2PPU; 
			break;		
		/*case TVEFB:
			// Setup TV Buffer Start Address
			*P_TV_START_ADR1 = FB1_Addr;
			*P_TV_START_ADR2 = FB2_Addr;
			*P_TV_START_ADR3 = FB3_Addr;
			*P_PTR_SETTING = CSI_HARD|TVE_C2P_HARD;
			*P_C2P_SETTING = C2PEN|TRIPLEBUF|CSI2TVE;
			break;
		case LCDFB:
			// Setup LCD Buffer Start Address
			*P_LCD_START_ADR1 = FB1_Addr;
			*P_LCD_START_ADR2 = FB2_Addr;
			*P_LCD_START_ADR3 = FB3_Addr;
			*P_PTR_SETTING |= CSI_HARD;
			*P_C2P_SETTING = C2PEN|TRIPLEBUF|CSI2LCD; 
			break;*/
	}
	if (YUVIN_TEST == 1) {	// For YUV => RGB Matrix
		*P_CSI_Y2R_A1 = (0x100<<20)|(0x3FF<<10)|(0x15E);
		*P_CSI_Y2R_A2 = (0x100<<20)|(0x3AA<<10)|(0x34D);
		*P_CSI_Y2R_A3 = (0x100<<20)|(0x1BB<<10)|(0x3FE);
	} else {				// For RGB => YUV Matrix
		*P_CSI_Y2R_A1 = (0x4D<<20)|(0x96<<10)|(0x1D);
		*P_CSI_Y2R_A2 = (0x1D4<<20)|(0x1A9<<10)|(0x83);
		*P_CSI_Y2R_A3 = (0x83<<20)|(0x192<<10)|(0x1EB);
	}
	
	switch(CSI_Mode)
	{
		case OV7648:
			if(TV_Mode == 0)
				ov7648_qvga();
			else
				ov7648_vga();						
			break;		
		case OV7660:
			if(TV_Mode == 0)
				ov7660_qvga();
			else
				ov7660_vga();						
			break;
//		case CA201:
//			s201_qcif();
//			break;
//		case CA202:
//			CA202QVGA();
//			break;
	}		
	switch(FB_Mode)
	{
		case PPUFB:
			switch(TextMode)
			{
				/*case TEXT1:
					port = Text1Index;
					for(i=0; i<480; i++)
					{
						*(port+i) = i*640;		
					}
	
					*P_PPU_TX1_N_PTR = Text1Index;
	
					*P_PPU_TX1_Attribute = TXDepth0;
					*P_PPU_TX1_Control = TXEN|TXLINEAR|TXREGMODE|TXRGB565;					
					break;				
				case TEXT2:
					port = Text2Index;
					for(i=0; i<480; i++)
					{
						*(port+i) = i*640;		
					}
	
					*P_PPU_TX2_N_PTR = Text2Index;	
					*P_PPU_TX2_Attribute = TXDepth1;
					*P_PPU_TX2_Control = TXEN|TXLINEAR|TXREGMODE|TXRGB565;					
					break;	*/			
				case TEXT3:
					port = Text3Index;
					for(i=0; i<480; i++)
					{
						*(port+i) = i*640;		
					}
	
					*P_PPU_TX3_N_PTR = Text3Index;
					*P_PPU_TX3_Attribute = TXDepth3;
					*P_PPU_TX3_Control = TXEN|TXLINEAR|TXREGMODE|TXRGB565|BLEND;		
			     	*P_PPU_TX3_Blending = 45;			
					break;
			}
			break;
	}	

}

void ov7660_vga(void) 
{
	unsigned int cr_set;

    *P_CSI_IRQEN = FRAME_END|TG_OF|FRAME_LOSS;
//    *P_CSI_IRQEN = FRAME_END|FRAME_LOSS;

	if ((RGB565_TEST == 1) & (YUVIN_TEST == 0))
		cr_set = CSIEN|VGAEN|CSICLKOINV|RGB565;
	else	
		cr_set = CSIEN|VGAEN|CSICLKOINV;

	if (CCIR656_TEST) 
	{
		*P_CSI_TG_LSTART = ((0x00)<<20)|((0x08)<<10)|0x11A;
		cr_set = cr_set|VADD_RISE|VRST_RISE|HRST_RISE|CCIR656;
	} 
	else 
	{
		//*P_CSI_TG_LSTART = ((0x00)<<20)|((0x00)<<10)|0xAE; // For 30 Hz
//		*P_CSI_TG_LSTART = ((0x00)<<20)|((0x09)<<10)|0x7A;	// For 33 Hz
		*P_CSI_TG_LSTART = ((0x00)<<20)|((0x40)<<10)|0x7A;	// For 33 Hz
		cr_set = cr_set|VADD_RISE|VRST_RISE|HRST_RISE;
	}

	if (YUVIN_TEST) 
	{
		if (CCIR656_TEST)
			cr_set = cr_set|YUVIN|YUV_TYPE|D_TYPE4;
		else
			cr_set = cr_set|YUVIN|YUV_TYPE|D_TYPE6;
	} 
	else 
	{
		if (RGB565_TEST) 
		{
			cr_set = cr_set|D_TYPE6;
		} 
		else 
		{
		if (CCIR656_TEST)
			cr_set = cr_set|D_TYPE6;
		else
			cr_set = cr_set|D_TYPE5;	// For GRB 4:2:2
//			cr_set = cr_set|D_TYPE4;	// For RGB Raw
		}
	}
	
	if (YUVOUT_TEST) 
	{
		cr_set = cr_set|YUVOUT|Y4U4Y4V4;
	} 
	else;

   	*P_CSI_TG_CR = cr_set;


	// Use I2C to initial QV7660
	init_ov7660_vga(PAL_TEST);

	// Enable TV Encoder
	Enable_TV_Encoder(PAL_TEST,1,YUVOUT_TEST);
	
}

void ov7660_qvga(void) 
{
	
	unsigned int cr_set;

    *P_CSI_IRQEN = FRAME_END|TG_OF|FRAME_LOSS;

	cr_set = CSIEN|CSICLKOINV|INPUT27|CSICLKOINV;
//	cr_set = CSIEN|YUV_TYPE|VGAEN;
	
	if (CCIR656_TEST) 
	{
//		*P_CSI_TG_LSTART = ((0x00)<<20)|((0x00)<<10)|0x30;
		*P_CSI_TG_LSTART = ((0x00)<<20)|((0x34)<<10)|0x23A;
		cr_set = cr_set|VADD_RISE|VRST_RISE|HRST_RISE|CCIR656;
	} 
	else 
	{
		*P_CSI_TG_LSTART = ((0x00)<<20)|((0x34)<<10)|0x180;
		cr_set = cr_set|VADD_RISE|VRST_RISE|HRST_RISE;
	}

	if (YUVIN_TEST) 
	{
		if (CCIR656_TEST)
			cr_set = cr_set|YUVIN|YUV_TYPE|D_TYPE4;
		else
			cr_set = cr_set|YUVIN|YUV_TYPE|D_TYPE6;
	} 
	else 
	{
		if (CCIR656_TEST)
			cr_set = cr_set|D_TYPE7;
		else
			cr_set = cr_set|D_TYPE5;
	}
	
	if (YUVOUT_TEST) 
	{
		cr_set = cr_set|YUVOUT|Y4U4Y4V4;
	} 
	else;

   	*P_CSI_TG_CR = cr_set;


	// Use I2C to initial QV7660
	init_ov7660_qvga(PAL_TEST);

	// Enable TV Encoder
	Enable_TV_Encoder(PAL_TEST,0,YUVOUT_TEST);

}

void init_ov7660_vga(int pal)
{
	unsigned int a;
	
//	*I2CCVR=30;
	*P_I2CCVR=60;
	*P_I2CID=0x42;//for OV7660

	// Reset All Register for Default Value
	Write8_I2C(0x12,0x80);Delay();
	Write8_I2C(0x12,0x80);Delay();

	a=Read8_I2C(0x0A);
	if(a!=0x76) while(1);
	a=Read8_I2C(0x0B);
	if(a!=0x60) while(1);

	Write8_I2C(0x11,0x80);Delay();	//Use external Clock Directly
	Write8_I2C(0x92,0x00);Delay();
	Write8_I2C(0x93,0x00);Delay();
	Write8_I2C(0x9D,0x99);Delay();	// Band Filter For 50 Hz
	Write8_I2C(0x9E,0x7F);Delay();	// Band Filter For 60 Hz
	Write8_I2C(0x3B,0x02);Delay();	// 02 => 60 Hz, 00 => 50 Hz
	Write8_I2C(0x13,0xF2);Delay();	// Enable Band Filter, AWB, Fast AG
	Write8_I2C(0x10,0x00);Delay();	// Reset AEC
	Write8_I2C(0x00,0x00);Delay();	// Reset AGC
	Write8_I2C(0x01,0x80);Delay();	// Reset BLUE Gain
	Write8_I2C(0x02,0x80);Delay();	// Reset RED Gain
	Write8_I2C(0x13,0xF7);Delay();	// Enable AGC/AEC, Fast Algorithm
//	Write8_I2C(0x13,0x77);Delay();	// Enable AGC/AEC, Slow Algorithm

	if (YUVIN_TEST) {
		Write8_I2C(0x12,0x00);Delay();	//VGA YUV output
	} else {
		Write8_I2C(0x12,0x04);Delay();	//VGA GRB422 output, Fail in OV7660
//		Write8_I2C(0x12,0x05);Delay();	//VGA Raw RGB output
	}


	Write8_I2C(0x04,0x40);Delay();	//enable CCIR656
	if (YUVIN_TEST) {
		Write8_I2C(0x18,0x01);Delay();	// HSTOP ??
		Write8_I2C(0x17,0x13);Delay();	// HSTART ??
		Write8_I2C(0x32,0x92);Delay();	// HSTART/HSTOP ??
	} else {
		Write8_I2C(0x18,0x00);Delay();	// HSTOP ??
		Write8_I2C(0x17,0x12);Delay();	// HSTART ??
		Write8_I2C(0x32,0xA4);Delay();	// HSTART/HSTOP ??
	}
	Write8_I2C(0x19,0x02);Delay();	// VSTART
	Write8_I2C(0x1A,0x7A);Delay();	// VEND
	Write8_I2C(0x03,0x00);Delay();	// VSTART/VEND Low 2 bits

	Write8_I2C(0x0E,0x84);Delay();	// High Frame Rate ??
	Write8_I2C(0x0F,0x62);Delay();	// Enable BLC
	Write8_I2C(0x15,0x40);Delay();	// HSYNC Output
	Write8_I2C(0x16,0x02);Delay();	// ??
	Write8_I2C(0x1B,0x01);Delay();	// Delay Pixel
	Write8_I2C(0x1E,0x31);Delay();	// Vertical Flip, Mirror + ??
	Write8_I2C(0x29,0x3C);Delay();	// 3C => External REG, Internal REG
	Write8_I2C(0x33,0x00);Delay();	// ??
	Write8_I2C(0x34,0x07);Delay();	// ??
	Write8_I2C(0x35,0x84);Delay();	// ??
	Write8_I2C(0x36,0x00);Delay();	// ??
	Write8_I2C(0x38,0x13);Delay();	// ??
	Write8_I2C(0x39,0x43);Delay();	// ??
	Write8_I2C(0x3A,0x0C);Delay();	// UYVY Output
	Write8_I2C(0x3C,0xEC);Delay();	// Always has HREF
	Write8_I2C(0x3D,0x90);Delay();	// Important!!
	Write8_I2C(0x3F,0x29);Delay();	// Edge Enchance
	
	if ((RGB565_TEST == 1) & (YUVIN_TEST == 0)) {
		Write8_I2C(0x40,0x91);Delay();	// Output 01 ~ FE
	} else {
		Write8_I2C(0x40,0x81);Delay();	// Output 01 ~ FE
	}
	Write8_I2C(0x41,0x20);Delay();	// Enable Edge Enchancement
	Write8_I2C(0x6B,0x0A);Delay();	// ??
	Write8_I2C(0xA1,0xC8);Delay();	// De-noise, Erase White Pixel
	
	Write8_I2C(0x69,0x80);Delay();	// B Channel Pre-Gain
	
	Write8_I2C(0x43,0xF0);Delay();	// ??
	Write8_I2C(0x44,0x10);Delay();	// ??
	Write8_I2C(0x45,0x78);Delay();	// ??
	Write8_I2C(0x46,0xA8);Delay();	// ??
	Write8_I2C(0x47,0x60);Delay();	// ??
	Write8_I2C(0x48,0x80);Delay();	// ??
	Write8_I2C(0x59,0xBA);Delay();	// ??
	Write8_I2C(0x5A,0x9A);Delay();	// ??
	Write8_I2C(0x5B,0x22);Delay();	// ??
	Write8_I2C(0x5C,0xB9);Delay();	// ??
	Write8_I2C(0x5D,0x9B);Delay();	// ??
	Write8_I2C(0x5E,0x10);Delay();	// ??
	Write8_I2C(0x5F,0xE0);Delay();	// ??
	Write8_I2C(0x60,0x85);Delay();	// 05 is advance AWB
	Write8_I2C(0x61,0x60);Delay();	// ??
	Write8_I2C(0x9F,0x9D);Delay();	// ??
	Write8_I2C(0xA0,0xA0);Delay();	// ??

	if (YUVIN_TEST) 
	{
		// Matrix Coefficient
		Write8_I2C(0x4F,0x66);Delay();	// ??
		Write8_I2C(0x50,0x6B);Delay();	// ??
		Write8_I2C(0x51,0x05);Delay();	// ??
		Write8_I2C(0x52,0x19);Delay();	// ??
		Write8_I2C(0x53,0x40);Delay();	// ??
		Write8_I2C(0x54,0x59);Delay();	// ??
		Write8_I2C(0x55,0x40);Delay();	// ??
		Write8_I2C(0x56,0x40);Delay();	// ??
		Write8_I2C(0x57,0x40);Delay();	// ??
		Write8_I2C(0x58,0x0D);Delay();	// ??
	} 
	else 
	{
		// Matrix Coefficient
		Write8_I2C(0x4F,0xAE);Delay();	// ??
		Write8_I2C(0x50,0x26);Delay();	// ??
		Write8_I2C(0x51,0x07);Delay();	// ??
		Write8_I2C(0x52,0x1A);Delay();	// ??
		Write8_I2C(0x53,0xA9);Delay();	// ??
		Write8_I2C(0x54,0x0F);Delay();	// ??
		Write8_I2C(0x55,0x05);Delay();	// ??
		Write8_I2C(0x56,0x46);Delay();	// ??
		Write8_I2C(0x57,0xCB);Delay();	// ??
		Write8_I2C(0x58,0x77);Delay();	// ??
	}
		
	Write8_I2C(0x8B,0xCC);Delay();	// ??
	Write8_I2C(0x8C,0xCC);Delay();	// ??
	Write8_I2C(0x8D,0xCF);Delay();	// ??

	// Gamma Curve
	Write8_I2C(0x6C,0x40);Delay();
	Write8_I2C(0x6D,0x30);Delay();
	Write8_I2C(0x6E,0x4B);Delay();
	Write8_I2C(0x6F,0x60);Delay();
	Write8_I2C(0x70,0x70);Delay();
	Write8_I2C(0x71,0x70);Delay();
	Write8_I2C(0x72,0x70);Delay();
	Write8_I2C(0x73,0x70);Delay();
	Write8_I2C(0x74,0x60);Delay();
	Write8_I2C(0x75,0x60);Delay();
	Write8_I2C(0x76,0x50);Delay();
	Write8_I2C(0x77,0x48);Delay();
	Write8_I2C(0x78,0x3A);Delay();
	Write8_I2C(0x79,0x2E);Delay();
	Write8_I2C(0x7A,0x28);Delay();
	Write8_I2C(0x7B,0x22);Delay();
	Write8_I2C(0x7C,0x04);Delay();
	Write8_I2C(0x7D,0x07);Delay();
	Write8_I2C(0x7E,0x10);Delay();
	Write8_I2C(0x7F,0x28);Delay();
	Write8_I2C(0x80,0x36);Delay();
	Write8_I2C(0x81,0x44);Delay();
	Write8_I2C(0x82,0x52);Delay();
	Write8_I2C(0x83,0x60);Delay();
	Write8_I2C(0x84,0x6C);Delay();
	Write8_I2C(0x85,0x78);Delay();
	Write8_I2C(0x86,0x8C);Delay();
	Write8_I2C(0x87,0x9E);Delay();
	Write8_I2C(0x88,0xBB);Delay();
	Write8_I2C(0x89,0xD2);Delay();
	Write8_I2C(0x8A,0xE6);Delay();
	
	//Write8_I2C(0x14,0x2E);Delay();	// Enable Fram Drop
	Write8_I2C(0x14,0x28);Delay();		// Disable Frame Drop
//	Write8_I2C(0x24,0x68);Delay();		// AEW
//	Write8_I2C(0x25,0x5C);Delay();		// AEB
	Write8_I2C(0x24,0x88);Delay();		// AEW
	Write8_I2C(0x25,0x78);Delay();		// AEB

	// Lens Correction
	Write8_I2C(0x62,0x20);Delay();		// AEB

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -