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

📄 iis.c

📁 S3C244A + ADS 控制i2s 的驱动
💻 C
字号:
/*=================================================

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

#include "2440addr.h"

#include "def.h"
#include "iis.h"
#include "WindowsXP_Wav.h"		//长度为243552个字节
#include "uart.h"

 

#define L3C (1<<4)		  //GPB4 = L3CLOCK
#define L3D (1<<3)		  //GPB3 = L3DATA
#define L3M (1<<2)		  //GPB2 = L3MODE

int downloadAddress;   


void Play_Wave_Iis(void)
{
	unsigned char *buf;
	unsigned int i;
	unsigned int downloadSize = 243552;
	


    IIS_Port_Init();
    IIS_Init();

		 
  	buf = (unsigned char *)0x30200000;
		
  	for( i = 0; i < 243552; i++ )  
	   {
	      buf[i] = WindowsXP_Wav[i] ;
	   }

	 Init1341();  
	 IIS_PlayWave_DMA2(buf, downloadSize);
	 IIS_Start();
    

}



void IIS_Port_Init(void)
{

 
    rGPBUP  = 0xff; 
    rGPBCON &= ~((0xf<<5)|(1<<4));
    rGPBCON |= ((10<<5)|(1<<4));
    

    rGPEUP  = 0xff;
    rGPECON &= ~(0x3fff);
    rGPECON |= (0x2aa);

       
}



void IIS_PlayWave_DMA2(unsigned char *start_addr, int play_size) 

{	
	
	rDISRC2  = (int)start_addr;
    rDISRCC2 = 0x00;
    rDIDST2  = 0x55000010;
                                
	rDIDSTC2 = 0x3;
								
	rDCON2   = ((1<<31)|(1<<23)|(0<<22)|(1<<20)|(play_size/2));
										                                       
    rDMASKTRIG2 = 0x2;
    


	 	
	
}

void IIS_Init(void)
{


    rIISCON &= ~(0x3f);
    rIISCON |= ((2<<4)|(3<<1));
 
    rIISMOD &= ~(0xff);
    rIISMOD |= ((0x8<<4)|(0x9));
  
    rIISFCON = ((1<<15)|(1<<13)|(1<<12));

    rIISPSR = ((5<<5)|5);

}

void IIS_Start(void)
{
    rIISCON |= (1<<0);

}


void Init1341(void)
{
   
      rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C); //Start condition : L3M=H, L3C=H     =***1 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)

	           //L3 Interface
      _WrL3Addr(0x14 + 2);     //STATUS (000101xx+10)   =22 =000101 10
    	       //_WrL3Data(0x60,0);	 //0,1,10, 000,0 :    Status 0,      Reset, 256fs,IIS-bus,no DC-filtering
	  _WrL3Data(0x60);	 //0,1,01, 000,0 : Status 0,Reset, 384fs,IIS-bus,no DC-filtering
	 
    	    
    
     _WrL3Addr(0x14 + 2);     //STATUS (000101xx+10)
     _WrL3Data(0x81);	 //bit[7:0] => 1,0,0,0, 0,0,01 
	                     //Status 1,      Gain of DAC 0 dB,Gain of ADC 0dB,ADC non-inverting,DAC non-inverting
	                    //Single speed playback,AD/C-Off DAC-On
    
     _WrL3Addr(0x14 + 0);
	 _WrL3Data(0x0);
}


void _WrL3Addr(char data)
{	
    unsigned int i;
    unsigned int j;
  
    rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C);
   
    for(i = 0;i < 25;i++);
   
    rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) | L3C;
   
    for(i = 0;i < 25;i++);
    UartPuts("hello world11\n");//
   
    for(j = 0;j < 8;j++)
   
    {
      
   
       if(data&0x01)
         {
           rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) | (L3D);
          
           for(i = 0;i < 25;i++);

		   rGPBDAT = rGPBDAT |(L3C)|(L3D);

		   for(i = 0;i < 25;i++);
	   
         }
        
       else
        {
          
          rGPBDAT &= ~L3C;
          rGPBDAT &= ~L3D;
          
          for(i = 0;i < 25;i++);

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

		  for(i = 0;i < 25;i++);
		  
        }
        
         data>>=1;
         
         UartPuts("hello world22\n");//
  } 
  
     rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C);
     
      for(i = 0;i < 25;i++){}  
 
}



void _WrL3Data(char data)  //(0x60)
{
  
   unsigned int i;
   unsigned int j;
 
   rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C);
   for(i = 0;i < 25;i++);
   
   rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3C);
   
   for(i = 0;i < 25;i++);
   
   rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) | (L3C|L3M);
   
   for(i = 0;i < 25;i++);
  
   UartPuts("hello world33\n");//
   
   for(j=0;j<8;j++)
   {
       
      if(data & 0x01)
        {
          rGPBDAT &=  ~L3C;
          rGPBDAT |= L3D;
         
          for(i = 0;i < 25;i++);

		  rGPBDAT |= (L3C|L3D);
          
          for(i = 0;i < 25;i++);
         
         }
        
        else
        {
          
          rGPBDAT &= ~L3C;
          rGPBDAT &= ~L3D;
          
          for(i = 0;i < 25;i++);

		  rGPBDAT |= L3C;
		  rGPBDAT &= ~L3D;

		  for(i = 0;i < 25;i++);
        
        }

		  data >>= 1;
		 
		  UartPuts("hello world44\n");//
   
   }

     rGPBDAT  = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);
     
     for(i = 0;i < 25;i++){}
     
     UartPuts("hello world55\n");
    
 
 
  
}



⌨️ 快捷键说明

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