久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11820|回復: 7
打印 上一主題 下一主題
收起左側

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 | 只看該作者
請問如何實現暫停與播放的功能呢
回復

使用道具 舉報

8#
ID:1146468 發表于 2025-3-27 16:41 | 只看該作者
看看咋樣
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 伊人网综合在线观看 | 天天综合永久入口 | 精品在线看 | 日韩爱爱网站 | 一区二区在线免费观看 | 欧美日韩国产在线观看 | 亚洲国产欧美一区二区三区久久 | 一区二区三区在线看 | 午夜久久久久久久久久一区二区 | 国产网站在线免费观看 | 日本一区二区三区四区 | 一区二区中文字幕 | 91精品国产综合久久精品 | 日韩欧美国产精品一区二区三区 | 欧美专区在线视频 | 成人免费在线观看 | 国产特黄一级 | 久久国产精品免费一区二区三区 | 欧美二区三区 | 久草.com| 99精品久久久 | 日韩精品视频网 | 久久国产精品99久久久大便 | 亚洲精品自在在线观看 | 日韩三片 | 亚洲 欧美 另类 综合 偷拍 | 日本视频一区二区 | 黄色免费av | 99久久精品免费看国产免费软件 | 9久久精品 | 天天爱天天操 | 国产精品毛片 | 天堂网中文字幕在线观看 | 91福利在线导航 | 69福利影院| 亚洲欧美国产毛片在线 | 欧美日韩综合视频 | 日韩欧美第一页 | 日韩喷潮 | 精品亚洲一区二区三区 | 色资源在线 |