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

📄 2410iis.c

📁 2410开发测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	//DMA2 Initialize
	rDISRCC2 = (0<<1) + (0<<0);		//AHB, Increment
	rDISRC2	= (int)rec_buf;			//0x31000000
	rDIDSTC2 = (1<<1) + (1<<0);		//APB, Fixed
	rDIDST2	= ((U32)IISFIFO);		//IISFIFO
	rDCON2	= ((U32)1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(0<<22)+(1<<20)+(size/2);
	//Handshake, sync PCLK, TC int, single tx, single service, I2SSDO, I2S request, 
	//Auto-reload, half-word, size/2
	rDMASKTRIG2 = (0<<2)+(1<<1)+0;	//No-stop, DMA2 channel on, No-sw trigger 

	//IIS Initialize
	//Master,Tx,L-ch=low,iis,16bit ch.,CDCLK=256fs,IISCLK=32fs
	rIISMOD = (0<<8) + (2<<6) + (0<<5) + (0<<4) + (1<<3) + (0<<2) + (1<<0);		
//	rIISPSR = (4<<5) + 4;			//Prescaler_A/B=4 for 11.2896MHz
	rIISCON = (1<<5)+(0<<4)+(0<<3)+(1<<2)+(1<<1);
	//Tx DMA enable,Tx DMA disable,Tx not idle,Rx idle,prescaler enable,stop
	rIISFCON = (1<<15) + (1<<13);	//Tx DMA,Tx FIFO --> start piling....

	Uart_Printf("Press any key to exit!!!\n");

	rIISCON |= 0x1;			//IIS Tx Start
	while(!Uart_GetKey());

	//IIS Tx Stop
	Delay(10);				//For end of H/W Tx
	rIISCON	= 0x0;			//IIS stop
	rDMASKTRIG2 = (1<<2);	//DMA2 stop
	rIISFCON	= 0x0;		//For FIFO flush

	size = 0;

	rGPBCON = save_B;
	rGPECON = save_E;
	rGPBUP	= save_PB;
	rGPEUP	= save_PE;

	rINTMSK = (BIT_DMA2 | BIT_EINT0);
	
//	ChangeClockDivider(1,0);			//1:2:2	
//	ChangeClockDivider(1,1);			//1:2:4
//	ChangeMPllValue(0x5c,0x4,0x2);		//Fin=12MHz, Fout=50MHz
//	ChangeMPllValue(0x5c,0x4,0x1);		//FCLK=100Mhz	
//	ChangeMPllValue(0x96,0x5,0x1);		//FCLK=135428571Hz
	ChangeMPllValue(0xa1,0x3,0x1);		// FCLK=202.8MHz
	Uart_Init(0,115200);
	mute = 1;
}

//******************[ Init1341 ]**************************************
void Init1341(char mode)
{
	//Port Initialize
//----------------------------------------------------------
//	PORT B GROUP
//Ports	:	GPB4	GPB3	GPB2	
//Signal :	L3CLOCK L3DATA L3MODE
//Setting:	OUTPUT OUTPUT OUTPUT 
//			[9:8]	[7:6}	[5:4]
//Binary :	01	,	01	01 
//----------------------------------------------------------	
	rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C); //Start condition : L3M=H, L3C=H
	rGPBUP	= rGPBUP	& ~(0x7<<2) |(0x7<<2);		//The pull up function is disabled GPB[4:2] 1 1100	
	rGPBCON = rGPBCON & ~(0x3f<<4) |(0x15<<4);		//GPB[4:2]=Output(L3CLOCK):Output(L3DATA):Output(L3MODE)

		//L3 Interface
	_WrL3Addr(0x14 + 2);		//STATUS (000101xx+10)
	_WrL3Data(0x60,0);			//0,1,10,000,0 : Reset,256fs,no DCfilter,iis

	_WrL3Addr(0x14 + 2);		//STATUS (000101xx+10)
	_WrL3Data(0x20,0);			//0,0,10,000,0 : No reset,256fs,no DCfilter,iis
	
	_WrL3Addr(0x14 + 2);		//STATUS (000101xx+10)
	_WrL3Data(0x81,0);			//1,0,0,0,0,0,01 : OGS=0,IGS=0,ADC_NI,DAC_NI,sngl speed,AoffDon
	
		//record
	if(mode)
	{
		_WrL3Addr(0x14 + 2);	//STATUS (000101xx+10)
		_WrL3Data(0xa2,0);		//1,0,1,0,0,0,10 : OGS=0,IGS=1,ADC_NI,DAC_NI,sngl speed,AonDoff

		_WrL3Addr(0x14 + 0);	//DATA0 (000101xx+00)
		_WrL3Data(0xc2,0);		//11000,010	: DATA0, Extended addr(010) 
		_WrL3Data(0x4d,0);		//010,011,01 : DATA0, MS=9dB, Ch1=on Ch2=off, 
	}
}

