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

📄 csi.c

📁 凌阳32位单片机开发的小游戏
💻 C
📖 第 1 页 / 共 2 页
字号:

	if(pal==0) 
	{
		//insert dummy pixel	for NTSC
//		Write8_I2C(0x2A,0x00);Delay();
//		Write8_I2C(0x2B,0x5E);Delay();	//Delay 94 pixels
//		Write8_I2C(0x2A,0x00);Delay();
//		Write8_I2C(0x2B,0x64);Delay();	//Delay 100 pixels
//		Write8_I2C(0x2A,0x00);Delay();
//		Write8_I2C(0x2B,0x50);Delay();	//Delay 80 pixels
//		Write8_I2C(0x2D,0x10);Delay();	//Delay 32 lines
		Write8_I2C(0x2D,0x40);Delay();	//Delay 32 lines

	} 
	else 
	{
		//insert dummy pixel	for PAL
		Write8_I2C(0x2A,0x00);Delay();
		Write8_I2C(0x2B,0x64);Delay();	//Delay 100 pixels
		Write8_I2C(0x2D,0x32);Delay();	//Delay 50 lines
	}
}

void init_ov7660_qvga(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,0x81);Delay();	//Use 27/2 = 13.5 MHz
	Write8_I2C(0x11,0x80);Delay();	//Use 27/1 = 27.0 MHz
	Write8_I2C(0x92,0x00);Delay();
	Write8_I2C(0x93,0x00);Delay();
	Write8_I2C(0x9D,0x62);Delay();	// Band Filter For 50 Hz
	Write8_I2C(0x9E,0x52);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,0x10);Delay();	//QVGA YUV output
	} 
	else 
	{
		Write8_I2C(0x12,0x14);Delay();	//QVGA RGB output
	}

	Write8_I2C(0x04,0x40);Delay();	//enable CCIR656
	if (YUVIN_TEST) 
	{
		Write8_I2C(0x18,0x4B);Delay();	// HSTOP ??
		Write8_I2C(0x17,0x23);Delay();	// HSTART ??
		Write8_I2C(0x32,0xBF);Delay();	// HSTART/HSTOP ??
	} 
	else 
	{
		Write8_I2C(0x18,0x4B);Delay();	// HSTOP ??
		Write8_I2C(0x17,0x23);Delay();	// HSTART ??
		Write8_I2C(0x32,0xBF);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
	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

	if(pal==0) 
	{
		//insert dummy pixel	for NTSC
//		Write8_I2C(0x2A,0x00);Delay();
//		Write8_I2C(0x2B,0x5E);Delay();	//Delay 94 pixels
//		Write8_I2C(0x2A,0x00);Delay();
//		Write8_I2C(0x2B,0x64);Delay();	//Delay 100 pixels
//		Write8_I2C(0x2A,0x00);Delay();
//		Write8_I2C(0x2B,0x50);Delay();	//Delay 80 pixels
		Write8_I2C(0x2D,0x2D);Delay();	//Delay 64 lines
	} 
	else 
	{
		//insert dummy pixel	for PAL
		Write8_I2C(0x2A,0x00);Delay();
		Write8_I2C(0x2B,0x64);Delay();	//Delay 100 pixels
		Write8_I2C(0x2D,0x32);Delay();	//Delay 50 lines
	}
}

void ov7648_vga(void) 
{
    *P_CSI_IRQEN = FRAME_END|TG_OF;
    
    *P_CSI_TG_CR = CSIEN|YUV_TYPE|VGAEN|FGET_FALL|FIELDSEL|CSICLKOINV|(CCIR656_TEST<<8)|VADD_FALL|VRST_FALL|HRST_FALL|D_TYPE4|(CSIINTL<<15); //|RESIZE;--this parameter is used for LCD

	// Use I2C to initial QV7648
	init_ov7648(0, PAL_TEST);
}


void ov7648_qvga(void) 
{
    *P_CSI_IRQEN = FRAME_END|TG_OF;

	*P_CSI_TG_CR = CSIEN|YUV_TYPE|CSICLKOINV|(CCIR656_TEST<<8);
	
	if(CSIINTL)
		*P_CSI_TG_CR |=(VADD_FALL|VRST_FALL|HRST_FALL|D_TYPE5);
	else
		*P_CSI_TG_CR |=(VADD_RISE|VRST_FALL|HRST_RISE|D_TYPE7);
	
	init_ov7648(1, PAL_TEST);
	
	// Enable TV Encoder
	if(YUVOUT_TEST)
		*P_TV_CONTROL = TVEN|TVINTL|TVLPF1|Y4U4V4|(PAL_TEST<<1);		
	else
		*P_TV_CONTROL = TVEN|TVINTL|TVLPF1|TVRGB2YUV|(PAL_TEST<<1);	
}



