2010年11月18日 星期四

用 VS1003 播放 MP3

本文在 2010/11/18 16:09 發表於 Yahoo!奇摩部落格
因Yahoo!奇摩部落格將於2013年12月26日終止服務故遷移至此


這篇是庫存出清, 當兵的時候玩的
現在東西都已經收起來了
板子也確定掛了, 計畫暫停但沒終止
總有一天我會回來 resume 的XD

VS1003 是顆 MP3 解碼器
可以播放 MP3, WMA, WAV, MIDI 等檔案
他本身是顆 DSP (數位信號處理器)
其實 DSP 也是一種 CPU
只是多了些專門用於特定用途的指令集
這顆 DSP 裡面有預置了一套解碼軟體
這顆 DSP 就是執行這軟體
依照預定程序進行接收資料/命令並解碼輸出
交換資料的介面為 SPI
我們可以讓它和 SD 卡共用兩條傳輸線
透過 CS (chip select) 信號來選擇對誰傳輸

這裡有一篇對岸的老兄寫的心得
MP3播放器制作心历——VS1003调试

重點節錄:
SPI 模式傳輸時, VS1003 的 UART 的 RX 需接上 IOVDD
test 接腳也是接到 IOVDD
用 DREQ 信號判斷 VS1003 是否忙碌



接著開始, 還是那張改到破的板子


解碼板線路

線路完全照 datasheet 上的官版電路
只是錄音部份線路空接
目前我不打算實驗這功能

這類 IC 多有內建的設定用暫存器
若要測試 IC 是否損毀或異常
可隨便選一個暫存器寫入
然後再把值讀出來
若相符通常就是沒問題

控制這顆 DSP 有兩種介面 : SCI 和 SDI
分別為 Serial Command Interface 和 Serial Data Interface
都是 SPI 傳輸
只是寫的對象不同
SCI 是下指令, SDI 是送資料
SCI 是 XCS 腳位低電位時作用
SDI 是 XDCS 腳位低電位時作用
透過設定 SM_SDISHARE 這個 bit 的值
可以改變將 XCS 的輸入直接反向後接給 XDCS
這樣用一個 CS 就能選擇 SCI/SDI
不過這就意味著永遠有一個介面是啟動的
如果 SPI bus 上有接其他設備就不適合這樣做
因為對其他設備傳輸時這些資料也會被 VS1003 接收
唯有把 XCS/XDCS 同時拉高電位 VS1003 才不會接收任何資料

SCI 指令為 4-byte 資料
前 2 bytes 是位址, 後 2 bytes 是資料
不過暫存器只有 16 個
所以實際上只有 4-bit 位址
第一個 byte 永遠是 0x2
第二個則是位址
第 3-4 個 byte 組成的 16-bit 為填入該位址的值
讀取暫存器時則是先送 2 bytes 的位址
然後收 2 bytes 的值

SDI 則是資料, 像浣腸一樣一直塞就對了 ! XD
塞到 DREQ 接腳出現低電位表示忙碌時再停手
DREQ 恢復高電位後繼續塞
整個檔案一個 block 讀出來就依序塞進去
不用解析抽出資料部分
VS1003 自己會判斷該怎麼解
這是非常便利的玩具

初始化過程只有三個

1. RESET 拉低電位等 2 個 clock 後拉高電位等 DREQ 恢復高電位
2. 設定內建倍頻器, 若為 12 MHz 晶振, SCI_CLOCKF = 0x9BE8
3. 設定運轉模式, 我採用 SPI, 所以設定 SCI_MODE = 0x800

詳細參數資料請參考 datasheet

接著進行功能測試
VS1003 提供測試信號輸出
先設定運轉模式為測試模式 (SCI_MODE |= 1<<5)
接著從 SDI 送進 sine test 指令 0x53 0xEF 0x6E n 0 0 0 0 (n = 頻率設定)
結果會像這樣

拿示波器可以看到 sin 波輸出
接上喇叭會聽到 "嗶---" 的聲音
聲音還蠻大的, 要注意喇叭音量

若都正常了, 就可以開始塞音樂了
接著就是從 SD 卡把音樂讀出來後走 SDI 塞給 VS1003
SD 卡讀取時最少讀一個 sector, 也就是 512 byte
若採用的微控制器上沒有足夠空間會有麻煩
我的 LPC2148 有 32KB 的記憶體, 非常夠用

實驗到這裡, 我的實驗板穩壓部分電路發出高熱
似乎是接太多裝置了
於是, 我重新再畫一張板子
並讓實驗板只接這板子
其他裝置都移除


把 Micro SD 卡插槽也做上去
整個板子體積不大
和實驗板一樣大
接上線後播放音樂

可用手機鋰電池驅動

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。