内容介绍
内容介绍
- 实现的功能
- 读取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
使用双缓存,播放时另外一个缓存加载新数据,播放完一个缓存,立即切换到另外一个已经加载好的缓存,实现无缝播放。
- 功能展示及说明
- 打印调试信息
- 音乐播放
- 本活动的心得体会
- nxp开发板和开发环境非常好用
- MCUXpresso Config Tools 目前使用稳定,功能很强大,尤其配合SDK使用nxp的官方例程,基本只需要小修改,就能实现很多底层功能。从而大大节省开发时间,也不容易出错;
- Nxp开发板自带cmsis dap的功能,非常好用,且集成了uart串行打印接口,非常棒!基本一个开发板,一根线就搞定所有,太方便了。
- 通过做活动,学习了很多新知识:SD卡驱动、文件系统概念和操作、音频文件格式、音频编解码、OS系统,等。
- 加深了对学习平台的了解,比如电子森林和硬禾、B站等。
- 以前自学电子开发,很容易半途而非,主要是没有目标或者具体的项目来做。第一次发现有“你做项目,我买单“的平台,非常新颖。eetree这么好的平台,希望能一直搞下去,自己也会一直支持。
- nxp开发板和开发环境非常好用
附件下载
sdcard_fatfs_i2s_dma_transfer_v3.zip
播放sd卡根目录.WAV音频文件的例程
团队介绍
个人喜欢收集开发板,用于小的电子项目的开发。在各种折腾中提升自我。
团队成员
devin
喜欢折腾电子开发板,擅长单片机开发。
评论
0 / 100
查看更多