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

📄 iis.c

📁 对SAMSUNG 2440所有外部端口的全功能测试,包括SD卡,USB,CAMERA,LCD,IIS,TIMER,RS232等等,是你理想的调试软件.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*=================================================

	File Name: Iis.c
	Description: S3C2440A IIS controller Function Test
   	Version: 0.1 

   	History:
             0.0: 2002. 03. 06, Programming Start by SOP.
             0.1: 2004. 02. 04, Modified by Y. H. Lee.
		  - IIS Master Tx: Play Sample Wave File.
		  - IIS Master Rx: Record Sound using MIC and Play it.
		  - IIS maser clock selection is supported.
		  
===================================================*/

#include "2440addr.h"
#include "2440lib.h"
#include "def.h"
#include "iis.h"

//#define REC_LEN_IIS 0x200000
//YOYO	
#define REC_LEN_IIS 0x20000
#define PLAY_IIS    0
#define RECORD_IIS  1
 
//#define DataCount   0x10000     //IIS Master/Slave Data Rx/Tx Count
//#define DataDisplay 0x100		//IIS Master Data Display Count
//#define PollMode    0	     	//Polling Mode
//#define DMA2Mode    1	//DMA2 Mode

#define L3C (1<<4)		  //GPB4 = L3CLOCK
#define L3D (1<<3)		  //GPB3 = L3DATA
#define L3M (1<<2)		  //GPB2 = L3MODE
//******************************************YOYO FM******
#define bool unsigned char
#define Enable (1)
#define Disable (0)

#define FM_CE (1<<6)  //GPB6=FM_CE
#define FM_SCK (1<<7) //SPICLK1,GPG7
#define FM_SDA (1<<6) //SPIMOSI1,GPG6
#define FM_MUTE (1<<0) //GPB0=FM_MUTE
#define DATA_MASK	              0x8000 
#define MASK_1bit                    0x0001;
/********************************************************
#define SET_SCK_SDA_SCE_OUTPUT	rPCOND = 0x15
#define SET_SCK_SDA_SCE_LOW 		rPDATD = 0x00
#define SET_SDA_HIGH		rPDATD |= 0x01
#define SET_SCK_HIGH		rPDATD |= 0x02 
#define SET_SCE_HIGH             rPDATD |= 0x04
#define SET_SDA_LOW		rPDATD &= (~0x01)
#define SET_SCK_LOW		rPDATD &= (~0x02)
#define SET_SCE_LOW              rPDATD &= (~0x04)
#define SET_SDA_OUTPUT		rPCOND |= 0x01  
#define SET_SCK_OUTPUT 	       rPCOND |= 0x04 
#define SET_SCE_OUTPUT        rPCOND |= 0x10
#define DATA_MASK	              0x8000 
#define MASK_1bit                    0x0001;
//********************************************************/
char which_Buf = 1;
char Rec_Done = 0;
char mute = 1;
char IIS_MasterClk_Sel = 0; 

unsigned char *rec_buf;
unsigned char  *Buf,*_temp;
unsigned int size, fs; 
unsigned int save_B, save_E, save_PB, save_PE;
unsigned int channel;
U32  Data_Transfer_Rate;
int   Data_Block_Size;
int   Data_Unit_size;

extern U32 Pclk;

float IIS_Codec_CLK;

//extern void Calc_Clock(int print_msg);
//extern U32 Mdiv, Pdiv, Sdiv, Fclk, Hclk, Pclk, Hdivn, Pdivn, Hclk_Ratio, Pclk_Ratio, Ref_Cnt;

void	ChangeDMA2(void);
void IIS_Port_Init(void);
void IIS_Port_Return(void);
void Download_Wave_File(void);

void Select_IIS_Master_CLK(void);
void IIS_RecSound_DMA1(unsigned char *start_addr, U32 rec_size);
void IIS_PlayWave_DMA2(unsigned char *start_addr, U32 play_size);

void _WrL3Addr(U8 data);
void _WrL3Data(U8 data,int halt);
void RrL3Data(void);
void Set_MUTE(bool Mute);

void __irq DMA1_Rec_Done(void);
void __irq DMA2_Done(void);
void __irq RxInt_YOYO(void);
void __irq Muting(void);

