//初始化VS10XX的IO口 void VS_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //DREQ PC.7 RCC_APB2PeriphClockCmd(VS_DQ_RCC, ENABLE); //使能Px端口时钟 GPIO_InitStructure.GPIO_Pin = VS_DQ_PIN; //PC.7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(VS_DQ_GPIO, &GPIO_InitStructure); //RES PE.0 RCC_APB2PeriphClockCmd(VS_RST_RCC, ENABLE); //使能Px端口时钟 GPIO_InitStructure.GPIO_Pin = VS_RST_PIN; //PE6 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出 GPIO_Init(VS_RST_GPIO, &GPIO_InitStructure); //CS PB.12 RCC_APB2PeriphClockCmd(VS_XCS_RCC, ENABLE); //使能Px端口时钟 GPIO_InitStructure.GPIO_Pin = VS_XCS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(VS_XCS_GPIO, &GPIO_InitStructure); //XDCS PC.6 RCC_APB2PeriphClockCmd(VS_XDCS_RCC, ENABLE); //使能Px端口时钟 GPIO_InitStructure.GPIO_Pin = VS_XDCS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(VS_XDCS_GPIO, &GPIO_InitStructure); SPI_INIT(); VS_Sine_Test(); //USART_OUT(DEBUG_USART, "Ram Test:0X%04X\r\n", VS_Ram_Test()); //打印RAM测试结果 VS_HD_Reset(); VS_Soft_Reset(); VS_Restart_Play(); //重启播放 VS_Set_All(); //设置音量等信息 VS_Reset_DecodeTime(); //复位解码时间 VS_SPI_SpeedHigh(); //高速 VS_Set_Vol(250); }
/////////////////////////////////////////////////////////////////////////////// //设置音量,音效等. void VS_Set_All(void) { VS_Set_Vol(vsset.mvol); VS_Set_Bass(vsset.bflimit, vsset.bass, vsset.tflimit, vsset.treble); VS_Set_Effect(vsset.effect); }
//播放一曲指定的歌曲 //pname:歌曲路径+名字 //返回值:0,正常播放完成 // 1,下一曲 // 2,上一曲 // 0XFF,出现错误了 u8 MP3_playSong(const char *pName) { FIL* fmp3; u16 br; u8 res,rval; u8 *databuf; u16 i=0; u8 key; //static u8 pause=0; //暂停标志 static u8 lastVol = 0; //上一次音量 //u8 j = 0; rval=0; fmp3=(FIL*)malloc(sizeof(FIL)); //申请内存 databuf=(u8*)malloc(READ_MP3_SIZE); //开辟4096字节的内存区域 if(databuf==NULL||fmp3==NULL)rval=0XFF ;//内存申请失败. if(rval==0) { VS_HD_Reset(); VS_Soft_Reset(); lastVol = vsset.mvol; mp3_vol_show((vsset.mvol-100)/5); //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30 VS_Restart_Play(); //重启播放 VS_Set_All(); //设置音量等信息 VS_Reset_DecodeTime(); //复位解码时间 /*res=f_typetell(pname); //得到文件后缀 if(res==0x4c)//如果是flac,加载patch { VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN); } */ res=f_open(fmp3,(const TCHAR*)pName,FA_READ);//打开文件 //printf("sram :%d",mem_perused(0)); if(res==0)//打开成功. { VS_SPI_SpeedHigh(); //高速 while(rval==0) { res=f_read(fmp3,databuf,READ_MP3_SIZE,(UINT*)&br);//读出4096个字节 i=0; if (lastVol != vsset.mvol) //检测音量是否重新配置 { VS_Set_Vol(vsset.mvol); lastVol = vsset.mvol; //保存到配置文件 } #if 1 do//主播放循环 { if((VS_Send_MusicData(databuf+i)==0))//给VS10XX发送音频数据 { i+=32; } else { key=KEY_getValue(); switch(key) { case KEY_UP: printf("+++++++++++++++++++++++++++key up\r\n"); rval=KEY_UP; //跳出 break; default: break; } //mp3_msg_show(fmp3->fsize);//显示信息 } }while(i<READ_MP3_SIZE);//循环发送4096个字节 #endif if(br!=READ_MP3_SIZE||res!=0) { rval=KEY_UP; break;//读完了. } } f_close(fmp3); }else rval=0XFF;//出现错误 } if (databuf != NULL) free(databuf); if (fmp3 != NULL) free(fmp3); return rval; }