VS1003調試例程

開發工具 IAR

芯片:MSP430F5438

音頻模塊:VS1003B/VS1053

首先拿到之後,就像這到網上找一個別人做好的驅動直接用,(拿來主義)

找了一天無果,能找到的只是片段,或者芯片型號不對,中間也看了n多的文章介紹VS1003調試例程的,也看了幾個驅動.

大概瞭解.代碼不多.不是很複雜.

既然網上沒有可以,那就拿別人的開始移植.一頓查VS手冊,看別人項目的註釋,開發完了,測試完全沒聲音,什麼正玄波,什麼MP3 ,毛都沒一根....

我勒個乖乖.

開始分析 

首先 VS1003的幾個引腳,是否接錯,前後查了幾遍,甚至懷疑是不是DREQ 需要上拉電阻.

  中間還找了STM的一個開發板,使用ST的工程驗證了一下,STM板子上是可以工作的,和 DREQ 有沒有上拉電阻無關

然後開始懷疑 波特率的問題,把MPS430的手冊拿出來USCI從頭到尾查了一遍,VS1003上說明 

vs上電默認倍頻是1.0x    vs的板子上接晶振是 12.88Mhz的,那麼算完應該是不大於3M.  好了

開始調SPI的速率,調整到3M,沒聲音.

不再懷疑代碼問題了,開始懷疑人生了

代碼再次從頭到尾看一遍,沒問題,然後對照 stm32的驅動,發現 st的SPI速率調的很低.開始慢慢的降低速率,實際情況是SPI在操作 SCI的時候不能超過 400K.很關鍵,因爲超過了400K,主機發送的數據,從機是無法接收的.此乃問題所在

奇蹟出現了,可以正常播放 正玄波了.開心啊.但是開心的沒5分鐘.發現可以播放正玄波,但是播放MP3文件,茲的一下 DERQ就不在拉高了.

難道速度太快沒辦法播放完.

調整不論是 頻率調高調低,始終只能sin測試,而不能播放MP3文件.然後嘗試讀取寄存器數據,發現竟然讀取不到.

然後找了示波器,對 CS  DSC  SCLK MISO SIMO 進行測量,發現 SOMI的確數據不對,好先不管了,既然我能寫進去,那麼應該是正常的,再次翻閱VS的手冊.一個細節之前忽略了.:

 

SDI工作的時候 CS其實是爲高的  也就是說 在發送MP3數據的時候應該是把DSC拉低  CS拉高,(其實有點違背SPI cs片選的)

這點把自己坑慘了,期間懷疑是SMCLK和MCLK問題,修改把DCS和CS控制好,

再次測試,MP3可以正常播放了.此前仍然使用的是 400K以下的速率,發現聲音不流暢,嘗試將spi的速率調高,前提是需要使用SCI 將vs1003的03寄存器倍頻到3倍.到此mp3播放流程.

 

 

整個的使用流程:

 

  VS10XX_HardwareReset();//通過RES腳 重啓vs1003

    Mp3DeselectControl(); //拉高 CS腳
    Mp3DeselectData();//拉高DCS腳
    
    Mp3SelectData();       //打開數據片選,即開啓SDI傳  xDCS = 1,選擇VS10XX的數據接口
    SPI_Write_Byte(0xFF);
    SPI_Write_Byte(0xFF);
    SPI_Write_Byte(0xFF);
    SPI_Write_Byte(0xFF);
    Mp3DeselectData();        //關閉數據片選


    VS_Write_Reg(0,0x08,0x04);  //軟件復位,向0號寄存器寫入0x0804   SM_SDINEW爲1   SM_RESET爲1
    VS_Write_Reg(3,0x98,0x00);  //時鐘設置,向3號寄存器寫入0x9800   SC_MULT  爲4   SC_ADD  爲3   SC_FREQ爲0
    VS_Write_Reg(SPI_VOL   ,0x30,0x30);  //音量設置,向0B號寄存器 寫入  左聲道30 右聲道30  ---0x00,0x00左右聲道均最大音量
   
    Mp3SelectData();         //打開數據片選,注意此時XCS(命令片選)爲高電平,SDI有效
    SPI_Write_Byte(0);    //寫入數據,這裏寫入4個0,是無關數據,用來啓動數據傳輸
    SPI_Write_Byte(0);
    SPI_Write_Byte(0);
    SPI_Write_Byte(0);
    Mp3DeselectData();        //關閉數據片選,SDI無效
    
    set_SPI_bps(5);//設置 高頻速率

 

然後就可以測試 正玄波和 mp3播放了


/***********************************************************************
**********
28
** 函數名稱 : void VS_SinTest(INT8U x).
** 功能描述 : 正弦測試函數 ,檢查 vs1003是否正常 .
** 輸入參數 : INT8U x 正弦波頻率 .
** 輸出參數 : None.
** 返回參數 : None.
***********************************************************************
***********/

void VS_SinTest(int x)
{
    VS_Write_Reg(0x00,0x08,0x20);/* 啓動測試,向 0 號寄存器寫入 0x0820 SM_SDINEW 爲 1  SM_TEST 爲 1 */

   while(!(P2IN&MP3_DREQ));  //VS1003的DREQ爲高才能寫入數據
    Mp3SelectData();       //打開數據片選,即開啓SDI傳輸
    SPI_Write_Byte(0x53);  /* 寫入以下 8 個字節 ,進入正弦測試 */
    SPI_Write_Byte(0xef);
    SPI_Write_Byte(0x6e);
    SPI_Write_Byte(x);  /* 參數 x 用來調整正弦測試中正弦波的頻率*/
    SPI_Write_Byte(0);
    SPI_Write_Byte(0);
    SPI_Write_Byte(0);
    SPI_Write_Byte(0);
    VS_delay(60000);  /* 這裏延時一段時間 ,可以聽到“正弦音”*/
    VS_delay(60000);
    VS_delay(60000);
    VS_delay(60000);
    VS_delay(60000);
    VS_delay(60000);
    SPI_Write_Byte(0x45);  /* 寫入以下 8 個字節 ,退出正弦測試 */
    SPI_Write_Byte(0x78);
    SPI_Write_Byte(0x69);
    SPI_Write_Byte(0x74);
    SPI_Write_Byte(0);
    SPI_Write_Byte(0);
    SPI_Write_Byte(0);
    SPI_Write_Byte(0);                                                                                              
    Mp3DeselectData();        //關閉數據片選
    
}

 

 


 unsigned char VS10XX_SendMusicData( unsigned char *dat)
{
    unsigned char i;
    while(!(P2IN&MP3_DREQ));
           set_SPI_bps(15);   
        Mp3SelectData();       //打開數據片選,即開啓SDI傳輸
        for(i=0; i<8; i++)
        {
            SPI_Write_Byte(dat[i]);
        }
         Mp3DeselectData();        //關閉數據片選
        return 0;

}

end 

https://wenku.baidu.com/view/fa1efcc990c69ec3d4bb756a.html

這個文章寫的很好,調試思路比較清晰

 

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