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

📄 iis.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
📖 第 1 页 / 共 4 页
字号:
		break;		
	}
}

void Select_PCLK(void)
{
	rCLKCON |= (1<<26)+(1<<13); // Enable IIS block , IIS audio clk block
	rCLKSRC |= (1<<9);
	rCLKDIVN &=~(0xf<<12);	//12/1=12 MHz
	printf("Enalbe PCLK for IIS Block!\n");
	printf("Enter Prescaller value : 7 or 3 (7:22.1khz using 3:44.1khz using @ PCLK 66.5Mhz)  =  ");
	iPdf = GetIntNum();
	printf("\n");
	
	//IIS Pre-scaler Setting
	rIISPSR &= 0;
	rIISPSR |= (1<<15) + (iPdf<<8);  
		
	//In case PCLK = 50   MHz, IIS Codec CLK = 50/(5+1) = 8.34MHz-->22KHz
	//In case PCLK = 66.5 MHz, IIS Codec CLK = 66.5/(7+1) = 8.31MHz-->22KHz
	printf("\nIIS Master CLK(PCLK) = %4.2f MHz", (float)PCLK/1000000);
	IIS_Codec_CLK = (float)PCLK/(iPdf+1);
	printf("\nIIS Codec CLK = %4.2f MHz", IIS_Codec_CLK/1000000);

	IIS_MasterClk_Sel = 0;
}

void Select_EXTCLK(void) // I2S Clock source is I2SSYSCLK(MPLL_Out=266Mhz)
{
	unsigned short Sampling_Rate;
		
	printf("\nI2S Source Clock is I2SSYSCLK(MPLL_Out=266Mhz)\n");
	iFS = 0;			
			
	Sampling_Rate = IIS_Select_SamplingRate();

	rCLKCON |= (1<<26)+(1<<13); // Enable IIS block , IIS audio clk block
	rCLKSRC |= (1<<9); 	    //IIS Clock Source Selection: MPLL Out
	rCLKDIVN &=~(0xf<<12);	//I2S clock Divider is Zero.
	rIISMOD |= (1<<10);
	if(Sampling_Rate==44100)
	{
		rIISPSR |= (1<<15) + (15<<8);  
		IIS_Codec_CLK = (float)266000000/16;
	}
	else if(Sampling_Rate==22050)
	{
		rIISPSR |= (1<<15) + (31<<8);  
		IIS_Codec_CLK = (float)266000000/32;
	}
	printf("\nIIS Codec CLK = %4.4f MHz", IIS_Codec_CLK/1000000);

	IIS_MasterClk_Sel == 1;	
}

void Select_UPLL_Ref_CLK(void) // I2S Clock source is I2SSYSCLK(EREFCLK=12Mhz)
{
	printf("\nI2S Source Clock is I2SSYSCLK(EREFCLK=12Mhz)\n");
	printf("Using 12Mhz I2S Clock source and then you Setting FS = 256fs\n" );
	printf("Play Example LRCLK = 22.05kHz, FS = 256fs, BFS =32\n" );
	iFS = 1;
	iCODECCLK = 256;

	rCLKCON |= (1<<26)+(1<<13); // Enable IIS block , IIS audio clk block
	rCLKSRC &= ~(1<<9); 	    //IIS Clock Source Selection: EREFCLK
	rCLKDIVN &=~(0xf<<12);	//I2S clock Divider is Zero.
	rIISMOD |= (1<<10);

	rIISPSR |= (1<<15) + (1<<8);  
	IIS_Codec_CLK = (float)12000000/2;
	
	printf("\nIIS Codec CLK = %4.4f MHz", IIS_Codec_CLK/1000000);

	IIS_MasterClk_Sel == 1;	
}

