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

📄 iis.h

📁 利用IIS总线实现音频播放的功能实验代码
💻 H
字号:
#include "string.h"
#include "vxworks.h"
#include "s3c2410.h"
#include "2410lib.h"
#include "def.h"
#include "2410iis.h"
#include "s3c2410sio.h"

void ChangeDMA2(void);
void IIS_PortSetting(void);
void Test_Iis(void);
void Record_Iis(void);
void _WrL3Addr(U8 data);
void _WrL3Data(U8 data,int halt);
void DMA2_Done(void);
void DMA2_Rec_Done(void);
void RxInt(void);
void Muting(void);
void TR_Done(void);

#define L3C (1<<4)              
#define L3D (1<<3)              
#define L3M (1<<2)              

#define PLAY    0
#define RECORD  1
/*#define REC_LEN 0x50000 */       
#define REC_LEN 0x100000         

#define DataCount   0x10000     
#define DataDisplay 0x100       
/*#define DataDisplay 0x10000     
//#define DataCount   0x100 */      

#define PollMode    0          
#define DMA2Mode    1          

unsigned char  *Buf,*_temp;
unsigned short *rec_buf;

volatile unsigned int size = 0;
volatile unsigned int   fs = 0;
volatile char    which_Buf = 1;
volatile char     Rec_Done = 0;
volatile char         mute = 1;





