Funpack11期 LPC55S69开发板 读取SD卡wav音频文件播放
实现功能: 1、识别SD卡; 2、建立文件系统; 3、查找根目录.wav音频文件; 4、读取.wav音频文件数据流; 5、通过i2s输送音频数据至wm8904,实现声音播放。
标签
嵌入式系统
测试
接口
Devin
更新2021-11-03
1136
  • 实现的功能
    • 读取SD卡根目录中的wav音频文件,使用板卡上的3.5mm音频接口播放音乐。
  • 各个功能对应的主要代码片段及说明
    • 读取SD卡中的音频文件;
    PRINTF("\r\nList the file in root directory......\r\n");
    if (f_opendir(&directory, ""))
    {
        PRINTF("Open root directory failed.\r\n");
        return -1;
    }

    for (;;)
    {
        error = f_readdir(&directory, &fileInformation);

        /* To the end. */
        if ((error != FR_OK) || (fileInformation.fname[0U] == 0U))
        {
            break;
        }
        if (fileInformation.fname[0] == '.')
        {
            continue;
        }
        if (fileInformation.fattrib & AM_DIR)
        {
            PRINTF("Directory file : %s.\r\n", fileInformation.fname);
        }
        else
        {
            PRINTF("General file : %s.\r\n", fileInformation.fname);
        }
				
				char* pFileNameChar=strrchr(fileInformation.fname,'.');
				if(strcmp(pFileNameChar,".WAV")==0)
				{
					PRINTF("find xxx.wav file success : %s.\r\n", fileInformation.fname);
					strcpy(g_wav_file_name,fileInformation.fname);
					g_flag_wav_file_exist = 1;
					break;
				}
				
    }

遍历根目录,查找音频文件后缀为.wav,记录文件名,随后打开文件。

        

  • 使用音频接口播放音乐
static void StartSoundPlayback(void)
{
    PRINTF("Setup looping playback of swallow wave\r\n");

//    s_TxTransfer.data     = &g_Music[0];
//    s_TxTransfer.dataSize = sizeof(g_Music);
		
		//new start
    s_TxTransfer.data     = &g_bufferReadMusic[0];
    s_TxTransfer.dataSize = (sizeof(g_bufferReadMusic)/4)*4;	
		//new end

    I2S_TxTransferCreateHandleDMA(DEMO_I2S_TX, &s_TxHandle, &s_DmaTxHandle, TxCallback, (void *)&s_TxTransfer);
    /* need to queue two transmit buffers so when the first one
     * finishes transfer, the other immediatelly starts */
    I2S_TxTransferSendDMA(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer);
    I2S_TxTransferSendDMA(DEMO_I2S_TX, &s_TxHandle, s_TxTransfer);
}

static void TxCallback(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData)
{
    /* Enqueue the same original buffer all over again */
    i2s_transfer_t *transfer = (i2s_transfer_t *)userData;
		//new start
		if(g_buff_num)
		{
			s_TxTransfer.data=&g_bufferReadMusic_test[0];
			s_TxTransfer.dataSize = (sizeof(g_bufferReadMusic_test)/4)*4;
			g_buff_num=0;//pointer to null buff
		}
		else
		{
			s_TxTransfer.data=&g_bufferReadMusic[0];
			s_TxTransfer.dataSize = (sizeof(g_bufferReadMusic)/4)*4;
			g_buff_num=1;//pointer to null buff
		}
		//new end
    I2S_TxTransferSendDMA(base, handle, *transfer);
		g_buff_refresh_flag=1; //need to refresh mem
}
//new end

使用双缓存,播放时另外一个缓存加载新数据,播放完一个缓存,立即切换到另外一个已经加载好的缓存,实现无缝播放。

  • 功能展示及说明
    • 打印调试信息

FjB71WC0Y_2Z-VlX-9CLjq8-jcN-

  • 音乐播放

FoQ78TKOZ8e_6uMb9B8VrENoAtoZ

  • 本活动的心得体会
    • nxp开发板和开发环境非常好用
      • MCUXpresso Config Tools 目前使用稳定,功能很强大,尤其配合SDK使用nxp的官方例程,基本只需要小修改,就能实现很多底层功能。从而大大节省开发时间,也不容易出错;
      • Nxp开发板自带cmsis dap的功能,非常好用,且集成了uart串行打印接口,非常棒!基本一个开发板,一根线就搞定所有,太方便了。
      • 通过做活动,学习了很多新知识:SD卡驱动、文件系统概念和操作、音频文件格式、音频编解码、OS系统,等。
    •  加深了对学习平台的了解,比如电子森林和硬禾、B站等。
      • 以前自学电子开发,很容易半途而非,主要是没有目标或者具体的项目来做。第一次发现有“你做项目,我买单“的平台,非常新颖。eetree这么好的平台,希望能一直搞下去,自己也会一直支持。  
  •  
附件下载
sdcard_fatfs_i2s_dma_transfer_v3.zip
播放sd卡根目录.WAV音频文件的例程
团队介绍
个人喜欢收集开发板,用于小的电子项目的开发。在各种折腾中提升自我。
团队成员
devin
喜欢折腾电子开发板,擅长单片机开发。
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号