void down_wav(void)
{
	  //Non-cacheable area = 0x11000000 ~ 0x13cf0000
    Buf   = (unsigned char *)IIS_BUFFER;
    _temp = Buf;
    
    printf("Download the PCM(no ADPCM) file by DNW serial port(With header)!!\n");
    printf("Download address is %xh\n", Buf);
    while(((unsigned int)_temp - (unsigned int)Buf) < 4)
    {
       //Uart_Printf("\ndata=%d",size);
       Led_Display(0);
       Delay(1500);
       Led_Display(15);
       Delay(1500);
    }
    printf("\ndata=%x",size);
    //Uart_Getch();
      
    size = *(Buf) | *(Buf + 1)<<8 | *(Buf + 2)<<16 | *(Buf + 3)<<24;
    printf("\ndata=%x",size);
    //Uart_Getch();
    
    printf("\nNow, Downloading... [ File Size : %8d(      0)]",size);
    while(((unsigned int)_temp - (unsigned int)Buf) < (size)){
	  printf("\b\b\b\b\b\b\b\b\b%8d)",(unsigned int)_temp - (unsigned int)Buf);
		Delay(5000);
    }
    printf("\b\b\b\b\b\b\b\b\b%8d)]\n",(unsigned int)_temp - (unsigned int)Buf);

    rINTSUBMSK |= BIT_SUB_RXD1;
    rINTMSK  |= BIT_UART1;
    size = *(Buf + 0x2c) | *(Buf + 0x2d)<<8 | *(Buf + 0x2e)<<16 | *(Buf + 0x2f)<<24;
    size = (size>>1)<<1;	//for 44B0X
    fs   = *(Buf + 0x1c) | *(Buf + 0x1d)<<8 | *(Buf + 0x1e)<<16 | *(Buf + 0x1f)<<24;

    printf("Sample Size = %d\n",size/2);
    printf("Sampling Frequency = %d Hz\n",fs);
    printf("\n[ Now play the wave file .....]\n");
    printf("If you want to mute or no mute push the 'EIN0' key repeatedly\n");

 	
    

}











unsigned short IIS_Select_SamplingRate(void)
{
	int i;
	
	printf("\nSelect ADC/DAC Rate\n");
	printf(" 1:22.05kHz, 2:44.1kHz\n");
	i = GetIntNum();	

	   switch(i)
       {
		case 0:
              return 11025;
       	break;
       	
		case 1:
              return 22050;
       	break;
       	
       	case 2:
       	return 44100;
       	break;
 
       	default:
       	return 44100;
       	break;
	}      
}



//Initialization of UDA1341 Audio Codec using L3 Interface 


/*
void IIS_RecSound_DMA1(int mode, unsigned int rec_size)
{
	int Exit_Key;
	pISR_DMA2 = (unsigned)DMA1_Rec_Done;
	ClearPending(BIT_DMA2);	

 
	rIISCON = (0<<5) + (1<<4) + (0<<3) +(0<<2) + (1<<1) + 0;	   
	rIISMOD = (IMS<<10)+(1<<8) + (0<<7) + (0<<5) +  (2<<3) + (1<<1) + (0<<0);
	//rIISFIC = (1<<7) + 0;	  
	//rIISFIC = (0<<7) + 0;	  

	printf("\nIISLRCK = %d Hz", (int) IIS_Codec_CLK/384);



	Data_init_2(); // Jungil
	printf("\n Check 0x31000028 Memory Init \n");
	getchar();
	


	printf("\nPress any key to start record!\n");
	getchar();
	rIISCON |= 0x1;
	//--- DMA1 Initialize
	rDISRCC2 = (1<<1) + (1<<0);   
	rDISRC2  = ((unsigned int)0x55000014);    
	rDIDSTC2 = (0<<1) + (0<<0);     
	rDIDST2  = (int)rec_buf;                            
//	rDCON2   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<22)+(2<<20)+(rec_size/4);
	rDCON2   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<22)+(2<<20)+(464000);
	rDMAREQSEL2 = (5<<1) + (1<<0); 
	rDMASKTRIG2 = (0<<2) + (1<<1) + (0<<0);          //No-stop[2], DMA1 channel On[1], No-sw trigger[0] 

	rINTMSK = ~(BIT_DMA2);

	if(mode ==1)
		printf("\n\nAre you ready to record sound via MIC-In on SMDK2411/2413?");
	if(mode ==2)
		printf("\n\nAre you ready to record sound via Line-In on SMDK2411/2413?");



	printf("Recording...\n");

	//IIS Rx start

	while(!Uart_GetKey())
	{
		Exit_Key=getchar();

		if( (Exit_Key == 'x') | (Exit_Key == 'X')) 
		{
			Rec_Done=1;
			break;
		}
	}
	while(!Rec_Done)
	{
		printf("STAT1: 0x%x CURR_TC: 0x%x		DCDST1: 0x%x\n", rDSTAT1&0x300000, rDSTAT1&0xfffff, rDCDST1);
		printf(".");
		Delay(2000);
	}

	Rec_Done = 0;

	//IIS Rx stop
	Delay(10);				//For end of H/W Rx

	rIISCON     = 0x0;			//IIS stop
	rDMASKTRIG2 = (1<<2);	//DMA1 stop
	rIISFIC    = 0x0;			//For FIFO flush

	ClearPending(BIT_DMA2);	
//	rSUBSRCPND=(BIT_SUB_DMA1);

	rINTMSK |= (BIT_DMA2);

	printf("\nEnd of Record!\n");	
    	
}

*/

