VS1003共有16个16位的寄存器,地址分别为0x0–0xF;除了模式寄存器(MODE,0x0)和状态寄存器(STATUS,0x1)在复位后的初值分别0x800和0x3C外,其余的寄存器在VS1003初始化后的值均为0。
初始化SPI所有对VS1003的操作将通过SPI总线来完成。在默认情况下,数据位将在SCLK的上升沿有效(被读入VS1003),因此需要在SCLK的下降沿更新数据;并且字节发送以MSB在先。VS1003的SPI总线的输入时钟最大值为CLKI / 6 MHz,
其中CLKI(内部时钟)=XTALI×倍频值
通过SPI总线对VS1003进行初始化了。
初始化的一般流程如下:
硬复位,xReset = 0;
延时,xDCS、xCS、xReset置1;
等待DREQ为高;
软件复位:SPI_MODE = 0x0804;
等待DREQ为高(软件复位结束);
设置VS1003的时钟:SCI_CLOCKF = 0x9800,3倍频;
设置VS1003的采样率:SPI_AUDATA = 0xBB81,采样率48k,立体声;
设置重音:SPI_BASS = 0x0055;
设置音量:SCI_VOL = 0x2020;
向vs1003发送4个字节无效数据,用以启动SPI发送。
全面测试:
察看芯片供电是否正常:一般3.3v
模拟部分是否正常:VS1003的所有DVDD、AVDD管脚以及xReset、TEST(Pin 32)接+3.0V ,然后测量RCAP在应在1.3V左右,否则芯片模拟部分未正常工作。 检查SCI命令是否正确写入:给音量控制寄存器SCI_VOL循环写入最高值和最低值,正常情况下能从耳机听到滴滴的声音,具体步骤如下:
●拉低xCS;
●设置音量最高:SCI_VOL = 0x0000;
●拉高xCS;
●等待500ms,这个时间控制在0.5到1s之间,太大太小可能都无法听到;
●拉低xCS;
●设置音量最低:SCI_VOL = 0xFFFF;
●等待500ms,道理同上;
●拉高xCS;
●循环,否则以上步骤无法识别。
可以对SCI的读写做进一步的测试:
●拉低xCS;
●写音量控制寄存器:SCI_VOL = 0xA2F5;
●适当延时,等待DREQ为高;
●读音量控制寄存器,看读回的值是否与写入的一致,如果不为0xA2F5的话说明SCI读写有问题。
正弦测试(SDI测试)
正弦测试属于芯片内部的测试功能,如果写SDI总线无误的话可以从耳机里听到单一频率的正弦音(可以通过命令更改频率),强烈建议大家对此项步骤测试时不要将耳塞直接塞入耳中,因为系统不同可能导致声音大小会不同,有可能极其刺耳。正弦测试步骤如下:
● 进入VS1003的测试模式:SPI_MODE = 0x0820;
● 等待DREQ为高;
● xDCS拉低(xCS置1),选择vs1003的数据接口;
● 向VS1003发送正弦测试命令:0x53 0xEF 0x6E 0x30 0x00 0x00 0x00 0x00;
● 延时500ms;
● 退出正弦测试,发送命令:0x45 0x78 0x69 0x74 0x00 0x00 0x00 0x00;
● 延时500ms;
● 循环。
至此,VS1003的驱动任务已经完成。
具体流程如下:
1)打开一个指定的MP3文件:CH375FileOpen();
2)读一个扇区数据:CH375FileRead();
3)发32个字节的数据到VS1003;
4)检测DREQ,当DREQ为高时发下一个32个字节的数据;
5)是否发完512个字节,否,则回到3);
6)是否发完打开的mp3文件,否,则回到2);
7)关闭打开的文件:CH375FileClose( )。
具体参考《驱动你的VS1003》。
在程序的帮助下,终于可以让它播放了。之前的最后一个问题:vs1003能够播放,但像快进了一样,声音很杂。网上搜索了一下,差不多都看到一个结果,在《MP3播放器制作心历——VS1003调试》中提到,VS1003的串口RX必须接到IOVDD,TEST也必须接到IOVDD。可是开发板上都集成了,看了下原理图,都已经接3.3v了。还有就是DREQ没工作。但用自带资料里的烧写后进行一切正常,一量DREQ,0.38-0.43之间跳动,而烧写我的程序,却一直是3.14V,唉,无奈,网上再搜,原来是VS1003不断在请求数据。看了代码,唉,读取到的数据被扰乱了,送入不对的数据;无意间将(不断读取送入的循环里的)显示进度的代码注释掉,咦,好啦,原来送入的前一批数据早在显示阶段就解码完了,后一批数据却还没送入,难怪VS1003不断请求数据,DREQ也一直为高。
|