OpenEdv-开源电子网

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

双dac实现立体声播放wav文件,但是dac2和spi引脚冲突

[复制链接]

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
发表于 2015-11-29 11:48:24 | 显示全部楼层 |阅读模式
5金钱
dac2的pa5引脚和spidesclk(pa5)冲突了,测试过开启dac2功能,spi就不能正常通信,好像dac还不能重映射,sd卡口也焊死了,。。。。。。呜呜呜,已实现单通道播放 特来求助,有个帖子好像也是dac2和spi共用的(看过代码)就没问题。 新人第一次发帖!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-11-29 14:50:20 | 显示全部楼层
用SPI的时候就配置成SPI,用DAC的时候就配置成DAC,就是不知道这么做流畅性如何
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-11-29 15:44:18 | 显示全部楼层
回复【2楼】ricefat:
---------------------------------
从SD卡读取音频数据到缓存之前设置PA5用作SCLK,读取完设置用作DAC2的输出,再按指定频率送DAC输出(我用DAC1和DAC2比较了下,相同的喇叭功放电路),调试过,每次都能正确设置DAC2的输出,SD卡也能读取数据。
但是,流不流畅听不出,DAC2(和SPI共用的那个口)的输出多了哒哒哒噪声
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-11-29 15:48:36 | 显示全部楼层
贴出部分代码 读音频数据的

DAC_Cmd(DAC_Channel_2,DISABLE);
gpio.GPIO_Mode = GPIO_Mode_AF_PP;    //SCLK

GPIO_Init(GPIOA, &gpio);



f_read(&file,buffer,512,&br);


gpio.GPIO_Mode = GPIO_Mode_AIN; //DAC2  

GPIO_Init(GPIOA, &gpio);
DAC_Init(DAC_Channel_2,&DAC_InitStructure);
DAC_Cmd(DAC_Channel_2,ENABLE);
DAC_DMACmd(DAC_Channel_2,DISABLE);



送DAC输出的
                temp=(((u16)(buffer[Index+1]-0x80))<<4)|(buffer[Index++]>>4);
DAC_SetChannel1Data(DAC_Align_12b_R,temp);
DAC_SetChannel2Data(DAC_Align_12b_R,temp);
DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);
DAC_SoftwareTriggerCmd(DAC_Channel_2,ENABLE);
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-11-29 15:52:27 | 显示全部楼层
我是读完512字节 才送DAC,送完再读,再送,这里会有点播放不流畅
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-11-29 16:08:24 | 显示全部楼层
回复【3楼】我是灰太狼sjh:
---------------------------------
哒哒声可能是切换引脚功能时候产生的。512字节太少了,内存足够的情况下读个几K字节,看看哒哒声频率会不会降低
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-11-29 16:34:29 | 显示全部楼层
回复【6楼】ricefat:
---------------------------------
确实哒哒哒频率降低了很多,如果降低采样频率会更好,我还是外接1个SD卡槽,换个SPI2,3吧。
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-11-29 16:35:57 | 显示全部楼层
回复【7楼】我是灰太狼sjh:
---------------------------------
12位DAC 也就是听个音^_^,不用那么纠结
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-11-29 16:56:53 | 显示全部楼层
回复【8楼】ricefat:
---------------------------------
谢谢,本来想用PWM实现DA的,但是PWM的精度和频率是一对矛盾。
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-11-29 17:22:21 | 显示全部楼层
回复【9楼】我是灰太狼sjh:
---------------------------------
不行搭个数字功放电路
回复

使用道具 举报

11

主题

110

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2015-11-17
在线时间
6 小时
发表于 2015-11-29 18:30:32 | 显示全部楼层
外接个CODEC芯片得了……
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-12-17 12:23:47 | 显示全部楼层
回复【10楼】ricefat:
---------------------------------
请问一下,DMA把从SD读出的一段数据(假设512个缓冲)送给DAC的时候,DMA传输速度无法控制?,在DAC按照采样频率由TIM触发输出时,每次输出1个值,DMA通道的缓存里的1个数据就自动填充DAC数据寄存器吗,手册上没有说,测试了下,设置好DMA并启动(单步执行),CPU暂停时,所有的数据已经发送到DMA缓存中(CNDTR3寄存器=0,TCIF传输完成标志也置位了),这时我还没开始触发DAC呢。之后TIM中断每次触发时,DAC数据寄存器值一直是0(DMA缓存的数据没有移入)啊。。。。。。
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-17 14:57:52 | 显示全部楼层
DMA只要启动就开始传输数据了,DAC的设置应该在启动DMA之前完成。

