赛事专区
直播中

黄帅

11年用户 50经验值
擅长:数字及可编程逻辑
私信 关注
[单片机设计大赛]

DSP 触摸式 MP3播放器 (VS1003)

介绍了利用数字信号处理芯片TMS320LF2407A实现触摸式MP3播放器设计的方案。采用芯片VS1003B进行MP3的解码,减轻了系统的负担。采用ILI9320为驱动器的真彩彩屏,并采用TM7843为控制器的4线电阻式触摸屏作为人机交互平台,实现了MP3等文件的播放、歌词的同步显示以及彩图显示等功能,相关文件存储在SD卡中。
  TMS320LF2407A是美国ti公司推出的高性能16 bit定点数字信号处理器,它采用了高性能静态CMOS技术,使得供电电压降为3.3 V,减小了控制器的功耗;40 MIPS的执行速度使指令周期缩短到25 ns(40 MHz),从而提高了控制器的实时控制能力。它专门为数字控制设计,集DSP的高速信号处理能力及适用于控制的优化外围电路于一体,在数字控制系统中得以广泛应用;MP3是指MPEG国际标准音频第三层编/解码[1],本文采用硬件解码方式(软件解码代价高,速度慢),利用TMS320LF2407A实现 MP3播放器的设计。
1 系统硬件组成
1.1 微控制器TMS320LF2407A
  系统硬件结构如图1 所示,TMS320LF2407A作为主控芯片,内部资源十分丰富,具有40个可编程/复用的GPIO脚,具有事件管理器EV模块、CAN总线模块、 SCI模块以SPI模块等。其中,同步串行SPI模块具有4个通信引脚:主出从入SPIMOSI、主入从出SPIMISO、同步时钟SPICLK、总线片选SPISTE。本系统中,SD卡、VS1003B以及TM7843都是SPI总线接口设备,DSP采用SPI总线扩展了SD卡与VS1003B音频解码芯片,而并未将触摸屏控制器TM7843也扩展到SPI总线上,采用了IO口模拟SPI的方案,原因是在对SD卡操作的同时(数据还未读入RAM),是不可能向VS1003B传送数据的,SPI处在间歇的切换状态中,不会导致争用、冲突,但是对屏幕的触碰是难免的,所以共用总线不可靠。
1.jpg
1.2 VS1003B解码芯片
  VS1003B 是由荷兰VLSI公司出品的一款单芯片的MP3/WMA/MIDI音频解码和ADPCM编码芯片,其拥有一个高性能低功耗的DSP处理器核 VS_DSP,5 KB的指令RAM,0.5 KB的数据RAM,串行的控制和数据输入接口,4个通用IO口,一个UART口;同时片内带有一个可变采样率的ADC、一个立体声DAC以及音频耳机放大器。
2.jpg
如图2所示,VS1003B各部分的供电电压不同,AVDD(模拟电路电压)与IOVDD(IO电压)须用3.3 V供电,CVDD(数字电路电压)必须用2.5 V供电;VS1003与DSP连接的引脚主要有7个,分别为DREQ、SO、SI、SCLK、XRESET、XCS、XDCS。只有保证它们与DSP正确可靠的连接,才能对VS1003进行有效的操作与控制;操作时,只有当DREQ为高(准备好)时才能读写VS1003B,它具有2个读写端口,即命令端口和数据端口,分别由XCS(命令片选)与XDCS(数据片选)决定,由DSP的IO口控制。SO、SI、SCLK是SPI接口,与DSP的SPI总线对接。图2的左侧与右侧原理图分别为MIC音频模拟信号输入电路与音频输出电路,由于内部具有耳机驱动器,VS1003B输出信号不需经过任何功放电路,简化了硬件电路。
1.3 SD卡电路
  SD卡有9个引脚,支持2种可选的通信协议:SD模式和SPI模式。如前所述,本设计采用SPI模式。图3中,DI、DO、SCLK分别对应微控器SPI模块的3个引脚;CS脚是SD卡SPI模式的片选引脚,与DSP的IO口连接,DSP 的SPISTE脚并未使用(因为需要扩展多个SPI芯片,需要多个片选脚),对SD卡操作时,CS脚才拉低有效,避免了与VS1003B冲突。SENS与 WP分别为SD卡的插入检测与写保护脚。
3.jpg
1.4 彩屏与触摸屏驱动电路
  ILI9320 是手机上常用的彩屏控制器,采用16 bit并行总线方式,端口被映射到DSP的IO空间,彩屏具有4个背光LED灯(控制端为LED1~LED4),采用三极管9012连接共阳极LEDA,使背光受控于DSP的PE3脚,若一段时间内未触摸屏幕,控制PE3脚为高,使背光熄灭,降低系统功耗。彩屏与4线电阻式触摸屏紧贴一起,2块屏是一个整体,输出软排线中的XR、YD、XL、YU(参见图4中的U3)即为4线电阻采样端,与TM7843(芯片U4)对应脚连接,TM7843的DCLK、 DIN、DOUT、/CS脚与TMS320LF2407A的IO脚连接,模拟SPI总线。PENIRQ是笔落下信号,程序中判断此脚为低电平时(或采用中断方式),则有触摸屏幕事件发生,再进一步做区域识别处理。