//===================================================================
void ChangeDMA2(void)
{
	if(which_Buf)
	{
		rDISRCC2 = (0<<1) + (0<<0);				//AHB, Increment
		rDISRC2	= (int)(Buf + 0x30);			//0x31000030~(Remove header)
	}
	else
	{
		rDISRCC2 = (0<<1) + (0<<0);				//AHB, Increment
		rDISRC2	= (int)(Buf + 0x30+(size/2));	//0x31000030 + size/2~
	}
}

//===================================================================
void IIS_PortSetting(void)
{
//----------------------------------------------------------
//	PORT B GROUP
//Ports	:	GPB4	GPB3	GPB2	
//Signal :	L3CLOCK L3DATA L3MODE
//Setting:	OUTPUT OUTPUT OUTPUT 
//			[9:8]	[7:6}	[5:4]
//Binary :	01	,	01	01 
//----------------------------------------------------------	
	rGPBUP	= rGPBUP	& ~(0x7<<2) | (0x7<<2);	//The pull up function is disabled GPB[4:2] 1 1100	
	rGPBCON = rGPBCON & ~(0x3f<<4) | (0x15<<4); //GPB[4:2]=Output(L3CLOCK):Output(L3DATA):Output(L3MODE)

//----------------------------------------------------------
//	PORT E GROUP
//Ports	:	GPE4	GPE3	GPE2	GPE1	GPE0 
//Signal : I2SSDO	I2SSDI CDCLK I2SSCLK I2SLRCK 
//Binary :	10	,	10	10 ,	10		10	
//----------------------------------------------------------
	rGPEUP	= rGPEUP	& ~(0x1f)	| 0x1f;	//The pull up function is disabled GPE[4:0] 1 1111
	rGPECON = rGPECON & ~(0x3ff) | 0x2aa;	//GPE[4:0]=I2SSDO:I2SSDI:CDCLK:I2SSCLK:I2SLRCK

	rGPFUP	= ((rGPFUP	& ~(1<<0)) | (1<<0));	//GPF0
	rGPFCON	= ((rGPFCON	& ~(3<<0)) | (1<<1));	//GPF0=EINT0	
	
	rEXTINT0 = ((rEXTINT0 & ~(7<<0)) | (2<<0));	//EINT0=falling edge triggered	
}

//===================================================================
void _WrL3Addr(U8 data)
{		
	S32 i,j;

	rGPBDAT	= rGPBDAT & ~(L3D | L3M | L3C) | L3C;	//L3D=L, L3M=L(in address mode), L3C=H

	for(j=0;j<4;j++);				//tsu(L3) > 190ns

		//GPB[4:2]=L3C:L3D:L3M
	for(i=0;i<8;i++)				//LSB first
	{
		if(data & 0x1)				//If data's LSB is 'H'
		{
			rGPBDAT &= ~L3C;		//L3C=L
			rGPBDAT |= L3D;			//L3D=H			
			
			for(j=0;j<4;j++);		//tcy(L3) > 500ns
			
			rGPBDAT |= L3C;			//L3C=H
			rGPBDAT |= L3D;			//L3D=H
			
			for(j=0;j<4;j++);		//tcy(L3) > 500ns
		}
		else						//If data's LSB is 'L'
		{
			rGPBDAT &= ~L3C;		//L3C=L
			rGPBDAT &= ~L3D;		//L3D=L
			
			for(j=0;j<4;j++);		//tcy(L3) > 500ns
			
			rGPBDAT |= L3C;			//L3C=H
			rGPBDAT &= ~L3D;		//L3D=L
			
			for(j=0;j<4;j++);		//tcy(L3) > 500ns			
		}
		data >>= 1;
	}
	rGPBDAT	= rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);	//L3M=H,L3C=H	
}