而且你说的DMA缓冲是什么?
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-12-17 15:06:21 | 显示全部楼层
回复【13楼】ricefat:
---------------------------------
DMA设置时有个缓冲就是传输的数据个数,我测试了下 传输255个数据到DAC,   只要一开启DMA传输,我的DAC数据寄存器的值就变成255个数据中的最后一个。这样就不能用DMA按指定的频率喂给DAC啊。
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-12-17 15:09:41 | 显示全部楼层
这是STM32应用笔记里的,TIM同时触发一次DMA(传输1个给DAC的DHR)和触发DAC的DHR数据送入DOR
DACDMA.JPG
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-17 19:43:55 | 显示全部楼层
回复【14楼】我是灰太狼sjh:
---------------------------------
DMA设置中的那个计数值只是代表你需要传输的次数,比如你设置DMA传输位宽是16bit,也就是一次需要2字节,你有512字节的数据需要传,那么那个计数值应该设置成256。这个计数值应该是在传输过程中逐渐减小到0. 

对于你传输数据的问题,一般44.1k 16bit音频指的是一个声道的数据,那么两个声道就是32bit的数据。立体声音频数据的 I2S传输方式还需要有个时钟线每16bit切换声道,即对于I2S接口的立体声音频DAC,DMA需要一次传输4字节给DAC。你现在想通过两个DAC播放立体声音频,那么需要在DMA每次只给一个DAC传输16bit数据,同时给另外一个DAC传输后面16bit数据。

另外DMA只是个传输通道,你需要指定从哪个地址传输到哪个地址,以及地址增加方向,本身DMA并没有什么缓存。

你发的那个图只是说明一个乒乓缓存不间断给DAC喂数据防止断流的示意,这个事先设置好DAC的相关参数后就不需要理会DMA给DAC填数据的过程了,就和你用DMA给串口发数据一样,也不需要理会DMA和串口之间的速度关系。
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-12-17 19:59:17 | 显示全部楼层
你说得我都理解了,就是dma怎么按指定的频率喂数据给dac,而且不能用软件触发,要在初始化里配置好。。。
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-12-17 20:02:04 | 显示全部楼层
。…。。。。。。。。
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-17 20:09:21 | 显示全部楼层
回复【17楼】我是灰太狼sjh:
---------------------------------
刚刚修改了下我的回答,可以再看看,不知道对你有没有帮助。我没有用过片上DAC,我就说下我对你说东西的理解:比如你需要播放44.1k 16bit 的音频,那么你需要以44.1k的频率去同时触发两个DAC,把读取的第一个16bit给第一个DAC,另外16bit给第二个DAC。现在你说你的DMA一旦开启数据一下就没了,我觉得可能是你的DAC触发有问题,或是你程序里面给DAC送数据的过程有问题
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-17 20:11:47 | 显示全部楼层
回复【18楼】我是灰太狼sjh:
---------------------------------
刚刚发现 你说你单步调试时候DMA计数就变成0了。这个我提醒下,DMA传输过程跟调试无关,即使在调试状态,开启的DMA传输也会进行,不会因为你调试就停止
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-12-17 20:39:12 | 显示全部楼层
回复【20楼】ricefat:
---------------------------------
我不用DMA,用2个内存乒乓操作已经实现了,就想试下怎么用dma把数据从RAM喂给DAC。
比如 采样8位 8k采样率 
DMA配置成8位宽,计数值为1,用TIM6的UPdate请求DMA和触发DAC
还是 DMA的计数值设置为一块(比如512字节),DAC触发还是TIM6的UPdate,但是DMA的速度很快,这两者没法同步啊。。。。。

而且TIM6请求DMA也失败了。。。
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-17 20:44:55 | 显示全部楼层
回复【21楼】我是灰太狼sjh:
---------------------------------
好吧,我也去找找资料吧,难道片上DAC和外部音频DAC区别非常大吗? 该充电了
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-17 21:45:26 | 显示全部楼层
回复【21楼】我是灰太狼sjh:
---------------------------------
http://haoxi.spaces.eepw.com.cn/articles/article/item/97855
这个帖子跟你的情况类似,可以参考
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-12-17 22:39:17 | 显示全部楼层
回复【23楼】ricefat:
---------------------------------

TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);  //触发源更新
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;  //DAC触发  TIM6触发
 DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R2_Address;

DMA肯定是按定时频率喂给DAC数据,可是代码里没有关于这个的初始化,手册上也没有说,我看了好多类似的实现了的代码,也是这样的
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-11-18
在线时间
7 小时
 楼主| 发表于 2015-12-17 22:45:18 | 显示全部楼层

     DMA_Configuration();
   
   /* Enable DMA for DAC Channel1 */
     DAC_DMACmd(DAC_Channel_2, ENABLE);


  /* TIM6 enable counter */
     TIM_Cmd(TIM6, ENABLE)

好像是有个顺序问题,先配置好,最后使能定时器就能正常工作?
应用笔记也是这样写的,我去试试。。。。。
DMAA.JPG
DMA.JPG
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 16:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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