2 软件设计
  软件主要分为3个任务:显示任务、触摸识别任务、MP3播放任务,由?滋C/OS操作系统负责调度。MP3播放任务完成了最主要的功能,即从SD卡FAT32文件系统中读取数据再送入VS1003B 解码。然而μC/OS系统只是完成了基本的任务调度及相关机制,并无其他内嵌实用模块,所以基于SD卡的FAT32文件系统的实现必须设计完成。
  FAT32 文件系统如图5所示,物理扇区0可以引导程序定位到正确的文件系统逻辑扇区0的位置。引导区DBR的第一扇区包括一个引导程序和BPB参数块[3]。启动区BPB是文件系统最重要的部分,它记录了每扇区字节数、根目录簇号、FAT表号等重要信息,依据它可以找到每个文件的簇号,依据文件的链式存储结构,可以依次找到文件的所有存储簇号。
4.jpg
软件中设计了对应的结构体,描述了BPB块结构、目录结构、文件记录体结构等。其中,BPB结构如下:
struct FAT32_BPB
{
unsigned char BS_jmpBoot[3];        //跳转指令     offset:0
unsigned char BS_OEMName[8];    //系统字符串  offset:3
unsigned char BPB_BytesPerSec[2];    //每扇区字节数offset:11
unsigned char BPB_SecPerClus[1];    //每簇扇区数    offset:13……
unsigned char BS_FilSysType[11];    //            offset:71
unsigned char BS_FilSysType1[8];    //串″FAT32″  offset:82
};
  再利用SD卡硬件层API接口函数FAT32_ReadSector将BPB所在扇区读入RAM缓冲区,利用指针指向内部成员即可获得以上信息,从而可以定位到文件位置并读取数据。MP3通常只是读取文件,并不会进行删除、保存等操作,所以为了提高效率、精简代码,本FAT32系统只实现了文件定位及读取功能。图6为主流程图与播放任务流程图。
5.jpg
TMS320LF2407A 具有较高的性能,资源丰富,将其应用到MP3播放器中,提高了整体性能;采用触摸屏可以随意点选歌曲以及拖动播放进度等,使系统可控性提高;彩屏使系统展现能力提高,系统不仅可以播放音频,而且能够显示全彩BMP图片、文档文件等,类似于小型PDA。


回帖(17)

卢浩林

2013-1-3 14:49:43
新手到此,受益匪浅
举报

焦嘉琪

2013-3-26 18:56:52
{:5:}
举报

张祥

2013-3-26 22:27:12
{:5:}
举报

黄帅

2013-5-16 16:08:25
stm32 与VS1003的接口设置
第一点,STM32的端口设置,设置为SCK和MOSI复用推挽,而片选设为推挽输出即可,MISO设为input floating即可。
第二点,因为VS1003控制寄存器是八位数据读写的,所以STM32需要设置发送和接收数据也是八位的。
第三点,根据VS1003的时序关系,需要设置STM32的时钟信号的相位和极性为CPOL为0,CPHA为0。
第四点,NSS模式需要设置软件模式,这样就可以利用另作他用了,可以用GPIO口控制作为片选了。

  1. void  SPI1_Init(void)
  2. {   
  3.      SPI_InitTypeDef SPIStruct_Init;
  4.      SPIStruct_Init.SPI_Direction = SPI_Direction_2Lines_FullDuplex;    //配置SPI为全双工模式
  5.      SPIStruct_Init.SPI_Mode = SPI_Mode_Master;        //配置SPI为主模式
  6.      SPIStruct_Init.SPI_DataSize = SPI_DataSize_8b;    //配置SPI为8位数据传送
  7.      SPIStruct_Init.SPI_CPOL = SPI_CPOL_Low;           //配置CPOL为低
  8.      SPIStruct_Init.SPI_CPHA = SPI_CPHA_1Edge;         //配置CPHA为第一个上升沿
  9.      SPIStruct_Init.SPI_NSS = SPI_NSS_Soft;            //配置NSS为软件控制
  10.      SPIStruct_Init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;   //配置SPI时钟预分频
  11.      SPIStruct_Init.SPI_FirstBit = SPI_FirstBit_MSB;   //配置传输字节高位在前
  12.      SPIStruct_Init.SPI_CRCPolynomial = 7;             //配置CRC,可不用理
  13.      SPI_Init(SPI1,&SPIStruct_Init);                   //SPI初始化函数   
  14.      SPI_Cmd(SPI1, ENABLE);                            //使能SPI
  15. }
  16. void Mp3WriteRegister(uint8_t addres***yte,uint8_t high,uint8_t low)
  17. {         
  18. Mp3DeselectData();   //释放数据端口
  19. Mp3SelectControl();  //选择控制端口
  20.       
  21.         while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)); //判断发送缓冲器是否为空   
  22.         SPI_I2S_SendData(SPI1,VS_WRITE_COMMAND);    //发送写寄存器命令
  23.             
  24.         while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
  25.         SPI_I2S_SendData(SPI1, addres***yte);        //发送寄存器的地址
  26.            
  27.         while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
  28.         SPI_I2S_SendData(SPI1, high);              //发送参数的高八位
  29.       
  30.         while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));
  31.         SPI_I2S_SendData(SPI1, low);              //发送参数的低八位      
  32. Mp3DeselectControl();
  33. }



  34. /*************************************************************/
  35. /*  函数名称 :  CheckVS1003B_DRQ(void)                             */
  36. /*  函数功能 : 判断DREQ引脚状态                             */
  37. /*-----------------------------------------------------------*/
  38. bool CheckVS1003B_DRQ(void)
  39. {
  40. bool bResult;
  41. bResult =GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4);
  42. return(bResult);
  43. }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分