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

📄 iis.c

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

	File Name: Iis.c
	Description: 
   	Version: 
	       		  
==============================================================*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "option.h"
#include "System.h"
#include "2413addr.h"
#include "console.h"
#include "iis.h"	
#include "PLL.h"
#include "clock.h"

#define IIS_BUFFER 0x31000000
#define REC_LEN_IIS 0xfffff*4	//Max value of DMA Transfer Counter (20bit) = 0xfffff, Date Size=Word (4bytes)
#define PLAY_IIS    0
#define RECORD_MICIn  1
#define RECORD_LineIn 2 
#define RECORD_PLAY_Simul 3
#define IMS 0 //2 = SLAVE 1 = EXT CLK 0= PCLK
#define L3C (1<<4)	//GPB4 = L3CLOCK
#define L3D (1<<3)	//GPB3 = L3DATA 
#define L3M (1<<2)	//GPB2 = L3MODE

char mute = 1;
char which_Buf = 1;
volatile char Rec_Done = 0;
char IIS_MasterClk_Sel = 0;
volatile U32 iPdf=0;
volatile U32 iFS;
volatile U32 iCODECCLK =0;
unsigned char  *Buf,*_temp;
unsigned char *rec_buf = (unsigned char *)0x31000028;
unsigned char *rec_buf1 = (unsigned char *)(0x31000000 + REC_LEN_IIS); 
unsigned int size, fs; 
unsigned int save_GPE_CON, save_GPB_CON;
float IIS_Codec_CLK;
unsigned short IIS_Select_SamplingRate(void);

void IIS_Port_Init(void);
void IIS_Port_Return(void);
void Init1341(int);
void Select_IIS_Master_CLK(void);
void Play_Iis(void);
void Select_PCLK(void);
void Select_EXTCLK(void);
//void Select_EPLL(void);
void Select_UPLL_Ref_CLK(void);
//void down_wav(void);
//void IIS_RecSound_DMA1( int mode, unsigned int rec_size);
void IIS_RecSound_DMA1_Repeat(unsigned char *start_addr, unsigned int rec_size);
void IIS_PlayWave_DMA2(unsigned char *start_addr, unsigned int play_size);
void IIS_Paly_Rec_Simul(unsigned char *start_addr, unsigned int play_size);
void RecordSound_ViaMICIn_Playit_MASTER(void);
void IIS_RecSound_DMA1_MASTER(int mode, unsigned int rec_size);
void IIS_PlayWave_DMA2_MASTER(unsigned char *start_addr, unsigned int play_size);
void Data_init_Master(void);
void Play_Iis_MASTER(void);
void IIS_PlayWave_EREFCLK_1(unsigned char *start_addr, unsigned int play_size);
void IIS_PlayWave_EREFCLK_2(unsigned char *start_addr, unsigned int play_size);
void Init1341_256(int mode);
void RecordSound_ViaMICIn_Playit_FS_Change(void);
void IIS_RecSound_DMA1_FSCHANGE(int mode, unsigned int rec_size);
void IIS_PlayWave_DMA2_FSCHANGE(unsigned char *start_addr, unsigned int play_size);
void IIS_RecSound_DMA1_SLAVE(int mode, unsigned int rec_size);
void Play_Iis_MASTER_SlaveTest(void);
void IIS_PlayWave_DMA2_MASTER_SlaveTest(unsigned char *start_addr, unsigned int play_size);
void RecordSound_ViaMICIn_Playit_SlaveTest(void);
void Play_Iis_SLAVE_SlaveTest(void);
void IIS_PlayWave_DMA2_SLAVE_SlaveTest(unsigned char *start_addr, unsigned int play_size);
void RecordSound_ViaMICIn_Playit_SlaveTest_2(void);
void IIS_RecSound_MASTER(int mode, unsigned int rec_size);
void _WrL3Addr(unsigned char data);
void _WrL3Data(unsigned char data,int halt);
void __irq Rx_IIS_Int(void);
void __irq DMA1_Rec_Done(void);
void __irq DMA2_Done(void);
void __irq Play_Rec_Simul(void);
void Data_init(void);
void RecordSound_ViaLineIn_Playit_MASTER(void);

