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

📄 uda1431.c

📁 arm7 的音乐播放程序
💻 C
字号:
#include "def.h"
#include "44b.h"
#include "44blib.h"
#include "uda1431.h"

void L3AddMode(U8 data)
{	
	U32 vPdat_D = 0x0;	//L3D=L	
    U32 vPdat_MC= 0x0;	//L3M=L & L3C=L
	int i,j;
	
//enter the AddMode

 	rPDATB =vPdat_MC;	   	//L3M=L
	rPDATB |= L3C;			//L3C=H
	
	for(j=0;j<4;j++);			//tsu(L3) > 190ns
	
 //next send 8 bits data
  	for(i=0;i<8;i++)
	{
	if(data&0x01)		//data bit is H
		{
		rPDATB=vPdat_MC;
		rPDATA = L3D;	//L3D=H	
		
		for(j=0;j<4;j++);	//tcy(L3) > 300ns
	    
	    rPDATB = L3C;	//L3C=H 
	    rPDATA = L3D;	//L3D=H 
	    
	    for(j=0;j<4;j++);	//tcy(L3) > 300ns  
		}
/*
控制信息的传入可以分为两个步骤:
	L3C-->Low  L3D-->Input
	L3C-->High L3D-->ReInput
*/		
	else				//data bit is L
		{
		rPDATB=vPdat_MC;
		rPDATA =vPdat_D;	//L3D=L
		
		for(j=0;j<4;j++);	//tcy(L3) > 300ns
	    
	    rPDATB = L3C;	//L3C=H 
	    rPDATA = vPdat_D;	//L3D=H 
	    
	    for(j=0;j<4;j++);	//tcy(L3) > 300ns  
		
		}	
	data>>=1;			
	}
//Address Mode is over
	 rPDATB=L3C|L3M;	//L3M=H,L3C=H	
}


void L3DataMode(U8 data)
{	
	U32 vPdata = 0x0;   //L3D=L
	int i,j;
	
//enter the DataMode
	rPDATB=L3C|L3M;
	for(j=0;j<4;j++);
	
//Begin transfer the data
	for(i=0;i<8;i++)
	{
	  if(data&0x1)
		{
		rPDATB=L3M;		//L3C=L
        rPDATA=L3D;		//L3D=H
        
        for(j=0;j<4;j++);
        
        rPDATB=L3C|L3M;	//L3C=H        					
        rPDATA=L3D; 	//L3D=H
        
        for(j=0;j<4;j++);       
		}
		
	  else
		 {
		 rPDATB=L3M;	//L3C=L
         rPDATA=vPdata;	//L3D=L
         
         for(j=0;j<4;j++);
          
         rPDATB=L3C|L3M;	//L3C=H
         rPDATA=vPdata;		//L3D=L
         for(j=0;j<4;j++);
		 }
		data>>=1;
	}	
//Ending the transfer	
	rPDATG=L3C|L3M;	//L3M=H,L3C=H	
}


void Init1341()
{

//1341's L3 interface L3DATA: GPA9	L3MODE: GPB4	L3CLOCK:GPB5
	rPCONA = 0x1ff;	//0-->OutPut
	rPCONB = 0x7cf;	//0-->OutPut
	
//L3 control 1341 Section Two	
	// in FS441KHZ condition

///In Statue 	Just to do RESET,256FS
	L3AddMode(0x16);	//UDA N0:000101 reg NO:10
	L3DataMode(0x60);	//1,10,0,000
	/*Reset ,256fs ,No DC-filter,iis */
	
	L3AddMode(0x16);
	L3DataMode(0x20);	//0,10,0,000
	/*No Reset ,256fs ,No DC-filter,iis */
	
//In Data0
 	L3AddMode(0x14);
 	L3DataMode(0x18);			//Setting the Volume

//In Statue 	
 	L3AddMode(0x14);
 	L3DataMode(0x83);			//1,0,0,0 0,0,11		
 	/*No OGS,No IGS,ADC_in,DAC_in,DS_in,PC_ON*/
}