//===================================================================
void _WrL3Data(U8 data,int halt)
{
	S32 i,j;

	if(halt)
	{
		rGPBDAT	= rGPBDAT & ~(L3D | L3M | L3C) | L3C;	//L3C=H(while tstp, L3 interface halt condition)		
		for(j=0;j<4;j++);								//tstp(L3) > 190ns
	}

	rGPBDAT	= rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);	//L3M=H(in data transfer mode)		
	for(j=0;j<4;j++);										//tsu(L3)D > 190ns

	//GPB[4:2]=L3C:L3D:L3M
	for(i=0;i<8;i++)
	{
		if(data & 0x1)				//if data's LSB is 'H'
		{
			rGPBDAT &= ~L3C;		//L3C=L
			rGPBDAT |= L3D;			//L3D=H
			
			for(j=0;j<4;j++);		//tcy(L3) > 500ns
			
			rGPBDAT |= (L3C | L3D);	//L3C=H,L3D=H
			
			for(j=0;j<4;j++);		//tcy(L3) > 500ns
		}
		else						//If data's LSB is 'L'
		{
			rGPBDAT &= ~L3C;		//L3C=L
			rGPBDAT &= ~L3D;		//L3D=L
			for(j=0;j<4;j++);		//tcy(L3) > 500ns
			rGPBDAT |= L3C;			//L3C=H
			rGPBDAT &= ~L3D;		//L3D=L
			for(j=0;j<4;j++);		//tcy(L3) > 500ns
		}
		data >>= 1;					//For check next bit
	}
	rGPBDAT	= rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);	//L3M=H,L3C=H
}

//===================================================================
void __irq DMA2_Done(void)
{
	rSRCPND = BIT_DMA2;			//Clear pending bit
	rINTPND = BIT_DMA2;
//	rINTPND;

	WrUTXH0('@');
	if(!which_Buf)
		which_Buf = 1;
	else
		which_Buf = 0;
}

//===================================================================
void __irq DMA2_Rec_Done(void)
{
	rSRCPND = BIT_DMA2;			//Clear pending bit
	rINTPND = BIT_DMA2;
//	rINTPND;

	Rec_Done = 1;
}

//===================================================================
void __irq RxInt(void)
{
	rSUBSRCPND = BIT_SUB_RXD0;	//Clear pending bit (Requested)
//	rSRCPND	= BIT_UART0;
//	rINTPND	= BIT_UART0;		//UART 0 : The interrupt source has asserted the interrupt request
//	rINTPND;
//	rSUBSRCPND;

	ClearPending(BIT_UART0);

	*_temp ++= RdURXH0(); 
}

//===================================================================
void __irq Muting(void)
{
	rSRCPND = BIT_EINT0;		//Clear pending bit
	rINTPND = BIT_EINT0;
//	rINTPND;

	if(mute)	//Mute
	{
		_WrL3Addr(0x14 + 0);	//DATA0 (000101xx+00)
		_WrL3Data(0xa4,0);		//10,1,00,1,00 : after, no de-emp, mute, flat 
		mute = 0;
		Uart_Printf("=== Mute ===\n");
	}
	else		//No mute
	{
		_WrL3Addr(0x14 + 0);	//DATA0 (000101xx+00)
		_WrL3Data(0xa0,0);		//10,1,00,0,00 : after, no de-emp, no mute, flat 
		mute = 1;
		Uart_Printf("=== No Mute ===\n");
	}
}

⌨️ 快捷键说明

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