/**************** [ Record_Iis ] ***************************************/
void Record_Iis(void)
{
    unsigned int save_B, save_E, save_PB, save_PE;

    Uart_TxEmpty(0);

    ChangeClockDivider(1,1);        
    ChangeMPllValue(0x96,0x5,0x1); 

    Uart_Init(33857142,115200);
    
    Uart_Printf("[ Record test using UDA1341 ]\n");
    
    save_B  = rGPBCON;       
    save_E  = rGPECON;       
    save_PB = rGPBUP;
    save_PE = rGPEUP;

    IIS_PortSetting();
     
    rec_buf = (unsigned short *)0x31000000;

    pISR_DMA2  = (unsigned)DMA2_Rec_Done;
    pISR_EINT0 = (unsigned)Muting;

    rINTMSK = ~(BIT_DMA2);

    Init1341(RECORD);

      
    rDISRCC2 = (1<<1) + (1<<0);                         
    rDISRC2  = ((U32)IISFIFO);                          
    rDIDSTC2 = (0<<1) + (0<<0);                         
    rDIDST2  = (int)rec_buf;                            
    rDCON2   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(1<<24)+(1<<23)+(1<<22)+(1<<20)+REC_LEN;
      
    rDMASKTRIG2 = (0<<2) + (1<<1) + 0;   

      
    rIISMOD = (0<<8) + (1<<6) + (0<<5) + (0<<4) + (1<<3) + (0<<2) + (1<<0);
    rIISPSR = (2<<5) + 2; 
    rIISCON = (0<<5) + (1<<4) + (1<<3) + (0<<2) + (1<<1);
     
    rIISFCON = (1<<14) + (1<<12);     

    Uart_Printf("Press any key to start record!!!\n");
    Uart_Getch();
    Uart_Printf("Recording...\n");

     
    rIISCON |= 0x1;

    while(!Rec_Done);

    rINTMSK  = BIT_DMA2;
    Rec_Done = 0;

      
    Delay(10);                        
    rIISCON     = 0x0;                 
    rDMASKTRIG2 = (1<<2);               
    rIISFCON    = 0x0;                 
    
    Uart_Printf("End of Record!!!\n");
    Uart_Printf("Press any key to play recorded data\n");
    Uart_Printf("If you want to mute or no mute push the 'EIN0' key repeatedly\n");
    Uart_Getch();

    size = REC_LEN * 2;
    Uart_Printf("Size = %d\n",size);

    Init1341(PLAY);

    pISR_DMA2 = (unsigned)DMA2_Done;
    rINTMSK   = ~(BIT_DMA2 | BIT_EINT0);

      
    rDISRCC2 = (0<<1) + (0<<0);                        
    rDISRC2  = (int)rec_buf;                           
    rDIDSTC2 = (1<<1) + (1<<0);                         
    rDIDST2  = ((U32)IISFIFO);                         
    rDCON2   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(0<<22)+(1<<20)+(size/2);
     
    rDMASKTRIG2 = (0<<2)+(1<<1)+0;    

      
    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);
     
    rIISFCON = (1<<15) + (1<<13);      

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

    rIISCON |= 0x1;                   
    while(!Uart_GetKey());

     
    Delay(10);               
    rIISCON     = 0x0;      
    rDMASKTRIG2 = (1<<2);    
    rIISFCON    = 0x0;       

    size = 0;

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

    rINTMSK = (BIT_DMA2 | BIT_EINT0);
    
    ChangeMPllValue(0xa1,0x3,0x1);              
    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); 
    rGPBUP  = rGPBUP  & ~(0x7<<2) |(0x7<<2);         
    rGPBCON = rGPBCON & ~(0x3f<<4) |(0x15<<4);     

      
    _WrL3Addr(0x14 + 2);     
    _WrL3Data(0x60,0);      

    _WrL3Addr(0x14 + 2);     
    _WrL3Data(0x20,0);       
    
    _WrL3Addr(0x14 + 2);    
    _WrL3Data(0x81,0);    */
     rGPBCON = rGPBCON & ~((1<<9)|(1<<7)|(1<<5)) | (1<<8)|(1<<6)|(1<<4); 
	rGPBUP  = rGPBUP  |(0x7<<2);       
   rGPBDAT |= (L3M);											
	rGPBDAT |= (L3C);   
                                    	
    _WrL3Addr(0x14+2);				
   _WrL3Data(0x50,0); 				
    _WrL3Addr(0x14+2); 			
    _WrL3Data(0x10,0); 			
                                   	

    _WrL3Addr(0x14+2); 				
    _WrL3Data(0x81,0);				
  /*  _WrL3Addr(0x14+0); 			
   _WrL3Data(0x0A,0);  */         	   
                            
    
     
    if(mode)
    {
        _WrL3Addr(0x14 + 2);    
/*        _WrL3Data(0xa2,0);      //1,0,1,0, 0,0,10 
                                //Status 1,Gain of DAC 0 dB,Gain of ADC 6dB,ADC non-inverting,DAC non-inverting
                                //,Single speed playback,ADC-On DAC-Off  */     
                                
        _WrL3Data(0xe3,0);      /*1,1,1,0, 0,0,11 
                                //Status 1,Gain of DAC 6 dB,Gain of ADC 6dB,ADC non-inverting,DAC non-inverting
                                //,Single speed playback,ADC-On DAC-On                                   

//        _WrL3Addr(0x14 + 0);    //DATA0 (000101xx+00)
//        _WrL3Data(0x3f,0);      //00,11 1111  : Volume control (6 bits)  
//        _WrL3Data(0x00,0);      //00,00 0000  : Volume control (6 bits) 0dB  */  

        _WrL3Addr(0x14 + 0);    
        _WrL3Data(0x7b,0);                

   
        _WrL3Data(0xc4,0);      
        _WrL3Data(0x91,0);                                    


        _WrL3Data(0xc2,0);     
/*       _WrL3Data(0x4d,0);      //010,0 11,01 : DATA0, MIC Amplifier Gain 9dB, input channel 1 select(input channel 2 off) */
        _WrL3Data(0x59,0);      
    }

}

void ChangeDMA2(void)
{
    if(which_Buf)
    {
        rDISRCC2 = (0<<1) + (0<<0);                         
        rDISRC2  = (int)(Buf + 0x30);                       
    }
    else
    {
        rDISRCC2 = (0<<1) + (0<<0);                         
        rDISRC2  = (int)(Buf + 0x30+(size/2));              
    }
}


