[-1-]【ANP0001】驱动你的VS1003——ByDSheng2000PART1MP3播放器IYD一.引言:如果你想迅速步入嵌入式系统设计的殿堂,最好的方法只有一个,那就是亲自动手实践,设计出自己的一套系统。MP3作为时下最流行的数码产品,做一个完全自我的MP3随身听应该能够引起你足够的兴趣。那么就让我们来DIY一下自己的MP3播放器吧,这样就可以亲自体验一下嵌入式开发的过程,享受一下成功那一刻美妙的音乐。二.准备工作:首先你需要一颗MP3解码芯片,让它来帮你完整MP3解码和播放的工作。这里推荐一款MP3解码芯片VS1003,它来自芬兰VLSI半导体公司,功能强大但价格便宜,并且简单易用,非常符合DIYer的口味。VS1003支持MP3、WAV、WMA、MIDI等诸多音频格式,音质可与中档MP3播放器相媲美;同时它还兼备录音功能,录音效果也不错。实际上,VS1003就是一颗能够实现MP3等音频文件格式解码的数字信号处理器(DSP),本领并不止MP3播放,如果你有兴趣的话可以去挖掘出它更多的功能。当然,单有一颗VS1003是不够的,我们还需要微处理器和存放MP3的存储介质。如果你过去对某一型号的微处理器较为熟悉的话就立刻让它接上VS1003吧,由它来实现对MP3播放器的全面操控;存储介质就使用你手中的U盘吧,这样可以充分利用资源。不过,并不是所有的微处理器都能够直接识别U盘的,所以你还需要一颗USB主机接口芯片,U盘数据的读取由它负责。目前USB主机接口芯片种类繁多。这里选用南京沁恒公司出品USB主机接口芯片CH375V,在众多产品中具有较高的性价比,适合用于DIY。三.连接你的系统东西都准备好了,现在工作就是将他们整合到一起。在整合之前需要在心中对系统有个整体印象:由微处理器通过USB主机接口芯片CH375从U盘获得MP3文件数据后,再通过微处理器将MP3数据发送给VS1003进行解码,解码后由VS1003送出音频信号,最后就能够在耳机听到音乐了,就这么简单。对于DIY来说,最大的乐趣在于亲自动手组装。所以我们可以把各个功能部分模块化,然后用导线将各个模块正确无误的连接到一起,如下图所示:[-2-][-3-]四.实现你的系统接下来的工作就是让你刚才搭建的系统按照你的设计思想正确无误的运转起来:让你的微处理器从U盘获得MP3数据并发送给VS1003,让VS1003能够放出音乐。这就需要你自己编写整个MP3播放器的控制程序了。在嵌入式系统设计中,嵌入式软件是整个系统的灵魂,它将最终被烧写到微处理器的片内存储器中,在系统运行的过程中全面掌管着微处理器的行动。一切尽在你的掌握之中,你可以只编写简单的播放程序,也可以实现更为复杂的功能。五.将DIY进行到底如果你是一位真正的DIY的话,你一定不会满足仅仅是播放MP3的功能。模块化的好处就是能让我们任意扩充,任意连接。你可以为你的MP3播放器挂接一个小小的彩色液晶屏,让你的MP3能够显示歌名、播放时间、播放进度条以及歌词等等;既然你挂接了彩屏,你又可以用它来显示U盘里存储的图片;或者你手头没有U盘而是SD卡,那么你可以做一个SD卡的MP3播发器;你还可以给你的MP3加上线控或是无线功能。总之,你可以尽情的发挥你的想象力,秀出你的个性和创意,将DIY进行到底。PART2驱动你的VS1003说明:VS1003配套文档基于ICDev的VS1003模块,本教程由IC开发网()2006年8月21日发布,仅供参考,更多资料和疑问请到本站论坛下载和发帖,转载请注明出处。一.准备工作1.硬件VS1003模块和LPC2103核心模块(或其他带SPI总线接口的微处理器模块皆可)。[-4-]2.软件VLSI提供的MP3播放器的完整实例,对自己编写VS1003驱动、播放mp3等很有参考价值。下载地址:=73.文档一个是VS1003的数据手册,一个是VS10xx的应用笔记,有这两个足以搞定VS1003。二.关于VS1003在编写VS1003的驱动程序前须先对它有一定的了解,这就需要阅读VS1003的数据手册了。如果你的E文不好,那就硬着头皮看吧。1.VS1003简介VS1003是由芬兰VLSI公司出品的一款单芯片的MP3/WMA/MIDI音频解码和ADPCM编码芯片,其拥有一个高性能低功耗的DSP处理器核VS_DSP,5K的指令RAM,0.5K的数据RAM,串行的控制和数据输入接口,4个通用IO口,一个UART口;同时片内带有一个可变采样率的ADC、一个立体声DAC以及音频耳机放大器。2.支持的音频编解码格式1)解码:MP3(mpeg1和mpeg2,层3),MP3+V,WMA,WAV,MIDI,SP-MIDI;2)编码:IMAADPCM(单声道),麦克风和线入(Lineinput)两种输入方式。3.电器特性1)AVDD(模拟部分):最大不得超过3.6V,推荐值为2.8V,最小2.5V;2)CVDD(数字部分,内核):最大不得超过2.7V,推荐值2.5V,最小2.4V;3)IOVDD(I/O电压):最大不得超过3.6V,推荐值为2.8V,最小值为CVDD-0.6V注:VS1003模块AVDD=IOVDD=3.3V,CVDD=2.5V。4)输入时钟频率:12M–13MHz,推荐值为12.288MHz;5)VS1003内部的时钟倍频器:芯片复位后的值为1.0×,推荐值为3.0×,即3倍频,最大值为4.5×,即可以在[-5-]3.0×的基础上再增加1.5×,用于WMA的回放。注:以上仅列出了VS1003的一些基本电器特性,更具体的内容请参考VS1003的数据手册P9–P11。4.VS1003的寄存器(数据手册P27)VS1003共有16个16位的寄存器,地址分别为0x0–0xF;除了模式寄存器(MODE,0x0)和状态寄存器(STATUS,0x1)在复位后的初始值分别为0x800和0x3C外,其余的寄存器在VS1003初始化后的值均为0。下面将VS1003各寄存器逐一介绍:1)MODE(地址0x0;RW,可读写)模式寄存器在VS1003中是一个较为重要的寄存器,其每一位都对应着VS1003的不同设置。●bit0:SM_DIFFSM_DIFF=0正常音频相位SM_DIFF=1左声道反转当SM_DIFF置位时,VS1003将左声道反相输出,立体声输入将产生环绕效果,对于单声道输入将产生差分(反相)左/右声道信号。●bit1:SM_SETTOZERO置零●bit2:SM_RESETSM_RESET=1,VS1003软复位。软复位之后该位会自动清零。●bit3:SM_OUTOFWAVSM_OUTOFWAV=1,停止WAW解码。当你要中途停止WAV、WMA或者MIDI文件的解码时,置位SM_OUTOFWAV,并向VS1003[-6-]持续发送数据(对于WAV文件发送0)直到将SM_OUTOFWAV清零;同时SCI_HDAT1也将被清零。●bit4:SM_PDOWNSM_PDOWN=1,软件省电电模式,该模式不及硬件省电模式(由VS1003的xReset激活)●bit5:SM_TESTSSM_TESTS=1,进入SDI测试模式。●bit6:SM_STREAMSM_STREAM=1,使能VS1003的流模式,具体请参考应用笔记VS10XX。●bit7:SM_PLUSVSM_PLUSV=1,MP3+V解码使能。●bit8:SM_DACTSM_DACT=0,SCLK上升沿有效;SM_DACT=1,SCLK下降沿有效。●bit9:SM_SDIORDSM_SDIORD=0,SDI总线字节数据MSB在前,即须先发送MSB;SM_SDIORD=1,SDI总线字节数据LSB在前,即须先发送LSB;[-7-]该位的设置不会影响SCI总线。●bit10:SM_SDISHARESM_SDISHARE=1,SDI与SCI将共用一个片选信号(同时SM_SDINEW=1),即将xDCS与xCS这两根信号线合为一条,能省去一个IO口。●bit11:SM_SDINEWSM_SDINEW=1,VS1002本地模式(新模式)。VS1003在启动后默认进入该模式。注:这里的模式指的是总线模式。●bit12:SM_ADPCMSM_ADPCM=1,ADPCM录音使能。同时置位SM_ADPCM和SM_RESET将使能VS1003的IMAADPCM录音功能。●bit13:SM_ADPCM_HPSM_ADPCM_HP=1,使能ADPCM高通滤波器。同时置位SM_ADPCM_HP、SM_ADPCM和SM_RESET将开启ADPCM录音用高通滤波器,对录音时的背景噪音有一定的抑制作用。●bit14:SM_LINE_IN录音输入选择,SM_LINE_IN=1,选择线入(linein);SM_LINE_IN=0,选择麦克风输[-8-]入(默认)2)SCI_STATUS(0x1,RW)SCI_STATUS为VS1003的状态寄存器,提供VS1003当前状态信息。3)SCI_BASS(0x2,RW)重音/高音设置寄存器。VS1003的内置的重音增强器VSBE是种高质量的重音增强DSP算法,能够最大限度的避免音频削波。当SB_AMPLITUDE(bit:7-4)不为零时,重音增强器将使能。可以根据个人需要来设置SB_AMPLITUDE。例如,SCI_BASS=0x00f6,即对60Hz以下的音频信号进行15dB的增强。当ST_AMPLITUDE(bit:15-12)不为零时,高音增强将使能。例如,SCI_BASS=0x7a00,即10kHz以上的音频信号进行10.5dB的增强。4)SCI_CLOCKF(0x3,RW)在VS1003种对该寄存器的操作有别于VS10x1和VS1002。●SC_MULT(bit:15-13)时钟输入XTALI的倍频设置,设置之后将启动VS1003内置的倍频器。●SC_ADD(bit:12-11)用于在WMA流解码时给倍频器增加的额外的倍频值。●SC_FREQ(bit:10-0)当XTALI输入的时钟不是12.288M时才需要设置该位段,其默认值为0,即VS1003默认使用的是12.288M的输入时钟。[-9-]5)SCI_DECODE_TIME(0x4,RW)解码时间寄存器。当进行正确的解码时,读取该寄存器可以获得当前的解码时长(单位为秒)。可以更改该寄存器的值,但是新值须要对该寄存器进行两次写操作。在每次软件复位或是WAV(PCM、IMAADPCM、WMA、MIDI)解码开始与结束时SCI_DECODE_TIME的值将清零。6)SCI_AUDATA(0x5,RW)当进行正确的解码时,该寄存器的值为当前的采样率(bit:15-1)和所使用的声道(bit:0)。采样率须为2的倍数;bit0=0,单声道数据,bit0=1,立体声数据。写该寄存器将直接改变采样率。7)SCI_WRAM(0x6,RW)该寄存器用来加载用户应用程序和数据到VS1003的指令和数据RAM中。起始地址在SCI_WRAMADDR中进行设置,且必须先于读写SCI_WRAM。对于16位的数据可以在进行一次SCI_WRAM的读写中完成;而对于32位的指令字来说则需要进行两次连续读写。字节顺序是大端模式,即高字节在前,低字节在后。在每一次完成全字读写后,内部指针将自动增加。8)SCI_WRAMADDR(0x7,RW)用于设置RAM读写的首地址。地址范围见数据手册P32。9)SPI_HDAT0和SPI_HDAT1(0x8,0x9,R)[-10-]这两个寄存器用来存放所解码的音频文件的相关信息,为只读寄存器。●当为WAV文件时,SPI_HDAT0=0x7761,SPI_HDAT1=0x7665;●当为WMA文件时,SPI_HDAT0的值为解码速率(字节/秒),要转换为位率的话则将SPI_HDAT0的值乘8即可,SPI_HDAT1=0x574D;●当为MIDI文件时,