半导体技术天地
直播中

黄帅

11年用户 42经验值
擅长:395845
私信 关注
[分享]

音频编解码芯片VS1003 (MP3语音方案)

一般简单的语音合成就是用有限的存储单元存储基本语音单元,进而从有限的存储单元中合成出无限词汇,组成连续语句。而为了节省存储空间一般将语音单元压缩成MP3格式存储。并通过MP3解码后播放
目前市场上较多的MP3解决方案是:MP3控制器+MP3解码芯片+NAND Flash。这种方案的MP3并不适合与商业或工业场合,因为对MP3中的音频文件修改时还需要用计算机设备才能完成,这在许多场合是很难满足或成本较高的。所以商业或工业领域所需要的MP3播放器,需要支持自动从U盘或SD卡等移动存储设备中转移数据的能力。
为了满足这样的需求,我们提出了一种嵌入式语音播放的解决方案----单片机 + NAND + VS1003
此方案用SD卡把音频文件从拷贝大NAND中去,然后再有单片机从NAND中读取文件送入VS1003进行播放。拷贝操作由单片机自动完成。用户操作简单。

方案优势

  § 单片机技术门槛低,容易进行二次开发
§ 主流VS1003解码芯片,能够对MP3WAVWMAMIDI等多种音频格式文件进行解码
§ 音乐存放在NAND中,稳定性好
§ 音乐从SD卡存入模块中的NAND里,自动完成,操作简单
§ 针对Nand Flash的坏块管理,延长Flash的使用寿命
§ 对文件系统的的优化,最大程度减轻了文件系统的开销,从而提高了文件的读取速度
§ 成本低,性价比高

单片机+VS1003MP3方案的系统框图。

§  在该方案中主芯片采用STC12LE5A系列的单片机
该芯片采用增强型8051内核,功耗低,速度比普通的80518-12倍。片内Flash程序存储器最大可达62KB,片内RAM高达1280B。提供1个高速SPI接口,和多达达44GPIO接口(GPIO4种工作模式:准双向、推挽、输入、开漏),引脚与普通8051兼容。
§ 解码芯片采用VS1003
VS1003是来自芬兰 VLSI 半导体公司的一款音频芯片,性价比极高,并且使用非常简单。芯片支持MP3WAVWMAMIDI等多种音频格式的硬件解码,音质可与中高档次的MP3播放器相媲美。
§ 方案中设计音频文件从SD卡中拷贝到NAND里进行播放
考虑工业或某些商业场合对可靠性和稳定性要求较高,音频文件被放在播放模块的NAND Flash中,单片机从NAND中读取文件传送给VS1003。此方案中,单片机的GPIO余量较大,可以做其他功能的扩展(如按键、LED等)。此方案最高可播放320kbpsMP3文件。
§ 稳定性高,满足工业场合应用
因为工业场合对设备的稳定性,抗震动,抗干扰等性能要求较高,因此方案中选择把音频文件存放在NAND中,电路板上没有对震动干扰敏感的器件或设备,因此该方案音频文件更新功能操作灵活,而又不失稳定性。 从系统的功能、可靠性方面考虑可以选择使用NAND flash作为存储介质。nand flash一次传输为8位,大大减轻了单片机开销。在工业控制方面使用NAND flash更加牢固。
§ 方案的可裁剪性
方案中的片外RAM,是在使用较复杂应用程序时做的内存扩展,简单应用中不需要扩展。也可以选择只使用SD卡作为MP3音频存储介质的方案,SD卡数据传输用的是SPI模式,数据按位传输,这将导致播放高位率(>320kbps)的MP3文件时会不流畅,但对一般的需求是完全能够满足的。
§ 串口方式固件烧写
单片机程序通过串口进行烧写,便于设备的维护和更新。产品开发投资少,零风险。



回帖(5)

黄帅

2013-4-10 10:23:32
音频编解码芯片vs1003 DATASHEET.pdf (637.48 KB)
(下载次数: 41, 2013-4-10 10:23 上传)

