驱动vs1003需要注意的

        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也一直为高。
    驱动个VS1003,比扫描个键盘、驱动个LED显示屏还难,以此记下,与君共勉。 

你可能感兴趣的:(驱动vs1003需要注意的)