void IIS_PortSetting(void)
{
 
    rGPBUP  = rGPBUP  & ~(0x7<<2) | (0x7<<2);   
    rGPBCON = rGPBCON & ~(0x3f<<4) | (0x15<<4); 


    rGPEUP  = rGPEUP  & ~(0x1f)  | 0x1f;    
    rGPECON = rGPECON & ~(0x3ff) | 0x2aa;   

    rGPFUP   = ((rGPFUP   & ~(1<<0)) | (1<<0));     
    rGPFCON  = ((rGPFCON  & ~(3<<0)) | (1<<1));       
    
    rEXTINT0 = ((rEXTINT0 & ~(7<<0)) | (2<<0));      
}


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

    rGPBDAT  = rGPBDAT & ~(L3D | L3M | L3C) | L3C;

    for(j=0;j<4;j++);                   

    for(i=0;i<8;i++)                    
    {
        if(data & 0x1)                 
        {
            rGPBDAT &= ~L3C;            
            rGPBDAT |= L3D;                         
            for(j=0;j<4;j++);          
            rGPBDAT |= L3C;             
            rGPBDAT |= L3D;             
            for(j=0;j<4;j++);           
        }
        else                           
        {
            rGPBDAT &= ~L3C;            
            rGPBDAT &= ~L3D;            
            for(j=0;j<4;j++);           
            rGPBDAT |= L3C;            
            rGPBDAT &= ~L3D;            
            for(j=0;j<4;j++);                      
        }
        data >>= 1;
    }
    rGPBDAT  = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);  
}


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

    if(halt)
    {
        rGPBDAT  = rGPBDAT & ~(L3D | L3M | L3C) | L3C;        
        for(j=0;j<4;j++);                               
    }

    rGPBDAT  = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);           
    for(j=0;j<4;j++);                                        

     
    for(i=0;i<8;i++)
    {
        if(data & 0x1)                  
        {
           rGPBDAT &= ~L3C;              
           rGPBDAT |= L3D;               
           for(j=0;j<4;j++);           
           rGPBDAT |= (L3C | L3D);      
           for(j=0;j<4;j++);             
        }
        else                            
        {
           rGPBDAT &= ~L3C;              
           rGPBDAT &= ~L3D;              
           for(j=0;j<4;j++);             
           rGPBDAT |= L3C;              
           rGPBDAT &= ~L3D;             
           for(j=0;j<4;j++);             
        }
        data >>= 1;                     
    }
    rGPBDAT  = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M); 
}


