实例 1: 用 VS1003 播放 M...
 
Notifications
Clear all

实例 1: 用 VS1003 播放 MP3

1 Posts
1 Users
0 Likes
3,621 Views
 Mark
(@mark)
Posts: 36
Estimable Member
Topic starter
 

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 卡插槽也做上去
整个板子体积不大
和实验板一样大
接上线後播放音乐

可用手机锂电池驱动

* 原文出处: 人体自动化实验室 (HAL) http://wukcsoft.blogspot.com/2010/11/control-vs1003.html *

 
Posted : 04/01/2019 10:35 am