void * func_iis_test[][2]=
{	
	//IIS Function Test Item
        (void *)Play_Iis_MASTER,                         "Play   Wave In Mater Mode   ",
    	(void *)RecordSound_ViaMICIn_Playit_MASTER,	     "Record Sound by Mic_In  and Play It in Master Mode    ",
    	(void *)RecordSound_ViaLineIn_Playit_MASTER,     "Record Sound by Line-In and Play it in Master Mode   ",
    	(void *)Record_Play_Simultaneously,              "Record Sound by Line-In and Play Simultaneously in Mster Mode     ", 
    	(void *)RecordSound_ViaMICIn_Playit_FS_Change,	 "Record Sound by Line_In and Play In BCLK, BLC Change Case   ",    	
     	(void *)Play_Iis,                                "Play   Wave at Clock Sources. MPLLout(266Mhz) or EREFCLK(12Mhz) ",     	    	
        (void *)Play_Iis_MASTER_SlaveTest,               "Play   Data In Master Mode for Slave Test  ",	
    	(void *)RecordSound_ViaMICIn_Playit_SlaveTest,   "Record Data In Slave  Mode for Slave Test  ",  
        (void *)Play_Iis_SLAVE_SlaveTest,                "Play   Data In Slave  Mode for Slave Test  ",	    	          
    	(void *)RecordSound_ViaMICIn_Playit_SlaveTest_2,   "Record Data In Master Mode for Slave Test  ",          
     	0,0
};

void Ch20_Iis(void)
{
	int i;
		
		
	while(1)
	{
		i=0;
		printf("\n\n======================= IIS Function Test =====================\n");
		printf("1.Download Wave File at 0x31000028 by USBMON for Play Mode Test\n" );
		printf("2.Need two boards for Slave mode Test \n" );
		printf("  A: Tx Mode Board / B: RX Mode Board  \n" );
		printf("  Connected with A(I2SSDI)   ------ B(I2SSDO)\n" );
		printf("                 A(I2SSDO)   ------ B(I2SSDI)\n" );
		printf("                 A(I2SLRCLK) ------ B(I2SLRCLK)\n" );
		printf("                 A(I2SSCLK)  ------ B(I2SSCLK)\n" );
		printf("3. For Slave Mode Test Sequence\n");
		printf("     one. Slave Mode  Start\n");
		printf("     two. Master mode Start\n");
		printf("===============================================================\n\n");
		
		while(1)
		{   //display menu
			printf("%2d:%s",i,func_iis_test[i][1]);
			i++;
			if((int)(func_iis_test[i][0])==0)
			{
				printf("\n");
				break;
			}
			if((i%1)==0)
			printf("\n");
		}
		printf("\n==========================================================\n");
		printf("Select #Item or Press Enter key to exit : ");
		i = GetIntNum(); //gh0522.cha
		if(i==-1) break;		// return.
		if(i>=0 && (i<((sizeof(func_iis_test)-1)/8)) )	// select and execute...
			( (void (*)(void)) (func_iis_test[i][0]) )();
	}

}

// ------------------------------- Main Function ---------------------------------------
void Play_Iis_MASTER(void)
{	
	IIS_Port_Init(); 
	Select_PCLK();

	Init1341(PLAY_IIS);
	IIS_PlayWave_DMA2_MASTER(rec_buf, 464000);

	IIS_Port_Return();
	mute = 1;
}

void RecordSound_ViaMICIn_Playit_MASTER(void)
{
	printf("\nRecord Sound via MIC-In and Play It At Master Mode\n");
   	IIS_Port_Init(); 
	Select_PCLK();

	Init1341(RECORD_MICIn);
	IIS_RecSound_DMA1_MASTER(RECORD_MICIn,5000000);

	printf ("Enter any key If you Recording Wave File.\n");
	getchar();

	Init1341(PLAY_IIS);
	IIS_PlayWave_DMA2_MASTER(rec_buf, 5000000);

	IIS_Port_Return();
	mute = 1;
}

void RecordSound_ViaLineIn_Playit_MASTER(void)
{
	printf("\nRecord Sound via MIC-In and Play It At Master Mode\n");
   	IIS_Port_Init(); 
	Select_PCLK();

	Init1341(RECORD_LineIn);
	IIS_RecSound_DMA1_MASTER(RECORD_LineIn,5000000);

	printf ("Enter any key If you Recording Wave File.\n");
	getchar();

	Init1341(PLAY_IIS);
	IIS_PlayWave_DMA2_MASTER(rec_buf, 5000000);

	IIS_Port_Return();
	mute = 1;
}

void Record_Play_Simultaneously(void)
{
	printf("\nRecord and Play Simultaneously.\n");

	IIS_Port_Init(); 
	Select_PCLK();

	printf("First Recording \n");
	Init1341(RECORD_LineIn);
	IIS_RecSound_DMA1_MASTER(RECORD_LineIn,5000000);
	
	printf ("Second Recording and Play Recording File!\n" );
	Init1341(RECORD_PLAY_Simul);
	IIS_Paly_Rec_Simul(rec_buf, 5000000);
	
	printf ("Third Play second recording file!\n");
	Init1341(PLAY_IIS);
	IIS_PlayWave_DMA2_MASTER(rec_buf1, 5000000); // Check 0926
		
	IIS_Port_Return();
}