void IIS_RecSound_DMA1_Repeat(unsigned char *start_addr, unsigned int rec_size)
{
	unsigned char Exit_Key;

	printf("\nIISLRCK = %d Hz", (int) IIS_Codec_CLK/384);

	//--- DMA1 Initialize
	rDISRCC1 = (1<<1) + (1<<0);   
	rDISRC1  = ((unsigned int)0x55000014);    
	rDIDSTC1 = (0<<1) + (0<<0);     
	rDIDST1  = (int)rec_buf1;                            
	rDCON1   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<22)+(2<<20)+(rec_size/4);
	rDMAREQSEL1 = (5<<1) + (1<<0); 
	rDMASKTRIG1 = (0<<2) + (1<<1) + (0<<0);          //No-stop[2], DMA1 channel On[1], No-sw trigger[0] 
	  
	printf("\nRecording...\n");

	//IIS Rx start
	//rIISCON |= 0x1;

	while(!Uart_GetKey())
	{
		Exit_Key=getchar();

		if( (Exit_Key == 'x') | (Exit_Key == 'X')) 
		{
			Rec_Done=1;
			break;
		}
	}

	//IIS Rx stop
	Delay(10);				//For end of H/W Rx

	rIISCON     = 0x0;			//IIS stop
	rDMASKTRIG1 = (1<<2);	//DMA1 stop
	rIISFIC    = 0x0;			//For FIFO flush

	printf("\n\nEnd of Record!");		
}

void __irq Rx_IIS_Int(void)
{
    rSUBSRCPND = BIT_SUB_RXD1;          //Clear pending bit (Requested)
    rSUBSRCPND;

    ClearPending(BIT_UART1);

    *_temp ++= RdURXH1(); 
}
 