void init_ov7648(int qvga, int pal)
{
	unsigned int a;
	
	*P_I2CCVR=60;
	*P_I2CID=0x42;							//for OV7648
	
	Write8_I2C(0x12,0x80);					// OV7648 software reset
	for(a=0;a<1000;a++);					// Delay for reset

	if (YUVIN_TEST) 
		Write8_I2C(0x12,0x14);				//YUV/YCbCr + no mirror
//		Write8_I2C(0x12,0x54);				//YUV/YCbCr + mirror
	else
		Write8_I2C(0x12,0x1C);				//RGB (not YUV/YCbCr) + no mirror
//		Write8_I2C(0x12,0x5c);				//RGB (not YUV/YCbCr) + mirror

	Write8_I2C(0x13,0xB3);					//enable CCIR656

	if(qvga==1)
		Write8_I2C(0x14,0x24);				//QVGA
	else
		Write8_I2C(0x14,0x04);				//VGA

	Write8_I2C(0x15,0x01);					//BGRG seq

	if (CSIINTL)
		Write8_I2C(0x28,0x00);				//interlace
	else
		Write8_I2C(0x28,0x20);				//prograssive

	Write8_I2C(0x75,0x82);					//vertical flip

	Write8_I2C(0x71,0x20);					//HSYNC in HREF pin

	Write8_I2C(0x67,0x10);					//UV filter enable

	if(pal==0) 
	{
		//insert dummy pixel	for NTSC
		Write8_I2C(0x2A,0x80);
		Write8_I2C(0x2B,0x5E);				//Delay 94 pixels
	} 
	else 
	{
		//insert dummy pixel	for PAL
		Write8_I2C(0x2A,0x80);
		Write8_I2C(0x2B,0x64);				//Delay 100 pixels
		Write8_I2C(0x16,0x32);				//Delay 50 lines
	}
}
/*
void CA202QVGA(void) 
{
    *P_CSI_IRQEN = FRAME_END|TG_OF|FRAME_LOSS;

	*P_CSI_TG_CR = CSIEN|MASEN|CSICLKINV;
	// Enable TV Encoder
	if(YUVOUT_TEST)
	{
		*P_CSI_TG_CR |= (YUVOUT|Y4U4Y4V4);		
		*P_TV_CONTROL = TVEN|TVINTL|TVLPF1|Y4U4V4|(PAL_TEST<<1);		
	}
	else
		*P_TV_CONTROL = TVEN|TVINTL|TVLPF1|TVRGB2YUV|(PAL_TEST<<1);	

	CA202Init(PAL_TEST);
}

void CA202Init(int TVMode)
{
	*P_I2CCVR=20;
	*P_I2CID=0x30;//for 202

	Write8_I2C(0x00,0xc3);	// reg:0x00
	Write8_I2C(0x00,0xc3);	// reg:0x00

	if(TVMode==0)
		Write8_I2C(0x01,0x84);	// reg:0x01	NTSC
	else
		Write8_I2C(0x01,0x80);	// reg:0x01	PAL

	Write8_I2C(0x02,0x8c);	// reg:0x02
	Write8_I2C(0x03,0x00);	// reg:0x03
	Write8_I2C(0x04,0x03);	// reg:0x04
	Write8_I2C(0x05,0x15);	// reg:0x05
	Write8_I2C(0x06,0xe0);	// reg:0x06
	Write8_I2C(0x07,0x40);	// reg:0x07
	Write8_I2C(0x08,0xa0);	// reg:0x08
	Write8_I2C(0x09,0x4f);	// reg:0x09
	Write8_I2C(0x0a,0xaa);	// reg:0x0a
	Write8_I2C(0x0b,0x00);	// reg:0x0b

	if(TVMode==0)
		Write8_I2C(0x0c,0xe9);	// reg:0x0c	NTSC
	else
		Write8_I2C(0x0c,0xa9);	// reg:0x0c	PAL

	Write8_I2C(0x0d,0x20);	// reg:0x0d
	Write8_I2C(0x0e,0x00);	// reg:0x0e
	Write8_I2C(0x0f,0x00);	// reg:0x0f
	Write8_I2C(0x10,0xfd);	// reg:0x10
	Write8_I2C(0x11,0x00);	// reg:0x11

	Write8_I2C(0x12,0x42);	// reg:0x12

	Write8_I2C(0x13,0x40);	// reg:0x13
	Write8_I2C(0x14,0x4e);	// reg:0x14
	Write8_I2C(0x15,0x40);	// reg:0x15
	Write8_I2C(0x16,0x52);	// reg:0x16
	Write8_I2C(0x17,0x98);	// reg:0x17
	Write8_I2C(0x18,0xd0);	// reg:0x18
	Write8_I2C(0x19,0x8a);	// reg:0x19
	Write8_I2C(0x1a,0x00);	// reg:0x1a
	Write8_I2C(0x1b,0x00);	// reg:0x1b
	Write8_I2C(0x1c,0x00);	// reg:0x1c
	Write8_I2C(0x1d,0x00);	// reg:0x1d
	Write8_I2C(0x1e,0x00);	// reg:0x1e
	Write8_I2C(0x1f,0xff);	// reg:0x1f
	Write8_I2C(0x20,0x00);	// reg:0x20
}

void s201_qcif(void) 
{
	
	unsigned int cr_set;
	
	unsigned int *csibuf;
	unsigned int *tvbuf;
	unsigned int y_temp, y0, y1, y2, y3;
	unsigned int i, j, k;

	// Use I2C to initial QV7660
	init_201();

	// Use Software Mode
	*P_PTR_SETTING = 0;
	*P_C2P_SETTING = 0;
	*P_CSI_TG_FBSADDR0 = 0x00100000;
	*P_TV_START_ADR1 = 0x00200000;

    *P_CSI_IRQEN = FRAME_END|TG_OF|FRAME_LOSS;

	cr_set = CSIEN|S201MODE|YUVIN;

  	*P_CSI_TG_LSTART = ((0x00)<<20)|((0x05)<<10)|0x110;

   	*P_CSI_TG_CR = cr_set;

	// Use I2C to initial QV7660
	//init_201();

	// Enable TV Encoder
	*P_TV_CONTROL = TVEN;

	i=0xA0100000;
	csibuf = (unsigned int *)i;
	j=0xA0200000;
	tvbuf = (unsigned int *)j;
	
	
	while (1) 
	{
		
//		while (framecnt == 0);
//		framecnt =0;
		
//		for (i=0;i<120;i++) {
		for (i=0;i<4800;i=i+40)
		{
			for (j=0;j<40;j++) 
			{
				y_temp = csibuf[i+j];	// i*160+j
				y0 = y_temp&0xff;
				y1 = ((y_temp&0xff00)<<8);
				y2 = ((y_temp&0xff0000)>>16);
				y3 = ((y_temp&0xff000000)>>8);
				k = (i<<2) + (j<<1) + 9640;	// (i+60)*160 + j*2 + 40
				tvbuf[k++] = y1+y0;
				tvbuf[k] = y3+y2;
			}
		}
	}
		
	while (1);
}

 void init_201(void)
{
	*P_I2CCVR=120;
	*P_I2CID=0x30;//for 201

	Write8_I2C(0x00,0xfe);Delay();	// reg:0x00

	Write8_I2C(0x01,0xe0);Delay();	// 
	Write8_I2C(0x02,0x20);Delay();	// 
	Write8_I2C(0x03,0x90);Delay();	// 
	Write8_I2C(0x04,0xac);Delay();	// 
	Write8_I2C(0x05,0x00);Delay();	// 
	Write8_I2C(0x06,0x80);Delay();	// 
	Write8_I2C(0x07,0x80);Delay();	// 
	Write8_I2C(0x08,0x02);Delay();	// 
	Write8_I2C(0x10,0x80);Delay();	// 
	
}
 */
