STM32 PCM1770調試

本文初步介紹了PCM1770配置方法與調試過程,希望能起到拋磚引玉的作用。

PCM1770是24位的DAC,支持I2S信號輸入,可直接驅動耳機,也可加後級功放來驅動喇叭,應用電壓範圍爲-0.3V至4V,普通的3V3就可以。

     如圖1所示,該DAC對22KHZ以上頻率有60dB的衰減,相當於自帶一個低通濾波,減少了後級的干擾。

     如圖2所示,該DAC在3V3電壓條件下有100dB的信噪比,72dB的分離度確實低了點,用來玩玩還行。

                                                                                                                              圖1


                                                                                                                            圖2


接下來講PCM1770的上電時序,芯片手冊中如圖3對上電時序描寫的很清楚,就是在VCC起來至少1ms之後,將PD引腳拉高,在1024個內部系統時鐘後,芯片內部會自動復位,之後雙輸出會拉高表示復位成功。可以利用GPIO進行PD的操作,也可利用單片機內部的Reset引腳進行硬件復位,我採用了第二種方法,復位電路如圖4,時序如圖5,CH1是RESET端(PD),CH2是VCC,可見,PD拉高是在VCC拉高1.2ms之後,滿足PCM1770的復位時序要求。


                                                                                                     圖3
  

                                     圖4                                                                                                                                     圖5


        再來看看PCM1770的配置寄存器和寄存器的寫入時序,常用到的寄存器如圖6,關於軟件靜音、音量衰減、模擬混合等功能可按自己的需求去配置,因爲我們用到的數據傳輸格式爲I2S,故在這裏必須要配置音頻數據傳輸格式選擇寄存器,由圖7可得,輸出傳輸數據協議的選擇主要是配置FMT寄存器的3個位,使用I2S進行數據傳輸需將FMT配置爲001,從圖6看出FMT的3個位位於寄存器3,地址爲03h,因此可知要寫入數據爲0000 0011 0000 0001b。


                                                                                                                            圖6

                                                                                                                           圖7

                                                                                                                           圖8


                                                                                                                          圖9
       

      寄存器的寫入時序如圖8和圖9,圖8對其進行了簡單的描述,就是指MS拉低,MC作爲時鐘運行,MD發送16位的數據,前8位爲寫入寄存器的地址,後8位爲寫入的數據;圖9對時序進行了詳細的規定,對此編寫的簡單代碼如下。

void init_hardware(){
int i=15;
GPIO_ResetBits(GPIOC, GPIO_Pin_10);//MC
delay_nms(2);
GPIO_ResetBits(GPIOC, GPIO_Pin_7);//MS
delay_nms(2);
  while(i>=0){
delay_nms(1);
  GPIO_ResetBits(GPIOC, GPIO_Pin_10);//第1次上升沿
if(i==0){
GPIO_SetBits(GPIOC, GPIO_Pin_12);
  }else if(i==9){
GPIO_SetBits(GPIOC, GPIO_Pin_12);
}else if(i==8){
  GPIO_SetBits(GPIOC, GPIO_Pin_12);
}else{
  GPIO_ResetBits(GPIOC, GPIO_Pin_12);
}
delay_nms(1);
GPIO_SetBits(GPIOC, GPIO_Pin_10);
i--;
}
GPIO_SetBits(GPIOC, GPIO_Pin_12);//MD
delay_nms(2);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章