void IIS_PlayWave_DMA2(unsigned char *start_addr, unsigned int play_size)
{
	unsigned char Exit_Key;
	
	pISR_DMA2 = (unsigned)DMA2_Done;
	ClearPending(BIT_DMA2);	
	// this setting for only TX   	
  	rIISCON = (0<<5) + (0<<4) +(1<<2) + (0<<1)+0;	   
  	// using pclk, tx only , left for channel,iis format ,384fs , 32fs ,16bit  	
  	rIISMOD = (IMS<<10)+(0<<8) + (0<<7)+ (0<<5) + (2<<3)+ (0<<1) + (0<<0);
  	
	rIISFIC = 0+(1<<15) ;	  
    rIISFIC = 0+(0<<15) ;	  
    	
	printf("\nIISLRCK = %d Hz", (int) IIS_Codec_CLK/384);

	rINTMSK = ~(BIT_DMA2);

	printf("\nConnect head-phone plug into speaker-out socket on SMDK2411 and Press any key.\n");
	getchar();
	
	printf("If you want to exit, Press the 'x' key.\n");
	printf("Now Play...\n");
	
	printf("If you want to disable IIS tx(PAUSE), Press '0' key\n");
	printf("If you want to enable IIS tx, Press '1' key\n");
	printf("If you want to stop DMA channel(STOP), Press '2' key\n");
	printf("If you want to start DMA channel, Press '3' key\n");
	
	//DMA2 Register Setting 
	rDISRC2  = (int)(start_addr); 
	rDISRCC2 = (0<<1) + (0<<0); 		  
	rDIDST2  = ((unsigned int)0x55000010);			
	rDIDSTC2 = (1<<2)+ (1<<1) + (1<<0); 
	// 31: ACK 	30: sync pclk  29:curr_tc int setting 28:unit transfer 27:single service 22: reload 20:half word 
	rDCON2   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<22)+(2<<20)+(play_size/4);
	// 5:1= 4th bit is the tx iis     0:set = hw zero = sw
	rDMAREQSEL2 = (4<<1)+(1<<0);
	rDMASKTRIG2 = (0<<2) + (1<<1) + (0<<0);	    //No-stop, DMA2 channel On, and No-sw trigger 
       
	//IIS Tx Start
	rIISCON |= 0x1;		 //IIS Interface start

	while(!Uart_GetKey())
	{
		Exit_Key=getchar();
		
    	//->
		//khs.050510
		//	added for I2S bug test
    	if(Exit_Key == '0'){
			rIISCON |= (1<<4);
    		printf("\nPAUSE...\n");
    	}
		if(Exit_Key == '1'){
			rIISCON &= ~(1<<3);
		}
		if(Exit_Key == '2'){
			rDMASKTRIG2 |= (1<<2);
			rIISFIC &= ~(1<<13);	//* tx fifo disable
			while((rIISFIC & 0x0FC0)!=0);	//* wait until tx fifo gets empty
    		printf("\nSTOP...\n");
		}
		if(Exit_Key == '3'){
			rIISFIC |= (1<<13);	//* tx fifo enable
			rDISRC2  = (int)(start_addr);
			rDMASKTRIG2 &= ~(1<<2);
			rDMASKTRIG2 |= (1<<1);
		}
		//<-		

		if( (Exit_Key == 'x') | (Exit_Key == 'X')) 
			break;
		printf("STAT2: 0x%x CURR_TC: 0x%x		DCDST2: 0x%x\n", rDSTAT2&0x300000, rDSTAT2&0xfffff, rDCDST2);
	}
    	
	//IIS Tx Stop
	Delay(10);			 //For end of H/W Tx
	rIISCON	&= ~(1<<0);	    //IIS Interface stop

	rDMASKTRIG2  = (1<<2);	 //DMA2 stop
	rIISFIC = 0x0;	    //For FIFO flush
		
	ClearPending(BIT_DMA2);	
	rINTMSK |= (BIT_DMA2);
 	
	printf("\nEnd of Play!\n");
}



void __irq DMA2_Done(void)
{

	rINTMSK |= (BIT_DMA2);
 	
	ClearPending(BIT_DMA2);	

	rIISCON	&= ~(1<<2)|(0<<0);
	rIISCON |= (1<<2)|(1<<0);
	
  	printf("\nTX DMA Done~~~");

	rINTMSK = ~(BIT_DMA2);
}

void __irq DMA1_Rec_Done(void)
{
	rINTMSK |= (BIT_DMA2);
	ClearPending(BIT_DMA2);	
	
	rIISCON	&= ~(1<<1)|(0<<0);
	rIISCON |= (1<<1)|(1<<0);
	printf("\nDMA Record Done..");

    rINTMSK = ~(BIT_DMA2);
    Rec_Done = 1;
} 

void __irq Play_Rec_Simul(void)
{
	
	rINTMSK |= (BIT_DMA1);
	ClearPending(BIT_DMA1);	

    rIISCON	&= ~(1<<0);
	rIISCON |= 0x1;
      
	printf("\nR~~~");	

	rINTMSK = ~(BIT_DMA1);
}

////////////////////////////////////////////////////////////////////////////////////


void Data_init(void)
{
	int i;
	
	for(i=0;i<50000;i+=4)
	{
		*(rec_buf+i)=0xaaaa5555 ;
	}

}

void Data_init_Master(void)
{
	int i;
    unsigned int *rec_buf = (unsigned int *)0x31000028; 
	
	for(i=0;i<500000;i++)
	{
		*(rec_buf+i)=i;
	}
//		*(rec_buf+0)=0xa5a5a5a5;
//		*(rec_buf+1)=0x5a5a5a5a;
//		*(rec_buf+2)=0xffff0000;
//		*(rec_buf+3)=0xffffffff;
//		*(rec_buf+4)=0x0000ffff;
}











⌨️ 快捷键说明

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