打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VS1053的应用

        VS1053本身是一款非常强大的MP3解码芯片,然而大多是人实践上才用了它很小一部份功能。我也是第一次使用VS1053,所以也只用了它非常少的功能。

      1. 最常见的方法就是,通过MCU控制VS1053进行解码。用这中方法是最为简单的,只要正确使用VS1053的命令就可以实现。当然这样可以快速使用VS1053,是入门的最好方法,但是成本比较高。

      2. 直接使用VS1053进行控制,这样就节约了一块MCU。不过需要应用VSIDE平台,所以使用起来相当比较麻烦。

本人就讲讲使用第一种方法的应用,等以后利用第二种方法进行开发时,在和大家一起学习。

VS1053的应用其实非常简单,基本的步骤如下:

    1. 编写好SPI总线驱动代码;

    2. 编写好VS1053初始化代码;

    3. 编写正弦波测试代码;

    4. 内存测试代码。

完成以上几个步骤后就可以进行MP3解码了。

/**************************************************************************************
* FunctionName   : VS1053SineTest()
* Description    : 正弦波测试
* EntryParameter : freq - 测试频率  0x24,0x44等
* ReturnValue    : None
**************************************************************************************/
void VS1053SineTest(uint8 freq)
{
    uint8 i;
    uint8 test[] = {0x53, 0xEF, 0x6E, 0x24, 0x00, 0x00, 0x00, 0x00}; // 向vs发送正弦测试命令
 uint8 back[] = {0x45, 0x78, 0x69, 0x74, 0x00, 0x00, 0x00, 0x00}; // 向vs发送退出测试命令

 VS_XRESET_CLR();         // xreset = 0
 VS1053_Delay(100);
 SSP1Send(0xFF);                      // 发送一个字节的无效数据,启动SPI传输

    VS_CS_SET();                         // cs = 1
 VS_XDCS_SET();             // xdcs = 1
 VS_XRESET_SET();         // xreset = 1
 VS1053_Delay(100);

 VS1053WriteReg(VS_SCI_MODE, 0x0820); // enter vs1003 test model
 while (VS_DREQ_PIN() == 0);          // wait for DREQ Highlevel

 GPIOSetValue(1, 2, 0);     // xdcs = 0
 test[3] = freq;       // 写入频率
 for (i=0; i<8; i++)
 {
     VS1053WriteData(test[i]);   // 程序执行到这里后应该能从耳机听到一个单一频率的声音
 }

 VS_XDCS_SET();             // xdcs = 1
 VS1053_Delay(100000);

 GPIOSetValue(1, 2, 0);     // xdcs = 0
 for (i=0; i<8; i++)
 {
     VS1053WriteData(back[i]);   // 退出正弦测试
 }

 VS_XDCS_SET();             // xdcs = 1
 VS1053_Delay(200);
}

/**************************************************************************************
* FunctionName   : VS1053RamTest()
* Description    : 内存测试,0x8000表示测试完成,0x83FF表示完好
* EntryParameter : None
* ReturnValue    : 完好返回0,否则返回1
**************************************************************************************/
uint8 VS1053RamTest(void)
{
    uint16 res = 0x0000;
 uint8 i;
    uint8 test[] = {0x4D, 0xEA, 0x6D, 0x54, 0x00, 0x00, 0x00, 0x00}; //

 VS_XRESET_CLR();     // xreset = 0
 VS1053_Delay(100);

 SSP1Send(0xFF);
    VS_CS_SET();                         // cs = 1
 VS_XDCS_SET();             // xdcs = 1
 VS_XRESET_SET();         // xreset = 1
 VS1053_Delay(100);
 
 VS1053WriteReg(VS_SCI_MODE, 0x0820); // Allow SCI tests
 while (VS_DREQ_PIN() == 0);          // wait for DREQ Highlevel

 //After this sequence wait for 1100000 clock cycles.
 //The result can be read from the SCI register SCL_HDATA0 
    GPIOSetValue(1, 2, 0);     // xdcs = 0
 for (i=0; i<8; i++)
 {
     VS1053WriteData(test[i]);   // 写入测试代码
 }

 VS_XDCS_SET();             // xdcs = 1
 VS1053_Delay(10000); 
 res = VS1053ReadReg(VS_SCI_HDAT0);   // 如果得到的值为0x83FF,则表明完好。

 return ((res == 0x83FF) ? 0 : 1);    // 返回测试结果
}

/**************************************************************************************
* FunctionName   : VS1053Play()
* Description    : MP3播放
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
uint8 VS1053Play(uint8 *mp3File)
{
    uint8 i, key = 0, pauseFlag = 0;
 uint16 k;
    FATFS fs;               /*Work area (file system object) for logical drive*/
    FIL file;               /*file objects*/
 UINT  br;               /*File R/W count*/
 FRESULT res;

 /*Register a work area for logical drive 0*/
    f_mount(0, &fs);
    /*Create file*/
 res = f_open(&file, (const TCHAR *)mp3File, FA_OPEN_EXISTING|FA_READ);

 if (res == FR_OK)
 {
     while (1)
  {
      res = f_read(&file, MMCBuf, 512, &br);
   k = 0;
   do
   {
    if (VS_DREQ_PIN() == 1)                         // 判断VS是否空闲
    {
         for (i=0; i<32; i++)
      {
             VS1053WriteData(MMCBuf[k++]);               // 发送MP3数据
      }
    }

   } while (k < 511);

   if ((res != FR_OK) || (br < 512))                         // 判断数据是否读完
   {
    break;
   }
  }
 }

 /*Close all files*/
    f_close(&file);      // 关闭文件,必须和f_open函数成对出现
    /*Unregister a work area before discard it*/
    f_mount(0, 0);

    return key;              // 返回
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
单片机实现MP3播放的方法
vs1003 播放320kbps音频文件
51单片机软件解码MP3码流速率提升后的!!!!
加标回收实验的实施及回收率计算
晨辉教你轻松学51--------I/O扩展篇(基于74HC164/74HC165)
一文了解I2C总线
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服