OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4302|回复: 3

音频开启SD卡DMA读取之后,会有哒哒声音

[复制链接]

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
447
金钱
447
注册时间
2020-7-16
在线时间
85 小时
发表于 2020-11-8 12:41:35 | 显示全部楼层 |阅读模式
50金钱
使用L4平台和W8978用来做音频模块,按照网上的步骤,用cube初始化SDIO,双DMA传输,文件系统,现在发现,音乐有哒哒声,一直没找到原因,打断点发现,每次哒哒声出现在读取SD卡的那段DMA传输代码里,用DMA填充一次缓存数组就会哒一声,求大神帮忙看下,实在想不出什么解决办法了。主要就出现在这个函数里,过一次这个函数就会响一声,SD_DMAConfigRx是自己按照网上教程加的。
__weak uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks)
{
  uint8_t sd_state = MSD_OK;
  /* Read block(s) in DMA transfer mode */
  if(SD_DMAConfigRx(&hsd1) != HAL_OK)
{
  return MSD_ERROR;
}

  if (HAL_SD_ReadBlocks_DMA(&hsd1, (uint8_t *)pData, ReadAddr, NumOfBlocks) != HAL_OK)
  {
    sd_state = MSD_ERROR;
  }
  return sd_state;
}


HAL_StatusTypeDef SD_DMAConfigRx(SD_HandleTypeDef *hsd)
{
  HAL_StatusTypeDef status = HAL_ERROR;
  /* Deinitialize the Channel for new transfer */
  HAL_DMA_DeInit(&hdma_sdmmc1_tx);//注意这里!!!DeInit的是另一个通道!!!
  /* Configure the DMA Channel */
  status = HAL_DMA_Init(&hdma_sdmmc1_rx);
  return (status);
}






最佳答案

查看完整内容[请看2#楼]

原因找到了,是硬件问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
447
金钱
447
注册时间
2020-7-16
在线时间
85 小时
 楼主| 发表于 2020-11-8 12:41:36 | 显示全部楼层
原因找到了,是硬件问题。
回复

使用道具 举报

5

主题

356

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4675
金钱
4675
注册时间
2019-4-30
在线时间
904 小时
发表于 2020-11-8 13:52:09 | 显示全部楼层
估计你要在播放玩一段缓存前,就要读取完下一段音频了,不然会切换等待读取完,会有空缺期
回复

使用道具 举报

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
447
金钱
447
注册时间
2020-7-16
在线时间
85 小时
 楼主| 发表于 2020-11-8 14:28:26 | 显示全部楼层
a1281854907 发表于 2020-11-8 13:52
估计你要在播放玩一段缓存前,就要读取完下一段音频了,不然会切换等待读取完,会有空缺期

有点找不到思路,因为播放的SAI外设也是用的DMA,然后DMA开了两个中断,一个是传输完成,一个是传输一半的。这个是DMA的中断服务函数,下面那段是播放一首曲子的函数。
void DMA2_Channel1_IRQHandler(void)
{
        if( __HAL_DMA_GET_FLAG(&SAI1_TXDMA_Handler,DMA_FLAG_TC1) != RESET )
        {
                __HAL_DMA_CLEAR_FLAG(&SAI1_TXDMA_Handler,DMA_FLAG_TC1);
                wavtransferend = WAV_SAI_TX_DMA_BUFSIZE/2;
        }
        if( __HAL_DMA_GET_FLAG(&SAI1_TXDMA_Handler,DMA_FLAG_HT1) != RESET )
        {
                __HAL_DMA_CLEAR_FLAG(&SAI1_TXDMA_Handler,DMA_FLAG_HT1);
                wavtransferend = 0;
        }
}

/*播放音乐*/
                        audio_stop();
                        res=f_open(audiodev.file,(TCHAR*)fname,FA_READ);        //打开文件
                        if(res==0)
                        {
                                f_lseek(audiodev.file, wavctrl.datastart);                //跳过文件头
                                fillnum=wav_buffill(audiodev.saibuf,WAV_SAI_TX_DMA_BUFSIZE,wavctrl.bps);
                                audio_start();
HAL_SAI_Transmit_DMA(&SAI1A_Handler,audiodev.saibuf,WAV_SAI_TX_DMA_BUFSIZE/2);
                                while(res==0)
                                {
                                        while(wavtransferend==-1)//等待wav传输完成;
                                        {
                                                if(fillnum<(WAV_SAI_TX_DMA_BUFSIZE/2))//播放结束播放下一首
                                                {
                                                        res=1;
                                                        break;
                                                }
                                        }
                                        loc = wavtransferend;
                                        wavtransferend=-1;
                                        fillnum=wav_buffill(audiodev.saibuf+loc,WAV_SAI_TX_DMA_BUFSIZE/2,wavctrl.bps);
                                        wav_get_curtime(audiodev.file,&wavctrl);//得到总时间和当前播放的时间
                                }
                                audio_stop();
                        }


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 22:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表