STM32
直播中

李鑫

7年用户 1337经验值
私信 关注
[问答]

为什么加载完flac用户代码程序虽然能够读取到数据?

不知道为什么加载完flac用户代码程序虽然能够读取到数据,但是还是无法听到音乐....

回帖(4)

苏天兰

2020-7-22 09:25:58
我们的代码就支持播放啊.
举报

赵文隽

2020-7-22 09:45:53
和硬件有关系吗??
举报

周玮

2020-7-22 10:04:22
只要是VS1053就可以了.
举报

张玲玲

2020-7-22 10:17:00
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);   // 程序执行到这里后应该能从耳机听到一个单一频率的声音
 }
 VS_XDCS_SET();             // xdcs = 1
 VS1053_Delay(100000);
 GPIOSetValue(1, 2, 0);     // xdcs = 0
 for (i=0; i<8; i++)
 {
     VS1053WriteData(back);   // 退出正弦测试
 }
 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);   // 写入测试代码
 }
 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;              // 返回
}
举报

更多回帖

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