久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

UDA1341TS驅動程序

作者:佚名   來源:本站原創   點擊數:  更新時間:2014年04月21日   【字體:
雖然濾波器的設置上還不是那么完美,但應該也算是于征服了UDA1341TS。這個驅動做了很久一直在用串口監測錄音數據,但由于噪聲的影響, 一直不知怎么回事,今天算是大功告成了,甚是開心,決定把代碼貼出來做個慶祝,同時希望后學者能用得上。直管coppy不會介意的。注解:端口初始化函數 (uda_io_init())L3操作函數(WriteL3())錄音函數(record())播放函數(playsound())。提示:時鐘要知道 怎么設置(我使用MDK的啟動代碼設置了)對照S3C2440A 和UDA1341TS的datasheet來設置IIS和L3問題不大了,我這個驅動沒有使用DMA,而是通過CPU來讀寫的,不用多說了,我想你懂的。

/*L3MODE:J7(GPB2);L3DATA:K3(GPB3);L3CLOCK:K4(GPB4)*/
#define L3MODE  (1<<2)    
#define L3DATA   (1<<3)    
#define L3CLOCK  (1<<4)
//**********uda1341ts端口初始化
void uda_io_init()
{
 /*IISLRCLK=GPE0,IISSCLK=GPE1,CDCLK=GPE2,IISSDI=GPE3,IISSDO=GP4*/
 GPECON|=(1<<1)|(1<<3)|(1<<5)|(1<<7)|(1<<9);
 GPEUP|=(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);;
 
 GPBCON|=(1<<4)|(1<<6)|(1<<8);
 GPBUP|=(1<<4)|(1<<3)|(1<<2);
}   
//**********L3寫
void WriteL3(unsigned char data, unsigned char mode)
{    
 
 //mode = 0,地址模式;mode = 1,數據傳輸模式     
 int i, k;
 uda_io_init();   
 if(mode == 0)  //地址模式時序
 {    
    GPBDAT = GPBDAT & ~(L3MODE|L3DATA|L3CLOCK )|L3CLOCK;    
 }    
 else     //數據模式時序
 {    
    GPBDAT = GPBDAT & ~(L3MODE|L3DATA|L3CLOCK)|(L3CLOCK|L3MODE);       
 }
     
 for(k = 0; k < 5; k++);          //延時
    
 for(i = 0; i < 8; i++)
 {    
     if(data & 0x1)
  {    
         GPBDAT &= ~L3CLOCK;    
         GPBDAT |= L3DATA;          //發送高電平    
         for(k = 0; k < 5; k++);
          
         GPBDAT |= L3CLOCK;    
         GPBDAT |= L3DATA;    
         for(k = 0; k < 5; k++);    
     }    
     else
  {    
         GPBDAT &= ~L3CLOCK;    
         GPBDAT &= ~L3DATA;    //發送低電平  
         for(k = 0; k < 5; k++);
      
         GPBDAT |= L3CLOCK;    
         GPBDAT &= ~L3DATA;    
         for(k = 0; k < 5; k++);    
     }    
     data >>= 1;    
 }    
 GPBDAT = GPBDAT & ~(L3MODE|L3DATA|L3CLOCK)|(L3CLOCK|L3MODE);    
}
//**********記錄錄音止
void record()

   unsigned short int temp;
   unsigned int i,stop=0,count=0;
        
    GPBDAT = GPBDAT & ~(L3MODE|L3DATA|L3CLOCK)|(L3CLOCK|L3MODE);
    
    WriteL3(0x14+2,0);    
        
    WriteL3(0x60,1);   //復位  
        
    WriteL3(0x14+2,0);          
    WriteL3(0x10,1);     //00010000 系統時鐘頻率384fs
       
    WriteL3(0x14+2,0);         
    WriteL3(0xa2,1);    //10100010 輸入增益6db,ADC開,DAC關  
           
    WriteL3(0x14+0,0);  
    WriteL3(0x0,1);          //音量衰減0db    
   WriteL3(0x14+0,0);  
    WriteL3(0x7b,1);         //01,1110,11 (BB 18dB~24dB) Treble 6dB
 
   WriteL3(0x14+0,0);  
    WriteL3(0x90,1);         //采樣頻率為44.1khz  
     
    WriteL3(0xc0,1); 
    WriteL3(0xe0,1);         //000,00000 MA 0dB  
      
    WriteL3(0xc4,1); 
    WriteL3(0xf0,1);         //100,1,00,00 AGC使能          
     
    WriteL3(0xc2,1); 
    WriteL3(0xf9,1);         //010,110,11 MIC 27dB input 1選擇 通道2關閉
 
    WriteL3(0xc6,1); 
    WriteL3(0xe0,1);         //output lever -9db ATTACK TIME=11ms,DECAY TIME=100ms         
     
    /*IIS配置*/     
         
    IISCON = (0<<5)|(0<<4)|(1<<3)|(0<<2)|(1<<1);         //DMA禁止,在接受空閑狀態,不產生IISLRCK信號,IIS預分頻使能    
       
    IISMOD = (0<<9)|(0<<8)|(1<<6)|(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<0); //主設備時鐘PCLK,主設備模式,接收模式,串行數據16位,主時鐘是384fs,串行位時鐘32fs     
           
    IISPSR = (2<<5)|2;            //預分頻都是N=2    
         
    IISFCON = (0<<14)|(1<<12);       //發送FIFO正常,發送FIFO使能 
  
 IISCON|=(1<<0);      //iis開啟   
      
   while(stop==0)
   {
      if((IISCON & (1<<6))==0)          //檢查輸入FIFO是否為滿
      {    
         //FIFO中的數據為16位,深度為32
         //當輸入FIFO為滿時,一次性讀取FIFO中的32個16位數據
         for(i=0;i<32;i++)
         {
            temp=IISFIFO;
   record_buffer[count+2*i]=temp;
            record_buffer[count+2*i+1]=(temp>>8);
         }
   //IISFIFO=0;
         count+=64;
         if(count>500000)
         stop=1;                    //當錄制的數據超過數組長度時,退出         
  }
 }
 stop=0;
 IISCON = 0x0;               //關閉IIS
 GPBCON|=1;           //蜂鳴器輸出
 GPBDAT|=1;       //蜂鳴器輸出高點平
 delay_us(100);
 GPBDAT&=~(1<<0);     //蜂蜜輸出低電平
}