void * func_iis_test[][2]=
{	
	//IIS Function Test Item
	(void *)Play_Wave_Iis,		"Play Wave File. ",
    (void *)Record_Sound_Iis,		"Record Sound via MIC and Play it. ",
    (void *)Speak_Power, 			"Speak Amplifer Enable",
    	0,0
};
void Init_FM(void)
{
	rGPBCON &=~((3<<12)|(3<<0));
	rGPBCON |=((1<<12)|(1<<0));  //Set GPB0,GPB6 output
	rGPBUP |=(FM_CE|FM_MUTE);

	rGPGCON &=~((3<<14)|(3<<12));
	rGPGCON |=((1<<12)|(1<<14));  //Set GPG6,GPB7 output
	rGPGUP |=(FM_SCK|FM_SDA);

	rGPBDAT &=~(FM_CE);  //SET FM_CE=0
}
void FM_Send_Data(int data)
{
	int i,j;

	Init_FM();
	Set_MUTE(0);
	
	rGPBDAT |=(FM_CE); //SET CE HIGH
	rGPGDAT &=~(FM_SCK); //SET SCK LOW
	for(j=0;j<8;j++);
	for(i=0;i<16;i++)
	{
			if (((data << i) & DATA_MASK))
			{
				rGPGDAT |=(FM_SDA);
			}
			else
			{
				rGPGDAT &=~(FM_SDA); //SET_SDA_LOW;
			}
		for(j=0;j<8;j++);  //SDA setup time
		rGPGDAT |=(FM_SCK); //SET_SCK_HIGH; 
		for(j=0;j<8;j++);
		rGPGDAT &=~(FM_SCK); //SET_SDA_LOW;
		for(j=0;j<8;j++);
	}
      rGPBDAT &=~(FM_CE); // SPI_Stop();
      for(j=0;j<8;j++);
}
/*
==============================================================================
Name           : Transmit()
FD             :   Start transmitting of BH1418.
Details        :Intialize transmitting
Input parameter: frequency:  the transmitted frequency 

Return value   : Void
==============================================================================
*/


void Transmit(unsigned long frequency,unsigned char MONO)
{
	unsigned int data=0;
    unsigned int channel=0;
	int i=0;
	channel=frequency/100;

///   Set Program counter  ///////
	
     for(i=0;i<11;i++)
      	{ 
           data|= (channel>>i) & MASK_1bit;
           data=(data<<1);
        }
///   Set Multiplexer MONO  ////

       data|= MONO&MASK_1bit;

///   Set phase detecor     /////
	data=(data<<2);
	data&=(~0x03);

///   Set Test Mode          /////
	data=(data<<2);
	data&=(~0x3);
	Uart_Printf("\nchannel=%4.2f MHZ,0x%x,0x%x\n",(float)frequency/(float)1000,channel,data);
    //while(1)
     FM_Send_Data(data);

}
void Set_MUTE(bool Mute)
{
	if(Mute)
		{
			rGPBDAT &=~(FM_MUTE);
		}
	else
		{
			rGPBDAT |=(FM_MUTE);
		}
}
void FM_Transmitter(void)
{
	char ch;
	Uart_Printf("\nFM Transmitter Test.........2006/10/31 YOYO\n");

    /******** For operating clock test *********/
	Uart_Printf("Please Select FM Trasmitter Frequency 1. 99.7MHZ,MONO 2.  102.3MHZ 3.exit FM  \nChoose : ");
	
	ch = Uart_Getch();
	switch (ch)
	{
		case '1' :
			Transmit(99700,0);	
			Set_MUTE(Disable);
			Uart_Printf("\nFM Tramsmitter is ON now!\n");
			break;
		case '3':
			Set_MUTE(Enable);
			break;
		default:
			break;
	}		
}
void IIS_Test(void)
{
	int i;
		
	while(1)
	{
		i=0;
		Uart_Printf("\n\n================== IIS Function Test ==================\n\n");
		
		while(1)
		{   //display menu
			Uart_Printf("%2d:%s",i,func_iis_test[i][1]);
			i++;
			if((int)(func_iis_test[i][0])==0)
			{
				Uart_Printf("\n");
				break;
			}
			if((i%4)==0)
			Uart_Printf("\n");
		}
		Uart_Printf("\n=======================================================\n");
		Uart_Printf("\nPress Enter key to exit : ");
		i = Uart_GetIntNum();
		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]) )();
	}
	
	//Uart_Printf("\n====== IIS Test program end ======\n");
}

//Play Wave File
void Speak_Power(void)
{
	int sel;
	save_B  = rGPBCON;	 
   	save_PB = rGPBUP;
 
	//Uart_Printf("\nIIS Master Clock Source => MPLLin\n");
    Uart_Printf("\nSelect Speaker Amplifer Enable or Disable\n");
	Uart_Printf("0:Disable, 1:Enable\n");
	sel = Uart_GetIntNum();
   	switch(sel)
   		{
   			case 0:
   				Speak_PowerUp(0);
   				break;	
   			case 1:
   				Speak_PowerUp(1);
   				break;
   				default:
   					break;
   		}
   	Uart_Printf("Press any key to exit!!!\n");
   	Uart_Getch();

   	rGPBCON=save_B;
   	rGPBUP=save_PB;
   	
}
void Play_Wave_Iis(void)
{
	Uart_Printf("\nPlay Wave File.\n");

    	IIS_Port_Init();

	Download_Wave_File();
	Select_IIS_Master_CLK();

	Speak_PowerUp(1);//YOYO
	
	Init1341(PLAY_IIS);
	IIS_PlayWave_DMA2(Buf + 0x30, size);

	Speak_PowerUp(0);//YOYO
	IIS_Port_Return();
    mute = 1;
}

