肖启洋,方 元
(南京大学 电子科学与工程学院,江苏 南京 210093)
MP3 是 MPEG-1 音 频 III(layer III)的 简 称 ,MP3 标准用尽可能低的码流实现CD音质的声音而不会产生数据损失。低数据量和高播放品质的优点使其成为音乐存储、数字广播、网上音乐传输的主要方式。从第一款MP3 MPMan10诞生到现在已经十几年了。十几年来,MP3随身听以无可比拟的优势,逐渐成为传统卡带式随身听、CD随身听、MD随身听之后市场新的竞争者甚至是终结者[1]。但是目前市面上的MP3播放器的内存已经固定,用户只能被动地选择容量大小,而不能根据自己的实际需求使用可调的内存容量,例如内存容量不够使用时,只能去购买新的产品,造成各方面的浪费;况且随着MP4和音乐手机的推出,MP3已经受到很大冲击。为此,本设计采用大容量、高速度、具有极大移动灵活性的SD卡作为MP3播放器的存储介质,实现MP3播放器的播放部分与存储部分的分离,达到大容量存储MP3播放器的目的。
系统结构框图如图1所示。系统硬件主要包括LPC932A1单片机最小系统、VS1003B音频解码模块、SD卡读写模块、4个LED灯指示模块。本设计在电路板背面 MCU附近设计了大容量的 DataFlash芯片AT45DB161D的封装,这部分属于可选部分;只需焊上2~4 MB的Flash芯片,通过编程可实现固态介质放音功能,此时就更加接近真正意义上的便携式MP3播放器了。
操作时,将SD卡插入系统,系统上电时主动识别SD卡并由LED灯D1显示系统自检状况,自检通过时该指示灯亮。系统读取SD卡上存储的MP3文件并将其送入音频解码芯片VS1003B进行解码播放。在播放过程中,D3指示灯闪亮,每读取一个扇区的数据时,该指示灯的亮灭状态改变一次,所以播放的音乐文件比特率越低,闪烁的频率也越低。按键模块可进行上下曲选取和音量加减的操作。
LPC900系列单片机是PHILIPS公司面向小型控制领域推出的一类性价比极佳的控制器,此系列兼容MCS-51单片机,开发人员很容易掌握,开发工具和一些应用例程也非常多;本播放器所用LPC932A1单片机采用高性能处理器结构,指令执行时间只需2~4个时钟周期,6倍于标准80C51器件[2];LPC932A1的宽电压和低功耗是本播放器选为主控MCU的主要因素之一,整机播放时功耗在80 mA以内。
LPC932A1单片机最小系统是整体设计中最核心的部分,控制着系统各个子模块之间的协调运行,其设计的成功与否直接关系到整个设计能否正常运行。最小系统包括稳压模块、晶振电路、复位电路以及人机交互式按键输入部分。电源开关接口为2.54间距的双芯排针,便于外接电源开关。同时,用下载程序用的USB转串口模块也可以为整机供电。AMS1117-2.5V是系统稳压芯片,为系统提供稳定的2.5 V电源。考虑到MP3播放器的人机交互操作,本系统共用 6个按键(SW1~SW6),即复位、暂停/播放、下一曲、上一曲、音量+、音量-功能键。
VS1003是芬兰VLSI公司生产的单芯片MP3/WMA/MIDI音频解码器和ADPCM编码器。它包含一个高性能、低功耗的DSP处理器核VS_DSP,为用户提供工作数据存储器;5 KB的指令RAM和0.5 KB的数据RAM,串行的控制和数据输入接口;4个通用I/O口,1个UART口;拥有1个高品质可变采样率的ADC,1个立体声DAC以及一个耳机放大器和地线缓冲器[3]。VS1003B通过SPI总线与LPC932A1进行命令及数据的传输,其接口电路如图2所示。VS1003B主要通过SPI的3条数据线(串行输入SO、串行输出SI、SCLK)和4条控制线(片选输入 XCS、数据片选端XDCS、数据请求DREQ、XRESET)实现与单片机的通信。
大小如一张邮票的SD卡 (Secure Digital Memory Card)是基于半导体快闪记忆器的新一代记忆设备,拥有高记忆量、快速数据传输、极大的灵活性以及很好的安全性等特征,在便携式装置上广泛使用,例如MP3、数码相机和个人数码助理(PDA)等[4]。
SD卡支持三种传输模式:SPI模式 (独立序列输入和序列输出)、1位SD模式(独立指令和数据通道,独有的传输格式)、4位SD模式 (使用额外的针脚以及某些重新设置的针脚)。采用单片机对SD卡进行读写时一般都采用SPI模式[5]。图3为SD卡模块(SPI模式)的接口电路。
本设计考虑到串口(COM)不支持热插拔及传输速率较低,且目前大部分便携电脑已开始取消该接口的情况,增加了一个USB转串口的模块,选用PL-2303H转换芯片使播放器使用通信口J9(标准的A型插座)与PC机相连,并可担当供电功能。要使用编程器在PC机上对LPC900系列单片机进行编程,首先要在PC机上安装好FlashMagic软件,以烧写LPC900系列各型号单片机。本系统的软件在德国Keil公司推出的C51编辑器中的集成开发环境μ-Vision2进行开发的,它具有强大的编译、连接和调试功能[7]。
系统软件中各模块主要函数如图4所示。其中,PlayMain()是播放控制模块,在这一部分特意增加了播放程序中加入跳转到ISP程序区的按键处理模块,以便程序的升级和维护;VS1003.c为播放器解码驱动程序,并且控制器与VS1003B采用硬件SPI接口进行通信;New_SD.c为播放器SD卡驱动程序,其中安排了初始化与读扇区采用不同速度的底层硬件数据读写函数;FileSys.c用于MP3播放器的文件系统,能以文件名或音乐文件的顺序号来查找文件,非常适合于工程应用,且能以定时器和状态机来管理人机接口,相当方便和实用。播放器的软件流程图如图5所示。
图4 软件系统-函数结构图
图5 MP3播放器软件流程图
本文将重点介绍设计中的SD卡模块。本系统目前支持的SD卡文件系统格式为FAT12和FAT16,可使用1 MB~16 GB的SD卡作为歌曲存储介质。为了便于文件资料的分门别类存放,程序中约定所有的音乐文件存放在SD卡根目录下的“播放音乐”子目录下,其他类型的文件或文件夹可以任意放置。操作前,先在PC机上格式化SD卡并选取FAT格式,然后建立“播放音乐”的文件夹,接着就可以往里面拷贝文件了。
SD卡模块(New_SD.c)主要提供 SD卡驱动以及部分对FAT文件系统操作的函数。New_SD.c文件主要包括以下函数:
SD_Init:将 SD卡设置成 SPI-模式;
SPI_ReadByte:通过 SPI总线低速读取 1 B数据,用于初始化SD卡时使用;
SPI_TransferByte:通过 SPI总线发送 1 B数据,用于初始化SD卡;
SD_SPI_WriteByte:通过 SPI高速发送数据,用于 SD卡扇区读过程中;
SD_SPI_ReadByte:从 SPI总线高速读 1 B,用于从 SD卡读数据;
Write_Command_SD_HighSpeed与 Write_Command_SD:向SD卡发送1 B的命令;
Read_OneSector_From_SDCard_To_SRAM:读取SD卡里一个扇区的数据;
SD_Read_Block是从SD卡中读取一个块的数据的函数,在此函数里,当发送完读取命令后,此时CPU有少量空闲时间,在等待SD卡准备数据就绪,故执行反转指示灯的操作:c_LED_Busy=~c_LED_Busy。
使4个LED灯中的D3红灯反转,已达到闪烁的效果,非常有视觉上的感觉。
本着低成本、实用性强的原则,设计了一种解码器与存储器相分离的MP3播放器,可流畅地播放多种格式高音质的MP3文件[8]。硬件方面,本播放器开发板在程序下载口扩展了 TXD、RXD,SDA、SCL等信号线,可连接I2C设备和串行通信设备进行测试;还预留了外接晶振的位置,可外接12 MHz的晶体提高处理速度;利用单片机控制DSP核的MP3解码芯片VS103B来解码MP3文件,解决了单片机的低速问题,便于播放控制;利用USB转串口与PC机通信传输数据,速度快;支持热拔插,便于MP3音乐文件的上传下载;利用SD卡作为存储介质,容量大、易更换、体积小携带方便。软件方面,程序中有进入“指定文件夹”和“播放指定文件名”功能函数,非常适合于选段或拼音语音的应用软件开发。
[1]新浪数码.[EB/OL].http://tech.sina.com.cn/digi/2009-07-25/0034998509.shtml.200-07-25/2011-10-08.
[2]Philips Semiconductors.P89LPC932A1 product data sheet rev.02[Z].2005.
[3]VLSI.VS1003 Preliminary version 0.92[Z].2005.
[4]百度百科.SD卡.[EB/OL].http://baike.baidu.com/view/2228.htm.2011-10-08.
[5]杨善林,付超,马溪骏.基于NANDFlash控制结构复用的嵌入式存储系统研究 [J].仪器仪体表学报,2006,27(8):845-851.
[6]王宇炎,李明伟.基于C51单片机的MP3播放器设计[J].电子技术,2009(10):29-30.
[7]徐爱钧,彭秀华.Keil Cx5151 V7.0单片机高级语言编程与 μ Vision2应用实践(第 2版)[M].北京:电子工业出版社,2008:136.
[8]洪家平.基于 VS1003解码器的 MP3播放器设计[J].单片机与嵌入式应用,2010(11):53-56.