完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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; // 返回 } |
|
相关推荐
3 个讨论
|
|
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-3 04:12 , Processed in 0.620088 second(s), Total 58, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号