OpenEdv-开源电子网

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

用STM32控制SD卡输出WAV音乐到WM8731,音频有噪声的问题,请教原子或懂的人。

[复制链接]

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-4-1
在线时间
1 小时
发表于 2013-10-31 20:53:30 | 显示全部楼层 |阅读模式
   我参考MINI板关于音乐播放器的例子,调试用WM8731输出WAV文件,具体操作过程如下:
SD卡使用FATFS文件系统,存储音乐为8K采样,16BIT,双声道立体声。程序参考了原子的MINI板的例程,之前我也在MINI板子上调试过1050。
我先用SPI从SD卡取出WAV文件的512个字节存入缓存,然后用DMA控制I2S方式把这512字节数据送给WM8731,循环读取发送,直到音乐结束。
音乐可以正常听出来,但是出现比较大的噪声。
我试验了一下,将音乐数据直接存入单片机FLASH,然后DMA方式I2S送数据到8731,音质很好。应该不是这一部分的问题。
请教下出现问题的原因是什么?是缓存不够么?
谢谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-10-31 21:39:24 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-1 09:12:04 | 显示全部楼层
回复【楼主位】wushanyu1:
---------------------------------
缓存稍小,1K~2K比较合适,而且需要用双缓存,一个用DMA给DAC送数据的同时 另外一个从SD卡读取数据。

你现在的工作方式如果是单缓存,过程就是把数据从SD卡拿出放到缓存,再把缓存数据DMA到DAC,等传完了再取数据。中间SD卡读取是很慢的,数据会断流。
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-4-1
在线时间
1 小时
 楼主| 发表于 2013-11-1 13:42:20 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
MINI板上是没有I2S的,我最开始先用VS1050调试了一下例程,同样是播放WAV音乐,缓存都是512字节,为啥VS1050一点不卡?用8731就有噪音?不理解。
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-4-1
在线时间
1 小时
 楼主| 发表于 2013-11-1 13:51:37 | 显示全部楼层
是的,这个地方的确是有问题,我实际用示波器测试8731的输出,发现音频信号每隔17MS左右会出现一个1.6MS左右的空白期。如下图:


但我感觉不会对音质有多大影响吧?


回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-4-1
在线时间
1 小时
 楼主| 发表于 2013-11-1 13:53:33 | 显示全部楼层
回复【3楼】ricefat:
---------------------------------
谢谢
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-1 17:33:08 | 显示全部楼层
回复【楼主位】wushanyu1:
---------------------------------
8k采样率,16bit位宽,声道2,一秒声音需要32000字节。 512字节只够16ms的,和你示波器图示基本吻合。 那你开两个512字节的buffer就行了,一个从SD读数据另外一个DMA给DAC,交替运行就可以保证数据不断流。

至于VS1050不断流,应该是填数据的信号已经预留了时间。
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-4-1
在线时间
1 小时
 楼主| 发表于 2013-11-1 22:39:33 | 显示全部楼层
回复【7楼】ricefat:
---------------------------------
 ricefat 你好,谢谢你给的建议。
我还想请教一下,通过什么样的流程来实现这种交互式的操作,即在从SD卡读取数据存入缓存1的同时,把缓存2中的数据发送到I2S总线上去?
需要使用DMA中断的方式么?我搞STM32的编程实践补偿,以前主要做硬件,没多少经验,也不太懂。
是不是可以这样理解:8k采样率,16bit位宽,双声道的数据,512个字节发送到I2S,时间是16ms,而从示波器上看,STM32从SD卡读取这512字节需要时间是1.6ms左右,我只要在DMA发送数据到I2S这16MS,等待DMA传输完成标志位的过程中,在程序上让STM32来读取SD卡中的下一个512字节(只需1.6ms),完全不会影响待DMA传输完成标志位的判断?
我现在用的是这种判断方式:
while(1) 
{
   if(DMA_GetFlagStatus(DMA2_FLAG_TC2)!=RESET) //判断通道2传输完成
   {
DMA_ClearFlag(DMA2_FLAG_TC2);//清除通道2传输完成标志
break; 
                 }
}
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-2 09:49:24 | 显示全部楼层
回复【8楼】wushanyu1:
---------------------------------
DMA的作用就是可以不依赖CPU进行数据传输。当你执行buffer1的DMA传输命令后,CPU就会开始执行下一条语句。此时你就可以去读SD卡把buffer2填满,buffer1 DMA传输过程不需要理会。 然后在DMA传输完成中断你除了要清除标志位外还需要设置一个全局变量标志上一个buffer的数据已经传输完成,在播放大循环中等待这个标志位,满足条件后再把buffer2的数据DMA到DAC,同时再去读SD填buffer1. 当然你还需要个标志位来切换buffer1还是buffer2.

XferCplt = 1; //DMA传输完成标志位
while(1)
{
if( Get_One_Block(&fileR,&fc) == 0)//FLAC解码成功
{
while(XferCplt == 0) //等待上一个buffer传输完成
{}
if(bufferswitch == 1)//buffer切换标志位,填buffer操作在 Get_One_Block()中完成
{
Audio_MAL_Play((u32)PCM_buf1,decoded_buf_sz*2);//开始DMA传输
bufferswitch = 0; //切换buffer
}
else
{
Audio_MAL_Play((u32)PCM_buf0,decoded_buf_sz*2);
bufferswitch = 1;
}
XferCplt = 0;//传输完成变量清零
}
else
{
break;//解码不成功就跳出循环
}
}
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-4-1
在线时间
1 小时
 楼主| 发表于 2013-11-9 19:39:13 | 显示全部楼层
回复【9楼】ricefat:
---------------------------------
谢谢ricefat ,现在基本上调通了。从SD卡播放WAV音乐基本上没有杂音和延迟的情况了。
有一个状况问一下有没有遇到过:从SD卡播放同样的一段音乐,为何音质要差于直接从STM32的FLASH读取呢?
我个人感觉,从SD卡读取的音乐听上去生硬,从flash读取的很柔和。
回复 支持 反对

使用道具 举报

8

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
金钱
311
注册时间
2016-10-1
在线时间
117 小时
发表于 2016-10-1 11:56:47 | 显示全部楼层
楼主有没有程序分享下。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 19:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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