找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10958|回复: 6
打印 上一主题 下一主题
收起左侧

VS1053裸机程序 stm32 MP3音乐播放器源代码

  [复制链接]
跳转到指定楼层
楼主
基于vs1053 的音乐播放器。可以播放MP3格式的音频文件.




完整源码下载:
1.MINI-V3_VS1053裸机例程.rar (7.12 MB, 下载次数: 224)



下面是VS1053 MP3播放程序的主要部分预览(stm32单片机主控):
  1. #include "bsp_SysTick.h"
  2. #include  "VS1053.h"
  3. #include "flac.h"
  4. #include "bsp_usart1.h"
  5. #include "string.h"
  6. //VS1053默认设置参数
  7. _vs1053_obj vsset=
  8. {
  9.         220,        //音量:220
  10.         6,                //低音上线 60Hz
  11.         15,                //低音提升 15dB       
  12.         10,                //高音下限 10Khz       
  13.         15,                //高音提升 10.5dB
  14.         0,                //空间效果       
  15. };

  16. /*******************************************************************************
  17. * Function Name  : SPI_FLASH_SendByte
  18. * Description    : Sends a byte through the SPI interface and return the byte
  19. *                  received from the SPI bus.
  20. * Input          : byte : byte to send.
  21. * Output         : None
  22. * Return         : The value of the received byte.
  23. *******************************************************************************/
  24. unsigned char SPI2_ReadWriteByte(unsigned char writedat)
  25. {
  26.         /* Loop while DR register in not emplty */
  27.         while(SPI_I2S_GetFlagStatus(VS_SPI,SPI_I2S_FLAG_TXE) == RESET);
  28.        
  29.         /* Send byte through the SPI1 peripheral */
  30.         SPI_I2S_SendData(VS_SPI, writedat);
  31.        
  32.         /* Wait to receive a byte */
  33.         while(SPI_I2S_GetFlagStatus(VS_SPI, SPI_I2S_FLAG_RXNE) == RESET);
  34.        
  35.         /* Return the byte read from the SPI bus */
  36.         return SPI_I2S_ReceiveData(VS_SPI);
  37. }

  38. ////////////////////////////////////////////////////////////////////////////////
  39. //移植时候的接口
  40. //data:要写入的数据
  41. //返回值:读到的数据
  42. u8 VS_SPI_ReadWriteByte(u8 data)
  43. {                                   
  44.         return SPI2_ReadWriteByte(data);          
  45. }
  46. static void SPI_SetSpeed(u8 SpeedSet)
  47. {
  48.         assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
  49.         SPI2->CR1&=0XFFC7;
  50.         SPI2->CR1|=SpeedSet;
  51.         SPI_Cmd(SPI2,ENABLE);
  52. }

  53. void VS_SPI_SpeedLow(void)
  54. {                                                                 
  55.         SPI_SetSpeed(SPI_BaudRatePrescaler_32);//设置到低速模式
  56. }

  57. void VS_SPI_SpeedHigh(void)
  58. {                                                  
  59.         SPI_SetSpeed(SPI_BaudRatePrescaler_8);//设置到高速模式                 
  60. }
  61. //初始化VS1053的IO口         
  62. void VS_Init(void)
  63. {
  64.        
  65.         SPI_InitTypeDef  SPI_InitStructure;
  66.         GPIO_InitTypeDef GPIO_InitStructure;
  67.         RCC_APB2PeriphClockCmd(VS_SPIGPIO_CLK|VS_GPIO_DREQ_CLK|VS_GPIO_RST_CLK|VS_GPIO_XDCS_CLK, ENABLE);
  68.        
  69.         GPIO_InitStructure.GPIO_Pin = VS_DREQ;                                 //DREQ
  70.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                  //输入
  71.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  72.         GPIO_Init(VS_GPIO_DREQ_PORT, &GPIO_InitStructure);

  73.         GPIO_InitStructure.GPIO_Pin = VS_RST;         //PB9
  74.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  75.         GPIO_Init(VS_GPIO_RST_PORT, &GPIO_InitStructure);
  76.        
  77.         /*初始化STM32 SPI2接口*/
  78.         RCC_APB1PeriphClockCmd(VS_SPI_CLK, ENABLE);
  79.        
  80.         GPIO_InitStructure.GPIO_Pin = VS_SCLK | VS_MISO | VS_MOSI;
  81.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  82.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                   // 复用输出
  83.         GPIO_Init(VS_SPIGPIO_PORT, &GPIO_InitStructure);
  84.    
  85.         GPIO_InitStructure.GPIO_Pin = VS_XCS;
  86.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           // 推免输出
  87.         GPIO_Init(VS_SPIGPIO_PORT, &GPIO_InitStructure);       
  88.        
  89.         GPIO_InitStructure.GPIO_Pin = VS_XDCS;
  90.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           // 推免输出
  91.         GPIO_Init(VS_GPIO_XDCS_PORT, &GPIO_InitStructure);
  92.        
  93.         /* SPI2 配置 */
  94.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  95.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//
  96.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  97.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  98.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  99.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  100.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  101.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  102.         SPI_InitStructure.SPI_CRCPolynomial = 7;
  103.         SPI_Init(VS_SPI, &SPI_InitStructure);
  104.        
  105.         /* 使能 SPI2 */
  106.         SPI_Cmd(VS_SPI, ENABLE);
  107.         SPI2_ReadWriteByte(0xff);//启动传输       
  108.        
  109. }          
  110. ////////////////////////////////////////////////////////////////////////////////                   
  111. //软复位VS10XX
  112. void VS_Soft_Reset(void)
  113. {         
  114.         u8 retry=0;                                    
  115.         while(VS_DREQ_IN==0);                                         //等待软件复位结束          
  116.         VS_SPI_ReadWriteByte(0Xff);                        //启动传输
  117.         retry=0;
  118.         while(VS_RD_Reg(SPI_MODE)!=0x0800)        // 软件复位,新模式  
  119.         {
  120.                 VS_WR_Cmd(SPI_MODE,0x0804);                // 软件复位,新模式            
  121.                 Delay_ms(2);//等待至少1.35ms
  122.                 if(retry++>100)break;             
  123.         }                          
  124.         while(VS_DREQ_IN==0);//等待软件复位结束         
  125.         retry=0;
  126.         while(VS_RD_Reg(SPI_CLOCKF)!=0X9800)//设置VS1053的时钟,3倍频 ,1.5xADD
  127.         {
  128.                 VS_WR_Cmd(SPI_CLOCKF,0X9800);        //设置VS1053的时钟,3倍频 ,1.5xADD
  129.                 if(retry++>100)break;             
  130.         }         
  131.         Delay_ms(20);
  132. }
  133. //硬复位MP3
  134. //返回1:复位失败;0:复位成功          
  135. u8 VS_HD_Reset(void)
  136. {
  137.         u8 retry=0;
  138.         VS_RST_CLR;
  139.         Delay_ms(20);
  140.         VS_XDCS_SET;//取消数据传输
  141.         VS_XCS_SET;//取消数据传输
  142.         VS_RST_SET;          
  143.         while(VS_DREQ_IN==0&&retry<200)//等待DREQ为高
  144.         {
  145.                 retry++;
  146.                 Delay_us(50);
  147.         };
  148.         Delay_ms(20);       
  149.         if(retry>=200)return 1;
  150.         else return 0;                             
  151. }
  152. //正弦测试
  153. void VS_Sine_Test(void)
  154. {                                                                                            
  155.         VS_HD_Reset();         
  156.         VS_WR_Cmd(0x0b,0X2020);          //设置音量         
  157.         VS_WR_Cmd(SPI_MODE,0x0820);//进入VS10XX的测试模式     
  158.         while(VS_DREQ_IN==0);     //等待DREQ为高
  159.         //printf("mode sin:%x\n",VS_RD_Reg(SPI_MODE));
  160.         //向VS1053发送正弦测试命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00
  161.         //其中n = 0x24, 设定VS1053所产生的正弦波的频率值,具体计算方法见VS1053的datasheet
  162.         VS_SPI_SpeedLow();//低速
  163.         VS_XDCS_CLR;//选中数据传输
  164.         VS_SPI_ReadWriteByte(0x53);
  165.         VS_SPI_ReadWriteByte(0xef);
  166.         VS_SPI_ReadWriteByte(0x6e);
  167.         VS_SPI_ReadWriteByte(0x24);
  168.         VS_SPI_ReadWriteByte(0x00);
  169.         VS_SPI_ReadWriteByte(0x00);
  170.         VS_SPI_ReadWriteByte(0x00);
  171.         VS_SPI_ReadWriteByte(0x00);
  172.         Delay_ms(100);
  173.         VS_XDCS_SET;
  174.     //退出正弦测试
  175.     VS_XDCS_CLR;//选中数据传输
  176.         VS_SPI_ReadWriteByte(0x45);
  177.         VS_SPI_ReadWriteByte(0x78);
  178.         VS_SPI_ReadWriteByte(0x69);
  179.         VS_SPI_ReadWriteByte(0x74);
  180.         VS_SPI_ReadWriteByte(0x00);
  181.         VS_SPI_ReadWriteByte(0x00);
  182.         VS_SPI_ReadWriteByte(0x00);
  183.         VS_SPI_ReadWriteByte(0x00);
  184.         Delay_ms(100);
  185.         VS_XDCS_SET;                 

  186. //  //再次进入正弦测试并设置n值为0x44,即将正弦波的频率设置为另外的值
  187. //  VS_XDCS_CLR;//选中数据传输      
  188. //        VS_SPI_ReadWriteByte(0x53);
  189. //        VS_SPI_ReadWriteByte(0xef);
  190. //        VS_SPI_ReadWriteByte(0x6e);
  191. //        VS_SPI_ReadWriteByte(0x44);
  192. //        VS_SPI_ReadWriteByte(0x00);
  193. //        VS_SPI_ReadWriteByte(0x00);
  194. //        VS_SPI_ReadWriteByte(0x00);
  195. //        VS_SPI_ReadWriteByte(0x00);
  196. //        Delay_ms(100);
  197. //         VS_XDCS_SET;
  198. //    //退出正弦测试
  199. //    VS_XDCS_CLR;//选中数据传输
  200. //        VS_SPI_ReadWriteByte(0x45);
  201. //        VS_SPI_ReadWriteByte(0x78);
  202. //        VS_SPI_ReadWriteByte(0x69);
  203. //        VS_SPI_ReadWriteByte(0x74);
  204. //        VS_SPI_ReadWriteByte(0x00);
  205. //        VS_SPI_ReadWriteByte(0x00);
  206. //        VS_SPI_ReadWriteByte(0x00);
  207. //        VS_SPI_ReadWriteByte(0x00);
  208. //        Delay_ms(100);
  209. //        VS_XDCS_SET;
  210. }         
  211. //ram 测试
  212. //返回值:RAM测试结果
  213. // VS1053如果得到的值为0x83FF,则表明完好;                                                                                                                                                         
  214. u16 VS_Ram_Test(void)
  215. {
  216.         VS_HD_Reset();     
  217.         VS_WR_Cmd(SPI_MODE,0x0820);// 进入VS10XX的测试模式
  218.         while (VS_DREQ_IN==0); // 等待DREQ为高                          
  219.         VS_SPI_SpeedLow();//低速
  220.         VS_XDCS_CLR;                      // xDCS = 1,选择VS10XX的数据接口
  221.         VS_SPI_ReadWriteByte(0x4d);
  222.         VS_SPI_ReadWriteByte(0xea);
  223.         VS_SPI_ReadWriteByte(0x6d);
  224.         VS_SPI_ReadWriteByte(0x54);
  225.         VS_SPI_ReadWriteByte(0x00);
  226.         VS_SPI_ReadWriteByte(0x00);
  227.         VS_SPI_ReadWriteByte(0x00);
  228.         VS_SPI_ReadWriteByte(0x00);
  229.         Delay_ms(150);  
  230.         VS_XDCS_SET;
  231.         return VS_RD_Reg(SPI_HDAT0);// VS1053如果得到的值为0x83FF,则表明完好;   
  232. }                                               
  233. //向VS1053写命令
  234. //address:命令地址
  235. //data:命令数据
  236. void VS_WR_Cmd(u8 address,u16 data)
  237. {  
  238.         while(VS_DREQ_IN==0);//等待空闲                  
  239.         VS_SPI_SpeedLow();//低速           
  240.         VS_XDCS_SET;
  241.         VS_XCS_CLR;         
  242.         VS_SPI_ReadWriteByte(VS_WRITE_COMMAND);//发送VS10XX的写命令
  243.         VS_SPI_ReadWriteByte(address);         //地址
  244.         VS_SPI_ReadWriteByte(data>>8);         //发送高八位
  245.         VS_SPI_ReadWriteByte(data);                 //第八位
  246.         VS_XCS_SET;           
  247.         VS_SPI_SpeedHigh();                                //高速          
  248. }
  249. //向VS10XX写数据
  250. //data:要写入的数据
  251. void VS_WR_Data(u8 data)
  252. {
  253.         VS_SPI_SpeedHigh();//高速,对VS1003B,最大值不能超过36.864/4Mhz,这里设置为9M
  254.         VS_XDCS_CLR;   
  255.         VS_SPI_ReadWriteByte(data);
  256.         VS_XDCS_SET;      
  257. }         
  258. //读VS10XX的寄存器           
  259. //address:寄存器地址
  260. //返回值:读到的值
  261. //注意不要用倍速读取,会出错
  262. u16 VS_RD_Reg(u8 address)
  263. {
  264.         u16 temp=0;             
  265.   while(VS_DREQ_IN==0);//非等待空闲状态                   
  266.         VS_SPI_SpeedLow();//低速
  267.         VS_XDCS_SET;      
  268.         VS_XCS_CLR;      
  269.         VS_SPI_ReadWriteByte(VS_READ_COMMAND);        //发送VS10XX的读命令
  270.         VS_SPI_ReadWriteByte(address);               //地址
  271.         temp=VS_SPI_ReadWriteByte(0xff);                 //读取高字节
  272.         temp=temp<<8;
  273.         temp+=VS_SPI_ReadWriteByte(0xff);                 //读取低字节
  274.         VS_XCS_SET;     
  275.         VS_SPI_SpeedHigh();//高速          
  276.    return temp;
  277. }  
  278. //读取VS10xx的RAM
  279. //addr:RAM地址
  280. //返回值:读到的值
  281. u16 VS_WRAM_Read(u16 addr)
  282. {
  283.         u16 res;                                     
  284.         VS_WR_Cmd(SPI_WRAMADDR, addr);
  285.         res=VS_RD_Reg(SPI_WRAM);  
  286.         return res;
  287. }
  288. //写VS10xx的RAM
  289. //addr:RAM地址
  290. //val:要写入的值
  291. void VS_WRAM_Write(u16 addr,u16 val)
  292. {                               
  293.         VS_WR_Cmd(SPI_WRAMADDR,addr);        //写RAM地址
  294.         while(VS_DREQ_IN==0);                                 //等待空闲          
  295.         VS_WR_Cmd(SPI_WRAM,val);                 //写RAM值
  296. }
  297. //设置播放速度(仅VS1053有效)
  298. //t:0,1,正常速度;2,2倍速度;3,3倍速度;4,4倍速;以此类推
  299. void VS_Set_Speed(u8 t)
  300. {
  301.         VS_WRAM_Write(0X1E04,t);                //写入播放速度
  302. }
  303. //FOR WAV HEAD0 :0X7761 HEAD1:0X7665   
  304. //FOR MIDI HEAD0 :other info HEAD1:0X4D54
  305. //FOR WMA HEAD0 :data speed HEAD1:0X574D
  306. //FOR MP3 HEAD0 :data speed HEAD1:ID
  307. //比特率预定值,阶层III
  308. const u16 bitrate[2][16]=
  309. {
  310. {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0},
  311. {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}
  312. };
  313. //返回Kbps的大小
  314. //返回值:得到的码率
  315. u16 VS_Get_HeadInfo(void)
  316. {
  317.         unsigned int HEAD0;
  318.         unsigned int HEAD1;  
  319.         HEAD0=VS_RD_Reg(SPI_HDAT0);
  320.   HEAD1=VS_RD_Reg(SPI_HDAT1);
  321.   //printf("(H0,H1):%x,%x\n",HEAD0,HEAD1);
  322.         switch(HEAD1)
  323.         {        
  324.                         case 0x7665://WAV格式
  325.                         case 0X4D54://MIDI格式
  326.                         case 0X4154://AAC_ADTS
  327.                         case 0X4144://AAC_ADIF
  328.                         case 0X4D34://AAC_MP4/M4A
  329.                         case 0X4F67://OGG
  330.                         case 0X574D://WMA格式
  331.                         case 0X664C://FLAC格式
  332.                         {
  333.                                         //printf("HEAD0:%d\n",HEAD0);
  334.                                         HEAD1=HEAD0*2/25;//相当于*8/100
  335.                                         if((HEAD1%10)>5)return HEAD1/10+1;//对小数点第一位四舍五入
  336.                                         else return HEAD1/10;
  337.                         }
  338.                         default://MP3格式,仅做了阶层III的表
  339.                         {
  340.                                         HEAD1>>=3;
  341.                                         HEAD1=HEAD1&0x03;
  342.                                         if(HEAD1==3)HEAD1=1;
  343.                                         else HEAD1=0;
  344.                                         return bitrate[HEAD1][HEAD0>>12];
  345.                         }
  346.         }  
  347. }
  348. //得到平均字节数
  349. //返回值:平均字节数速度
  350. u32 VS_Get_ByteRate(void)
  351. {
  352.         return VS_WRAM_Read(0X1E05);//平均位速
  353. }
  354. //得到需要填充的数字
  355. //返回值:需要填充的数字
  356. u16 VS_Get_EndFillByte(void)
  357. {
  358.         return VS_WRAM_Read(0X1E06);//填充字节
  359. }  
  360. //发送一次音频数据
  361. //固定为32字节
  362. //返回值:0,发送成功
  363. //                 1,VS10xx不缺数据,本次数据未成功发送   
  364. u8 VS_Send_MusicData(u8* buf)
  365. {
  366.         u8 n;
  367.         if(VS_DREQ_IN!=0)  //送数据给VS10XX
  368.         {                                    
  369.                 VS_XDCS_CLR;  
  370.         for(n=0;n<32;n++)
  371.                 {
  372.                         VS_SPI_ReadWriteByte(buf[n]);                                
  373.                 }
  374.                 VS_XDCS_SET;                                       
  375.         }else return 1;
  376.         return 0;//成功发送了
  377. }
  378. //切歌
  379. //通过此函数切歌,不会出现切换“噪声”                               
  380. void VS_Restart_Play(void)
  381. {
  382.         u16 temp;
  383.         u16 i;
  384.         u8 n;          
  385.         u8 vsbuf[32];
  386.         for(n=0;n<32;n++)vsbuf[n]=0;//清零
  387.         temp=VS_RD_Reg(SPI_MODE);        //读取SPI_MODE的内容
  388.         temp|=1<<3;                                        //设置SM_CANCEL位
  389.         temp|=1<<2;                                        //设置SM_LAYER12位,允许播放MP1,MP2
  390.         VS_WR_Cmd(SPI_MODE,temp);        //设置取消当前解码指令
  391.         for(i=0;i<2048;)                        //发送2048个0,期间读取SM_CANCEL位.如果为0,则表示已经取消了当前解码
  392.         {
  393.                 if(VS_Send_MusicData(vsbuf)==0)//每发送32个字节后检测一次
  394.                 {
  395.                         i+=32;                                                //发送了32个字节
  396.                            temp=VS_RD_Reg(SPI_MODE);        //读取SPI_MODE的内容
  397.                         if((temp&(1<<3))==0)break;        //成功取消了
  398.                 }       
  399.         }
  400.         if(i<2048)//SM_CANCEL正常
  401.         {
  402.                 temp=VS_Get_EndFillByte()&0xff;//读取填充字节
  403.                 for(n=0;n<32;n++)vsbuf[n]=temp;//填充字节放入数组
  404.                 for(i=0;i<2052;)
  405.                 {
  406.                         if(VS_Send_MusicData(vsbuf)==0)i+=32;//填充          
  407.                 }          
  408.         }else VS_Soft_Reset();          //SM_CANCEL不成功,坏情况,需要软复位           
  409.         temp=VS_RD_Reg(SPI_HDAT0);
  410.     temp+=VS_RD_Reg(SPI_HDAT1);
  411.         if(temp)                                        //软复位,还是没有成功取消,放杀手锏,硬复位
  412.         {
  413.                 VS_HD_Reset();                           //硬复位
  414.                 VS_Soft_Reset();                  //软复位
  415.         }
  416. }
  417. //重设解码时间                          
  418. void VS_Reset_DecodeTime(void)
  419. {
  420.         VS_WR_Cmd(SPI_DECODE_TIME,0x0000);
  421.         VS_WR_Cmd(SPI_DECODE_TIME,0x0000);//操作两次
  422. }
  423. //得到mp3的播放时间n sec
  424. //返回值:解码时长
  425. u16 VS_Get_DecodeTime(void)
  426. {                
  427.         u16 dt=0;         
  428.         dt=VS_RD_Reg(SPI_DECODE_TIME);      
  429.         return dt;
  430. }                                                       
  431. //vs10xx装载patch.
  432. //patch:patch首地址
  433. //len:patch长度
  434. void VS_Load_Patch(u16 *patch,u16 len)
  435. {
  436.         u16 i;
  437.         u16 addr, n, val;                                     
  438.         for(i=0;i<len;)
  439.         {
  440.                 addr = patch[i++];
  441.                 n    = patch[i++];
  442.                 if(n & 0x8000U) //RLE run, replicate n samples
  443.                 {
  444.                         n  &= 0x7FFF;
  445.                         val = patch[i++];
  446.                         while(n--)VS_WR_Cmd(addr, val);  
  447.                 }else //copy run, copy n sample
  448.                 {
  449.                         while(n--)
  450.                         {
  451.                                 val = patch[i++];
  452.                                 VS_WR_Cmd(addr, val);
  453.                         }
  454.                 }
  455.         }        
  456. }                             
  457. //设定VS10XX播放的音量和高低音
  458. //volx:音量大小(0~254)
  459. void VS_Set_Vol(u8 volx)
  460. {
  461.     u16 volt=0;                         //暂存音量值
  462.     volt=254-volx;                        //取反一下,得到最大值,表示最大的表示
  463.         volt<<=8;
  464.     volt+=254-volx;                        //得到音量设置后大小
  465.     VS_WR_Cmd(SPI_VOL,volt);//设音量
  466. }
  467. //设定高低音控制
  468. //bfreq:低频上限频率        2~15(单位:10Hz)
  469. //bass:低频增益                        0~15(单位:1dB)
  470. //tfreq:高频下限频率         1~15(单位:Khz)
  471. //treble:高频增益                   0~15(单位:1.5dB,小于9的时候为负数)
  472. void VS_Set_Bass(u8 bfreq,u8 bass,u8 tfreq,u8 treble)
  473. {
  474.     u16 bass_set=0; //暂存音调寄存器值
  475.     signed char temp=0;            
  476.         if(treble==0)temp=0;                           //变换
  477.         else if(treble>8)temp=treble-8;
  478.         else temp=treble-9;  
  479.         bass_set=temp&0X0F;                                //高音设定
  480.         bass_set<<=4;
  481.         bass_set+=tfreq&0xf;                        //高音下限频率
  482.         bass_set<<=4;
  483.         bass_set+=bass&0xf;                                //低音设定
  484.         bass_set<<=4;
  485.         bass_set+=bfreq&0xf;                        //低音上限   
  486.         VS_WR_Cmd(SPI_BASS,bass_set);        //BASS
  487. }
  488. //设定音效
  489. //eft:0,关闭;1,最小;2,中等;3,最大.
  490. void VS_Set_Effect(u8 eft)
  491. {
  492.         u16 temp;         
  493.         temp=VS_RD_Reg(SPI_MODE);        //读取SPI_MODE的内容
  494.         if(eft&0X01)temp|=1<<4;                //设定LO
  495.         else temp&=~(1<<5);                        //取消LO
  496.         if(eft&0X02)temp|=1<<7;                //设定HO
  497.         else temp&=~(1<<7);                        //取消HO                                                  
  498.         VS_WR_Cmd(SPI_MODE,temp);        //设定模式   
  499. }         

  500. ///////////////////////////////////////////////////////////////////////////////
  501. //设置音量,音效等.
  502. void VS_Set_All(void)                                
  503. {                         
  504.         VS_Set_Vol(vsset.mvol);                        //设置音量
  505.         VS_Set_Bass(vsset.bflimit,vsset.bass,vsset.tflimit,vsset.treble);  
  506.         VS_Set_Effect(vsset.effect);        //设置空间效果
  507. }



  508. /*--------------  以上是VS1053驱动部分 -------------------------*/
  509. /*--------------  下面开始是音乐播放部分 -------------------------*/
  510. #include "ff.h"
  511. #include "bsp_led.h"   
  512. /*
  513. ************************************************************************
  514. *                                                  FatFs
  515. ************************************************************************
  516. */


  517. FRESULT result;
  518. FIL file;
  519. UINT bw;

  520. static uint8_t  buffer[BUFSIZE];

  521. //播放歌曲
  522. void vs1053_player_song(uint8_t *filepath)
  523. {
  524.         uint16_t i=0;
  525.        
  526.         VS_Restart_Play();                                         
  527.         VS_Set_All();                                                                 
  528.         VS_Reset_DecodeTime();
  529.        
  530.         if(strstr((const char*)filepath,".flac")||strstr((const char*)filepath,".FLAC"))//检索字符
  531.                 VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
  532.        
  533.         result=f_open(&file,(const TCHAR*)filepath,FA_READ);

  534.         if(result==0)
  535.         {
  536.                 VS_SPI_SpeedHigh();                                  
  537.                 while(1)
  538.                 {
  539.                         i=0;       
  540.                         result=f_read(&file,buffer,BUFSIZE,(UINT*)&bw);               
  541.                         do
  542.                         {         
  543.                                 if(VS_Send_MusicData(buffer+i)==0)
  544.                                 {
  545.                                         i+=32;
  546.                                 }
  547.                         }while(i<bw);
  548.                        
  549.                         if(bw!=BUFSIZE||result!=0)
  550.                         {
  551.                                 break;          
  552.                         }
  553.                         LED2_TOGGLE;
  554.                 }
  555.                 f_close(&file);
  556.         }                                                                 
  557. }

  558. /*--------------  END OF FILE -----------------------*/
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩1
回复

使用道具 举报

沙发
ID:257841 发表于 2017-12-5 19:16 | 只看该作者
看看,正需要呢。。。。。。。。。。。。。。。。。
回复

使用道具 举报

板凳
ID:278890 发表于 2018-4-18 15:00 | 只看该作者
good
回复

使用道具 举报

地板
ID:322575 发表于 2018-5-19 12:42 | 只看该作者
谢谢分享,先下载 有时间慢慢研究
回复

使用道具 举报

5#
ID:333604 发表于 2018-5-19 13:12 | 只看该作者
这个是MP3 解码吧
回复

使用道具 举报

6#
ID:225778 发表于 2018-5-19 16:49 | 只看该作者
多谢楼主分享啊,使用的很好
回复

使用道具 举报

7#
ID:737501 发表于 2020-8-28 19:37 | 只看该作者
请问如何实现暂停与播放的功能呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表