内容介绍
内容介绍
一.实现功能:
此次用LPC55S69评估版最终实现了读取SD卡中的WAV音频文件,并通过板子上面的3.5mm耳机接口播放出来.
二.代码展示:
//主要用到的函数
uint8_t decode_wav(uint8_t* fname, WaveInformation* wavx);//解码wave文件
void start_wav(void);//播放开头buffer
void loop_playback_wav(void);//循环播放buffer
void call_back(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData);//播放反馈
void fill_buffer(uint8_t *buf,uint16_t size,uint8_t bits);//填充buffer
void fill_which_buffer(uint8_t n);//填充哪个buffer?
void play_which_buffer(uint8_t n);//播放哪个buffer?
void initialize_wm8904(void);//初始化wm8904
void play_music(char* fname);//播放音乐
void music_finish(void);//音乐播放结束,关闭文件
//函数具体功能
//将音频数据填进buffer中,如果数据不够音乐结束
void fill_buffer(uint8_t *buffer,uint16_t size,uint8_t bits){
uint32_t bytes_read;
uint16_t i;
f_read(&(bufferinformation.file),buffer,size,(UINT*)&bytes_read);
if(bytes_read<size) //数据不够在后面补0
{
bufferinformation.finish_flag=1;//音乐播放结束
for(i=bytes_read;i<size-bytes_read;i++)
buffer[i]=0;
}
else bufferinformation.finish_flag=2;//音乐播放未结束
}
//准备2个buffer,填入哪个buffer?
void fill_which_buffer(uint8_t number){
if(number == 1)
{
fill_buffer(bufferinformation.buffer1, 4096, waveinformation.bps);
}
if(number == 2)
{
fill_buffer(bufferinformation.buffer2, 4096, waveinformation.bps);
}
}
//选择播放已经填好的buffer
void play_which_buffer(uint8_t n){
if (n == 1) {
g_IISTransfer.data = bufferinformation.buffer1;
g_IISTransfer.dataSize = 4096;
I2S_TxTransferSendDMA(I2S7, &FLEXCOMM7_Tx_DMA_Handle, *(i2s_transfer_t*)&g_IISTransfer);
} else if (n == 2)
g_IISTransfer.data = bufferinformation.buffer2;
g_IISTransfer.dataSize = 4096;
I2S_TxTransferSendDMA(I2S7, &FLEXCOMM7_Tx_DMA_Handle,
(i2s_transfer_t) g_IISTransfer);
}
//播放音乐的开头,先播放两个buffer
void start_wav(void){
fill_which_buffer(1);
fill_which_buffer(2);
play_which_buffer(1);
delay_ms(21);//写入一定的延迟,缓冲音乐的播放
}
//循环播放音乐
void loop_playback_wav(void){
//if( bufferinformation.dma_finish==0)
//{
play_which_buffer(2);
fill_which_buffer(1);
//}
delay_ms(21);
//if( bufferinformation.dma_finish==0)
//{
play_which_buffer(1);
fill_which_buffer(2);
//}
delay_ms(21);
}
//根据音乐的名字,选择播放音乐,在后面主函数中均以music.wav命名
void play_music(char* fname){
decode_wav((uint8_t*)fname,&waveinformation);//得到文件的信息
f_open(&(bufferinformation.file), (TCHAR*)fname, FA_READ); //打开文件
//2-跳过文件头
f_lseek(&(bufferinformation.file), waveinformation.datastart);
I2S_TxTransferCreateHandleDMA(I2S7, &FLEXCOMM7_Tx_DMA_Handle, &FLEXCOMM7_TX_Handle, call_back, (void *)&g_IISTransfer);
}
//中断反馈
void call_back(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData)
{
// if(bufferinformation.dma_finish==1||bufferinformation.dma_finish==2)
// {
// bufferinformation.dma_finish=0;
// }
LED_BLUE_TOGGLE();
}
//音乐播放结束关闭文件
void music_finish(void){
f_close(&(bufferinformation.file));
}
//main函数
int main(void) {
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitBootPeripherals();
BOARD_InitDebugConsole();
SYSCON->MCLKIO = 1U;
SysTick_Config(SystemCoreClock / 1000U);
BOARD_I2C_Init(I2C4, 12000000);
initialize_wm8904();
SdcarInit();
play_music(_T("music.wav"));
start_wav();
if(bufferinformation.finish_flag==1)
{
music_finish();//音乐很短直接2个buffer播完
}
while(bufferinformation.finish_flag==2) {
loop_playback_wav();
__asm volatile ("nop");
}
music_finish();
return 0 ;
}
三.功能演示:
程序下入板中,插入SD卡播放WAV音乐文件的时候板载LED灯闪烁 ,用3.5mm耳机插入板上就可以听见SD卡中的WAV音频文件播放出来了.
1.初始化硬件解码WAV成功
2.播放音乐时led闪烁
3.音乐播放完成led一直点亮或熄灭
4.转换格式得到WAV文件
四.硬件介绍:
五.心得体会:
很感谢硬禾学堂禾和Digi-Key联合举办的fupack活动,使自己在做项目中提升了自己的技能.通过此次活动,感觉自己还有很多的不足,但又不知道怎么改进.因为WAV文件是非压缩文件,所以播放WAV音频文件做起来比较简单.虽然WAV音乐可以正常播放,但是在播放音乐的时候有时候可以明显听见有电流声(可能是杂声,有的人说是滤波没做好,后面我还想具体学习一下滤波),希望能活动结束后参考一下网友的代码,看一看是哪里出了问题.最后我认为对于我们学生来说参加一次这样的活动意义很大,通过参加项目可以让我们发现自己喜欢的一方面和不喜欢的一方面,有助于在大学更好确定自己今后的发展方向.
软硬件
附件下载
LPC55S69_Project_play_sdcard_wave.rar
团队介绍
我是来自安徽师范大学20级电子信息类专业的一名学生.在大学想参加一下比赛,所以通过此次活动来增加自己学习的机会.冲冲冲.
评论
0 / 100
查看更多
猜你喜欢
Funpack-第11期 使用LCP55S69完成读取SD卡中的音频文件并播放使用LCP55S69的SD卡槽和3.5mm的音频线完成读取SD卡中的音频文件并播放
一颗星
1053
Funpack第11期用LPC55S69播放tf卡中的音乐Funpack第11期使用用LPC55S69播放tf卡中的音乐,主要使用到FATFS以及I2S。
山茶半两
882
Funpack11期 LPC55S69开发板 读取SD卡wav音频文件播放实现功能:
1、识别SD卡;
2、建立文件系统;
3、查找根目录.wav音频文件;
4、读取.wav音频文件数据流;
5、通过i2s输送音频数据至wm8904,实现声音播放。
Devin
1136