用MSP430F149(MCLK=SMCLK=8M,SPI高速2分频,低速8分频)和VS1003B、12864做MP3 下附代码:
  1. if(CurrentOffset<(SectorsPerCluster))
  2. {
  3. ReadSectorFromCluster(CurrentCluster,CurrentOffset);
  4. WriteDataToVs1003();
  5. if(IndexFlag)
  6. {
  7. VS1003B_ReadBitRate();
  8. if(BitRate>99)
  9. LCD_DisNum(0,0,BitRate);
  10. else
  11. LCD_DisNum(0,1,BitRate);
  12. IndexFlag=0;
  13. }
  14. CurrentOffset++;
  15. }
  16. else
  17. {
  18. CurrentOffset=0;
  19. CurrentCluster=FindNextCluster(CurrentCluster);
  20. if(CurrentCluster==0x0ffffff8 || CurrentCluster==0x0fffffff)
  21. {
  22. switch(mode)
  23. {
  24. case Repet_All:
  25. if(CurrentAudioFileIndex==AudioFileNumber)
  26. CurrentAudioFileIndex=1;
  27. else CurrentAudioFileIndex++;
  28. break;
  29. case Repet_One:
  30. CurrentCluster = GetAudioFile( CurrentAudioFileIndex);
  31. LCD_Print(3,3,Filestyle);
  32. CurrentOffset=0;
  33. break;
  34. case Shuffle :
  35. uint rand_val = TAR;
  36. srand(rand_val);
  37. CurrentAudioFileIndex = rand()%AudioFileNumber + 1;
  38. CurrentOffset=0;
  39. break;
  40. }
  41. LCD_Print(2,1," ");
  42. GetShortAudioFileName(CurrentAudioFileIndex);
  43. LCD_Print(2,1,ShortFileName);
  44. }
  45. }
  46. }
  47. .读取比特率和解码时间.spi的速率,变成8分频,也就是1M下附代码:
  48. uchar ReceiveByte0() //read one byte from spi port
  49. {
  50. unsigned char temp=0;
  51. while ((IFG1 & UTXIFG0)==0); // USCI_A0 TX buffer ready?
  52. U0TXBUF =0xff; //8 clocks
  53. temp=U0RXBUF;
  54. return temp;
  55. }

  56. uint VS1003B_ReadCMD(unsigned char addr)
  57. {
  58. uint temp;
  59. while(VS1003B_NeedData()==0);
  60. SPI0_Low();
  61. VS1003B_XDCS_H();
  62. VS1003B_XCS_L();
  63. SendByte0(0x03);
  64. SendByte0(addr);
  65. temp = ReceiveByte0();
  66. temp <<= 8;
  67. temp += ReceiveByte0();
  68. VS1003B_XCS_H();
  69. SPI0_High();
  70. return temp;
  71. }

  72. uint VS1003B_ReadDecodeTime()
  73. {
  74. return VS1003B_ReadCMD(0x04);
  75. }

  76. uint VS1003B_ReadBitRate(void)
  77. {
  78. uint HDAT0,HDAT1;
  79. HDAT0=VS1003B_ReadCMD(0x08);
  80. HDAT1=VS1003B_ReadCMD(0x09);
  81. switch(HDAT1)
  82. {
  83. case 0x7665:return 0;//WAV格式
  84. case 0X4D54:return 1;//MIDI格式
  85. case 0X574D://WMA格式
  86. {
  87. HDAT1=HDAT0*2/25;
  88. if((HDAT1%10)>5)return HDAT1/10+1;
  89. else return HDAT1/10;
  90. }
  91. default://MP3格式
  92. {
  93. HDAT1>>=3;
  94. HDAT1=HDAT1&0x03;
  95. if(HDAT1==3)HDAT1=1;
  96. else HDAT1=0;
  97. return BitRate_Table[HDAT1][HDAT0>>12];
  98. }
  99. }
  100. }
举报

明名

2013-7-10 16:42:21
shao少了点,我们这些新手做起来比较吃力
举报

zdl1966

2013-8-18 15:38:40
我也来学习学习,谢了
举报

zywplc

2015-6-25 17:45:25
谢谢分享                                                                  
举报

侯斌

2018-1-26 23:46:25
谢谢分享,学习学习
举报

更多回帖

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