Funpacke第11期之LPC55S69播放SD卡中的WAV音频文件
此次用LPC55S69评估版最终实现了读取SD卡中的WAV音频文件,并通过板子上面的3.5mm耳机接口播放出来.
标签
嵌入式系统
测试
zhaolin0912
更新2021-10-28
838

一.实现功能:

此次用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成功

FtIQm0z3xo2SJBcT6a4HTgb5V3CY

 

2.播放音乐时led闪烁

Fvc5bGsk8fGxVCr00D42D08GpWOT

 

3.音乐播放完成led一直点亮或熄灭

Fvc5bGsk8fGxVCr00D42D08GpWOT

FqPq9weEcXF5J44GSw-JEnY-gbXg

4.转换格式得到WAV文件

FtDn0Bz7_u165oE1hiZM3wYkh2xn

四.硬件介绍:

FmYxA4wQeCJ9nLnAq2wSOywA3yJ7

五.心得体会:

很感谢硬禾学堂禾和Digi-Key联合举办的fupack活动,使自己在做项目中提升了自己的技能.通过此次活动,感觉自己还有很多的不足,但又不知道怎么改进.因为WAV文件是非压缩文件,所以播放WAV音频文件做起来比较简单.虽然WAV音乐可以正常播放,但是在播放音乐的时候有时候可以明显听见有电流声(可能是杂声,有的人说是滤波没做好,后面我还想具体学习一下滤波),希望能活动结束后参考一下网友的代码,看一看是哪里出了问题.最后我认为对于我们学生来说参加一次这样的活动意义很大,通过参加项目可以让我们发现自己喜欢的一方面和不喜欢的一方面,有助于在大学更好确定自己今后的发展方向.

附件下载
LPC55S69_Project_play_sdcard_wave.rar
团队介绍
我是来自安徽师范大学20级电子信息类专业的一名学生.在大学想参加一下比赛,所以通过此次活动来增加自己学习的机会.冲冲冲.
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号