void Play_Iis(void)
{	
	IIS_Port_Init(); 
	Select_IIS_Master_CLK();

	Init1341(PLAY_IIS);
	
	if ( iFS == 0 )
	{
		IIS_PlayWave_EREFCLK_1(rec_buf, 464000);
	}
	if ( iFS == 1 )
	{
		IIS_PlayWave_EREFCLK_2(rec_buf, 464000);
	}

	IIS_Port_Return();
	mute = 1;
}

void RecordSound_ViaMICIn_Playit_FS_Change(void)
{
	printf("\nRecord Sound via MIC-In and Play It At Master Mode\n");
	printf("Select LRCLK, Bit Clock, Bit Length!\n"); 

   	IIS_Port_Init(); 
	Select_PCLK();
  
	Init1341(RECORD_LineIn);

	IIS_RecSound_DMA1_FSCHANGE(RECORD_LineIn,5000000);
	
	printf ("Enter any key If you Recording Wave File.\n");
	getchar();
	
	Init1341(PLAY_IIS);
	IIS_PlayWave_DMA2_FSCHANGE(rec_buf, 5000000);

	IIS_Port_Return();
	mute = 1;
}

void Play_Iis_MASTER_SlaveTest(void)
{	
	IIS_Port_Init(); 
	Select_PCLK();

	Data_init_Master(); // for Test Slave mode Board To Board Test

	Init1341(PLAY_IIS);
	IIS_PlayWave_DMA2_MASTER_SlaveTest(rec_buf, 464000);

	IIS_Port_Return();
	mute = 1;
}

void RecordSound_ViaMICIn_Playit_SlaveTest(void)
{
	printf("\nRecord Sound via MIC-In and Play it.\n");

   	IIS_Port_Init(); 
 	Select_PCLK(); 
  
	Init1341(RECORD_MICIn);
//	IIS_RecSound_DMA1_SLAVE(RECORD_MICIn, REC_LEN_IIS);
	IIS_RecSound_DMA1_SLAVE(RECORD_MICIn, 464000);
	
	IIS_Port_Return();
	mute = 1;
}

void Play_Iis_SLAVE_SlaveTest(void)
{	
	IIS_Port_Init(); 
	Select_PCLK();

	Data_init_Master(); // for Test Slave mode Board To Board Test

	Init1341(PLAY_IIS);
	IIS_PlayWave_DMA2_SLAVE_SlaveTest(rec_buf, 464000);

	IIS_Port_Return();
	mute = 1;
}

void RecordSound_ViaMICIn_Playit_SlaveTest_2(void)
{
	printf("\nRecord Sound via MIC-In and Play it.\n");

   	IIS_Port_Init(); 
 	Select_PCLK(); 
  
	Init1341(RECORD_MICIn);
//	IIS_RecSound_DMA1_SLAVE(RECORD_MICIn, REC_LEN_IIS);
	IIS_RecSound_MASTER(RECORD_MICIn, 464000);
	
	IIS_Port_Return();
	mute = 1;
}

// ------------------------------- Main Sub Function --------------------------------------

void IIS_PlayWave_DMA2_MASTER(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 = (0<<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");
	
	//DMA2 Register Setting 
	rDISRC2  = (int)(start_addr); 
	rDISRCC2 = (0<<1) + (0<<0); 		  
	rDIDST2  = ((unsigned int)0x55000010);			
	rDIDSTC2 = (0<<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();
    	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 IIS_RecSound_DMA1_MASTER(int mode, unsigned int rec_size)
{
	int Exit_Key;
	int iIndex, iFault=0, iGood=0, iLoop=0; 
	
	pISR_DMA2 = (unsigned)DMA1_Rec_Done;
	ClearPending(BIT_DMA2);	

	rIISCON = (0<<5) + (1<<4) + (0<<3) +(0<<2) + (1<<1) + 0;	   
  	// using pclk, rx only , left for channel,iis format ,384fs , 32fs ,16bit  	
 	rIISMOD = (0<<10)+(1<<8) + (0<<7)+ (0<<5) + (2<<3)+ (0<<1) + (0<<0);

	rIISFIC = rIISFIC | (1<<7);
	rIISFIC = rIISFIC & (0<<7);

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

	for(iIndex=0;iIndex<500000;iIndex+=1)
	{
		*((unsigned int*)(0x31000028)+iIndex)=0x0;
	}

	printf("\n Check 0x31000028 Memory Init \n");
	printf("\nPress any key to start record!\n");
	getchar();

	//--- 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);
	rDMAREQSEL2 = (5<<1) + (1<<0); 
	rDMASKTRIG2 = (0<<2) + (1<<1) + (0<<0);          //No-stop[2], DMA1 channel On[1], No-sw trigger[0] 

	rIISCON |= 0x1;

	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;
		}
	}
	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);	
	rINTMSK |= (BIT_DMA2);

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

void IIS_Paly_Rec_Simul(unsigned char *start_addr, unsigned int play_size)
{
	unsigned char Exit_Key;

⌨️ 快捷键说明

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