//Record Sound using MIC
void Record_Sound_Iis(void)
{
	
	Uart_Printf("\nRecord Sound via MIC.\n");

    	IIS_Port_Init(); 
	Select_IIS_Master_CLK();
	
	Init1341(RECORD_IIS);

	rec_buf = (unsigned char *)0x31000000;
	IIS_RecSound_DMA1(rec_buf, REC_LEN_IIS);

      	////////////////////////////////////////////////////////////////////////
	
	Init1341(PLAY_IIS);
	IIS_PlayWave_DMA2(rec_buf, REC_LEN_IIS);

	IIS_Port_Return();
	
	mute = 1;
}


/* Sub-Routines */ 

//Setting Port related to IIS  
void IIS_Port_Init(void)
{
	save_B  = rGPBCON;	 
    	save_E  = rGPECON;	 
    	save_PB = rGPBUP;
    	save_PE = rGPEUP;
    	
	//----------------------------------------------------------
	//   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 IIS_Port_Return(void)
{
	rGPBCON = save_B;
    	rGPECON = save_E;
    	rGPBUP  = save_PB;
    	rGPEUP  = save_PE;
}

void Download_Wave_File(void)
{
	unsigned int temp,i;
	
    	pISR_UART1 = (unsigned)RxInt_YOYO;

    	rINTMSK    = ~(BIT_UART1);
    	rINTSUBMSK = ~(BIT_SUB_RXD1);

    	//Non-cacheable area = 0x31000000 ~ 0x33feffff
    	Buf   = (unsigned char *)0x31000000;
    	_temp = Buf;

       Uart_Printf("\n\nDownload the PCM(no ADPCM) file by DNW serial port(With header)!!\n");
       Uart_Printf("Download Start Address: 0x%x\n", Buf);

       while(((unsigned int)_temp - (unsigned int)Buf) < 0x30)
       {
   	 	Led_Display(0);
   	  	Delay(1500);
   	  	Led_Display(15);
   		Delay(1500);
       }

	   //fIND FILE HEADER MARK	YOYO	
	   for (i=0;i<10;i++)	
	   	{
	   		if(*Buf =='R' && *(Buf+1)=='I' && *(Buf+2) =='F' && *(Buf+3) == 'F') break;
	   		Buf++;
	   	}
       Uart_Printf("Bytes: 0x%x 0x%x 0x%x 0x%x\n",*(Buf+7),*(Buf+6),*(Buf+5),*(Buf+4));
       size = *(Buf+4) | *(Buf + 5)<<8 | *(Buf + 6)<<16 | *(Buf + 7)<<24;
      // Buf=Buf+4;
       Uart_Printf("Total file size:0x%x",size);
       
       Uart_Printf("\nNow, Downloading... [ File Size : %7d  	    0]", size);
		temp =size;

      	fs=0;
    	while(((unsigned int)_temp - (unsigned int)Buf) < size) 
    	{
	  	Uart_Printf("\b\b\b\b\b\b\b\b%7d ",(unsigned int)_temp - (unsigned int)Buf);
		Delay(5000);
		fs++;
		if(fs>0x60000)
			{
				fs=0;
				break;
			}
    	}
    	Uart_Printf("\b\b\b\b\b\b\b\b%7d ]\n",(unsigned int)_temp - (unsigned int)Buf);
    	
		Delay(5000);
		rINTSUBMSK |= BIT_SUB_RXD1;
   		rINTMSK |= BIT_UART1;
   		
       size = *(Buf + 0x28) | *(Buf + 0x29)<<8 | *(Buf + 0x2a)<<16 | *(Buf + 0x2b)<<24;
       size = (size>>1)<<1;
       //size = temp -0x30;

       fs   = *(Buf + 0x18) | *(Buf + 0x19)<<8;
	  channel=*(Buf+0x16);
	  
      Data_Transfer_Rate=*(Buf + 0x1c) | *(Buf + 0x1d)<<8 | *(Buf + 0x1e)<<16 | *(Buf + 0x1f)<<24;
	  Data_Block_Size=*(Buf + 0x20) | *(Buf + 0x21)<<8;
		if(channel)
			{
	 			 Data_Unit_size= Data_Block_Size*8/channel;
			}	 
       Uart_Printf("PCM File Data Size = %d\n", size);
       Uart_Printf("Sampling Frequency of PCM data = %d Hz\n", fs);
	   Uart_Printf("Channel = %d\n",channel);
	   Uart_Printf("Data Transfer Baud Rate = %d\n", Data_Transfer_Rate);
	   Uart_Printf("Data Unit Length = %d bits\n",Data_Unit_size);
	   Uart_Printf("Data Bit Rate = %d bit/s",Data_Transfer_Rate/(channel*(Data_Unit_size/8)));
}

void IIS_RecSound_DMA1(unsigned char *start_addr, U32 rec_size)
{
	pISR_DMA1  = (unsigned)DMA1_Rec_Done;

	if (IIS_MasterClk_Sel == 0)	//IIS Master Clock Source = PCLK
      	{

⌨️ 快捷键说明

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