void Delay()
{
	int i;
	for(i=0;i<2000;i++);
}

void Enable_TV_Encoder(int PAL_ENABLE,int VGA_ENABLE,int YUV_ENABLE)
{
	unsigned int YUV_STATUS;
	
	if(YUV_ENABLE!=0)YUV_STATUS=(unsigned int)Y4U4V4;
	else             YUV_STATUS=(unsigned int)TVRGB2YUV;
	
	*P_TV_CONTROL =TVEN|TVINTL|TVLPF1|YUV_STATUS|(VGA_ENABLE<<2)|(PAL_ENABLE<<1);
}


/*
void SetBlendingLevel(S32 nText, S32 nBlend, S32 nLevel)
{
	U32 		*control, *blend;
	control 	= P_PPU_TX1_Control 	+ nText * 7;	
	*control	|= nBlend;
	blend		= P_PPU_TX1_Blending	+ nText * 7;
	*blend		= nLevel;
}

void SetBlueScreen(S32 enable, S32 nUp, S32 nLow) 
{
	// Blue Screen Test Pattern
	*P_CSI_TG_BSUPPER = nUp;
	*P_CSI_TG_BSLOWER = nLow;
//	*P_CSI_TG_TRANSP = 0x000000;

	*P_CSI_TG_CR = *P_CSI_TG_CR|enable;
	
//	while (1);
}

*/


⌨️ 快捷键说明

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