void playsound(unsigned char *buffer, int length)
{
 int count,i;
 
 char flag; 

 GPBDAT = GPBDAT & ~(L3MODE|L3CLOCK|L3DATA) |(L3MODE|L3CLOCK); //L3開始傳輸:L3M=H, L3C=H
 
 
 
 //配置UDA1341
 
 WriteL3(0x14 + 2,0);            //狀態模式(000101xx+10)
 
 WriteL3(0x60,1);          //0,1,10, 000,0 : 狀態0,復位
 
 
 
 WriteL3(0x14 + 2,0);            //狀態模式 (000101xx+10)
 
 WriteL3(0x10,1);          //0,0,01, 000,0 : 狀態0, 384fs,IIS,no DC-filtering
 
 
 
 WriteL3(0x14 + 2,0);     //狀態模式 (000101xx+10)
 
 WriteL3(0xc1,1);           //1,0,0,0, 0,0,01:狀態1,
 
 //Gain of DAC 6 dB,Gain of ADC 0dB,ADC non-inverting,
 
 //DAC non-inverting,Single speed playback,ADC-Off DAC-On
 
 
 
 //配置s3c2440的IIS寄存器
 
 //預分頻器為2,所以CDCLK=PCLK/(3+1)=16.928kHz
 
 IISPSR = 2<<5|2;
 
 //無效DMA,輸入空閑,預分頻器有效
 
 IISCON  = (0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1);   
 
 //PCLK為時鐘源,輸出模式,IIS模式,每個聲道16位,CODECLK=384fs,SCLK=32fs
 
 IISMOD  = (0<<9)|(0<<8)|(2<<6)|(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<0);     
 
 IISFCON = (0<<15)|(1<<13);           //輸出FIFO正常模式,輸出FIFO使能
 
 
 
 flag=1;
 
 count=0;
 
 //開啟IIS
 
 IISCON |= 0x1;
 
 while(flag)
 
 {
 
  if((IISCON & (1<<7))==0)               //檢查輸出FIFO是否為空
  
  {    
   
   //FIFO中的數據為16位,深度為32
   
   //當輸出FIFO為空時,一次性向FIFO寫入32個16位數據
   
   for(i=0;i<32;i++)
   
   {
   
    IISFIFO=(buffer[2*i+count])+(buffer[2*i+1+count]<<8);
   
   }                  
   
   count+=64;
   
   if(count>length)
   
   flag=0;                  //音頻數據傳輸完,則退出
  
  }
 
 }
 
 IISCON = 0x0;            //關閉IIS
}

關閉窗口

相關文章

主站蜘蛛池模板: 91女人18毛片水多国产 | 久久精品一区二区三区四区五区 | 成人午夜视频在线观看 | 亚洲视频免费看 | 免费福利片| 日韩精品免费观看 | 少妇高潮久久久久久潘金莲 | 一区二区小视频 | 在线一区二区三区四区 | 国产不卡视频 | 久久精品视频一区二区 | 狠狠干狠狠干 | 日韩小视频 | 无套内谢的新婚少妇国语播放 | 午夜天堂在线 | 欧美日韩第一区 | 日韩在线视频播放 | 亚洲一级黄色片 | 99视频免费观看 | 天堂国产| 福利视频二区 | 中文字幕偷拍 | 97超碰人人| 午夜你懂的| 亚洲国产精品va在线看黑人 | www.操| 日韩在线毛片 | av毛片网站 | 亚洲精品免费看 | 日本一级淫片 | 午夜黄视频 | 精品1区2区3区| 欧美成人一级 | 99在线精品视频 | 国产精品视频一区二区三区 | 久久色视频 | 日韩在线成人 | 97精品国产97久久久久久免费 | 播播激情网| 国产高清自拍视频 | 日韩精品在线观看视频 |