void Play_Wave(U8 *Music_Buffer)	//Get Point Music_Buffer and Play it
{	
	U32 save_B,save_C,save_E,save_A,save_PC,save_PE;	
	S16 *temp_pos;			//Playing the milestone
				
	int j;
	
	U32 MusicSize;

		
	S16 *pWav;	//To get the WAV info
	S16 *pWave;	//To get the size of the Music 		

	/*Show some INFO about this WAV*/
			
	pWav=(S16*)Music_Buffer;
	
	pWav=pWav+0x14/2;			//实际地址 要求除以2,大概是由于一个单位 2个字节
//IF  PCM WAV	
	if(*pWav==WAVE_FORMAT_PCM) {		
		Uart_Printf("You play PCM format!\n");
	}
	else return;
	
	pWav=pWav+0x2/2;
//IF stereo mode
	if(*pWav==WAVE_FORMAT_SE) {					
		Uart_Printf("You play stereo wave \n");
	}
	else return;
	
//Get music size
	pWave=(S16*)Music_Buffer;
	pWave+=0x28/2;
	
	MusicSize=*pWave;					//0xaae0
	pWave+=0x1;							//0x0015
	MusicSize=(MusicSize<<16)>>16;		//ri !!!!!  clear 0
	
	MusicSize=*(pWave+0)<<16 | MusicSize;
	
	Uart_Printf("The MusicSize is 0x%x\n",MusicSize);
	
//Get the Starting point(Setting the temp_pos to data starting)
	pWave+=1;
	temp_pos=pWave;
	Uart_Printf("The data begin at 0x%x\n",temp_pos);
	
	/*环境设置*/
	
//Saving old setting
	save_A=rPCONA;//L3DATA   
    save_C=rPCONC;//IIS port
    save_E=rPCONE;//CODEC clk GPE8
    save_B=rPCONB;//L3CLK,L3MOD
    save_PC=rPUPC;
    save_PE=rPUPE;

//Setting new para

  	///Setting the MCLK	
	ChangePllValue(0x69,0x17,0x0);//MCLK=45.1584MHz <-- 5.6448MHz*8
	/*Maybe : Setting the PLL is same as setting the MCLK by cazy*/
	
	///UART show
	Uart_Init(45200000,115200);
	Uart_Printf("\nWAV playing programme.By cazy\n");

	
	///PortC
	rPCONC |=0xff;			//enable the IIS begin
    rPUPC |= 0xf;
    
    ///CODECLK 
    rPCONE=(rPCONE&0xffff)+(2<<16); //PE8:CODECLK
        
    rNCACHBE0= ((int)Music_Buffer>>12) + ( (((int)Music_Buffer>>12) +0x100)<<16 );
    //No-Cache Area Addtional
    
    /*Setting the 1341*/   	
    Init1341();
 		   	
   /****** IIS Initialize ******/
   
    rIISCON=0x02;	//disable all the DMA ,prescaler enable
    rIISMOD=0x89;	//Mode selecct,Tx,L-ch Low,IIS,16bit,CODECLOCK 256fs,32fs
   
   	rIISPSR=0x11;	//Setting the prescale	//New 0x33
   	rIISFCON=0x200;	//Normal,Tx FIFO enable
//Begin playing INFO   
    Uart_Printf("\nNow play the wave file ...");
    
    
   /****** IIS Tx Start ********/
   
   	rIISCON |=0x1; 	//Enable the IIS    
    
    for(j=0;j<MusicSize;j+=2)		//16bit
    {
    	while(!IIS_FIFOTxREADY);	//wait until IIS_FIFTxReady    	
    	*rIISFIF = *temp_pos++;    	
    }
	
	
	/****** IIS Tx Stop ******/
    rIISCON=0x0;	//IIS stop
    
    Cache_Flush();	//? cache funcation??
    
    rNCACHBE0=0x0;	
    
    rPCONA=save_A;
    rPCONB=save_B;
    rPCONC=save_C;
    rPCONE=save_E;    
    rPUPC=save_PC;
    rPUPE=save_PE;
    
    rINTMSK=BIT_GLOBAL;
    ChangePllValue(0x38,0x8,0x0);
    Uart_Init(0,115200);
}


⌨️ 快捷键说明

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