void DMA2_Done(void)
{
    ClearPending(BIT_DMA2);

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

void DMA2_Rec_Done(void)
{
    ClearPending(BIT_DMA2);     
    Rec_Done = 1;
}


void RxInt(void)
{
    rSUBSRCPND = BIT_SUB_RXD0;
    rSUBSRCPND;
    ClearPending(BIT_UART0);

    *_temp ++= RdURXH0(); 
}


void Muting(void)
{
    ClearPending(BIT_EINT0);        

    if(mute)   
    {
        _WrL3Addr(0x14 + 0);        
        _WrL3Data(0xa4,0);    
        mute = 0;
        Uart_Printf("= Mute =\n");
    }
    else       
    {
        _WrL3Addr(0x14 + 0);            
        _WrL3Data(0xa0,0);             
        mute = 1;
        Uart_Printf("= No Mute =\n");
    }
}


volatile int Tx_Done;
volatile int Rx_Done;

void TR_Done(void)
{
    ClearPending(BIT_DMA2);     

    Rx_Done = 1;
    Tx_Done = 1;
/*   WrUTXH0('.');*/
}

void Iis_Tx(void)
{
    unsigned int i, j;
    unsigned short *txdata;

    Tx_Done = 0;
    Uart_TxEmpty(0);

    Uart_Printf("[ IIS Slave Tx test ]\n");

    IIS_PortSetting();

      
    txdata = (unsigned short *)0x31000000;
    
    for(i=0;i<DataCount;i++)
        *(txdata+i) = i;    

      
    rIISMOD  = (1<<8) + (2<<6) + (0<<5) + (1<<4) + (1<<3) + (0<<2) + (1<<0);
    rIISPSR  = (2<<5) + 2;              
    rIISFCON = (0<<15) + (1<<13);         
     
    rIISCON  = (0<<5) + (0<<4) + (0<<3) + (1<<2) + (1<<1) + (0<<0);            
   
      
    rIISCON |=0x1;
    
    for(i=0;i<DataCount;i++)
    {
        while( (rIISCON & 0x080) == 0x80 );    
        *IISFIFO = *(txdata+i);                      
    }

    
    Delay(10);
    rIISCON     = 0x0;         
    rDMASKTRIG2 = (1<<2);       
    rIISFCON    = 0x0;         

    Uart_Printf("\nTx End...\n");

    Uart_Printf("Last 256 Half-Word in 65KBytes transferred data\n");
    
    for(i=0;i<DataDisplay;i++)
    {
        Uart_Printf("0x%x=",(txdata+0xff00+i));
        Uart_Printf("%04x   ",*(txdata+0xff00+i));        
    }
}
  

void Iis_Rx(void)
{
    unsigned int i, j, k, count;
    unsigned short *rxdata;

    Rx_Done = 0;
    Uart_TxEmpty(0);

#if PollMode
    Uart_Printf("[ IIS Master Rx Polling mode test ]\n");
#endif

#if DMA2Mode
    Uart_Printf("[ IIS Master Rx DMA2 mode test ]\n");
#endif
   

    IIS_PortSetting();

    pISR_DMA2= (unsigned)TR_Done;
    rINTMSK  = ~(BIT_DMA2);

     
    rxdata=(unsigned short *)0x31000000;
    
    for(i=0;i<DataCount;i++)
        *(rxdata+i)=0x0;
        
#if DMA2Mode
     
    rDISRCC2 = (1<<1) + (1<<0);    
    rDISRC2  = ((U32)IISFIFO);     
    rDIDSTC2 = (0<<1) + (0<<0);     
    rDIDST2  = (int)rxdata;        
    rDCON2   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(1<<24)+(1<<23)+(1<<22)+(1<<20)+(DataCount);
      
    rDMASKTRIG2 = (0<<2)+(1<<1)+0;  
 
      
    rIISMOD  = (0<<8) + (1<<6) + (0<<5) + (1<<4) + (1<<3) + (0<<2) + (1<<0);
    rIISPSR  = (2<<5) + 2;            
    rIISFCON = (1<<14) + (1<<12);
    rIISCON  = (0<<5) + (1<<4) + (1<<3) + (0<<2) + (1<<1) + (0<<0);    
#endif

      

#if PollMode
      
    rIISMOD  = (0<<8) + (1<<6) + (0<<5) + (1<<4) + (1<<3) + (0<<2) + (1<<0);
    rIISPSR  = (2<<5) + 2;            
    rIISFCON = (0<<14) + (1<<12);     
    rIISCON  = (0<<5) + (0<<4) + (1<<3) + (0<<2) + (1<<1) + (0<<0);    
#endif

      
    rIISCON |= 0x1;

#if PollMode       
    count = DataCount;                 
    while(0<count) 
    {
        j = rIISFCON & 0x1f;            
        if(j == 0)
        {
            while(!j)
                j = rIISFCON & 0x1f;    
         }
        
        for(i=0;i<j;i++)
        {
            count--;
            *rxdata++ = *IISFIFO;                   
        }
    }
#endif    

#if DMA2Mode  
    while(!Rx_Done);
#endif
    
     
    Delay(10);
    rIISCON     = 0x0;          
    rDMASKTRIG2 = (1<<2);       
    rIISFCON    = 0x0;          

    Uart_Printf("Last 256 Half-Word in 65KBytes received data\n");

    rxdata=(unsigned short *)0x31000000;  
    
    for(i=0;i<DataDisplay;i++)
    {
        Uart_Printf("0x%x=", (rxdata+0xff00+i));        
        Uart_Printf("%04x   ",*(rxdata+0xff00+i));                
    }
    rINTMSK = (BIT_DMA2);
}

⌨️ 快捷键说明

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