你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

i2s 和DMA问题

[复制链接]
klffnj 提问时间:2015-3-6 11:42 /
F4系列的官方例程有播放wave文件的例程,wave文件使用的是16bit双声道格式,dma传输时可以先左后右自动传输, 但是如果wave文件是单声道8bit的文件,怎么配置DMA呢?


收藏 1 评论14 发布时间:2015-3-6 11:42

举报

14个回答
arm8686 回答时间:2015-3-6 12:42:15
DMA 并没有先左后右吧?只是一种乒乓操作。
数据流里头是 左声道+右声道。

如果只有一个声道,DMA 还是一样的乒乓操作,不然码流就会断掉了,毕竟没有无限的 RAM 存储空间。
klffnj 回答时间:2015-3-6 12:55:38
arm8686 发表于 2015-3-6 12:42
DMA 并没有先左后右吧?只是一种乒乓操作。
数据流里头是 左声道+右声道。

你的意思是单声道wave文件播放时会丢失一半的数据。 或者说是本来只有一个通道的数据分配到两个通道里面去了。
arm8686 回答时间:2015-3-6 13:00:14
klffnj 发表于 2015-3-6 12:55
你的意思是单声道wave文件播放时会丢失一半的数据。 或者说是本来只有一个通道的数据分配到两个通道里面 ...

不是。
如果 DAC 是单通道的,那就连续地发给它一个声道的数据就可以。不会丢失数据。
如果 DAC 是双通道的,那其中空余的声道,随意填充个数据即可。
klffnj 回答时间:2015-3-6 13:24:45
arm8686 发表于 2015-3-6 13:00
不是。
如果 DAC 是单通道的,那就连续地发给它一个声道的数据就可以。不会丢失数据。
如果 DAC 是双通道 ...

哦, 可能是我没有说清楚,播放音频用的i2s总线, 我理解双通道的数据时分别发到WS为高和低的时候,但是在dma配置中并没有这些说明,所以碰到单声道数据会丢。
arm8686 回答时间:2015-3-6 13:34:02
klffnj 发表于 2015-3-6 13:24
哦, 可能是我没有说清楚,播放音频用的i2s总线, 我理解双通道的数据时分别发到WS为高和低的时候,但是 ...

跟 DMA 没有关系的。

I2S 播放音频,一般就是使用 DMA 的乒乓方式。

按照你的系统,8bit 单声道,就需要给 DAC 16bit 的数据,其中有 8bit 是填充的。
如果将 8bit 的数据连续存放在 RAM 里头,当然会丢失一半。因为被传送到一个不使用的声道里头去了。
klffnj 回答时间:2015-3-6 14:57:08
arm8686 发表于 2015-3-6 13:34
跟 DMA 没有关系的。

I2S 播放音频,一般就是使用 DMA 的乒乓方式。

标准的pcm文件 8bit数据,就是连续存放的,读到ram的时候也应该是连续的。用DMA可以把RAM和DAC的位数全部配置为8Bit,着样就不存在填充问题了, 只是i2s每一个ws的周期需要两个数据,如果WS为高时,取RAM【0】中的数据,那么WS为低时回去取RAM【1】中的数据,显然这是不对的。

除非有一种模式可以这样,RAM1 中存真实数据,RAM2为空,WS为高时取RAM1中数据,WS为低时取RAM2中数据对应索引值中的数据,  难道你说的乒乓模式就是这样的吗
arm8686 回答时间:2015-3-6 15:25:44
本帖最后由 arm8686 于 2015-3-6 15:29 编辑
klffnj 发表于 2015-3-6 14:57
标准的pcm文件 8bit数据,就是连续存放的,读到ram的时候也应该是连续的。用DMA可以把RAM和DAC的位数全部 ...

PCM 8 bit数据连续存放,这没有关系。
转换一下,例如左移 8 位。这样在 RAM 就会是 16 bit 的数据。
再通过 I2S 传输出去。这时候,就只有一个通道有声音了。

不要想着左取一个字节,右取一个字节。

/*---------------------------------------------------------------------------*/

RAM1:左右 左右 左右 …… (例如共 4k 字节)RAM2:左右 左右 左右 …… (例如共 4k 字节)

先准备好 RAM1 的数据,启动 DMA 往 I2S 传数据(就是所谓的播放)。
接着该准备好 RAM2 里面的数据了,不然播放完 RAM1 的数据,就断了码流。

当 RAM1 播放完之后,触发 DMA 的中断。此时切换 DMA 通道,指向 RAM2 的首地址。
在播放 RAM2 数据的时候,准备 RAM1 的数据。

这就是所谓的 DMA 乒乓方式。

arm8686 回答时间:2015-3-6 15:31:08
不要钻到 原始数据的格式 这个牛角尖里头去。
要想着 DAC 需要什么数据。
MouseCat 回答时间:2015-3-6 16:29:51
还没涉及到I2S,MARK一下
klffnj 回答时间:2015-3-6 19:02:59
arm8686 发表于 2015-3-6 15:31
不要钻到 原始数据的格式 这个牛角尖里头去。
要想着 DAC 需要什么数据。

不是我想专牛角, 现在有个mic 出 pdm信号,中间经过st的pdm滤波器IP处理后,需要把pdm 保存为wav数据存起来, 总是得不到正常的数据。 我是真的醉了 。
亮剑2015 回答时间:2015-3-7 09:08:35
路过,,,,,,,,,,,,,,
jazu 回答时间:2017-6-6 11:02:52

回复的很详细
jazu 回答时间:2017-6-7 10:38:36
klffnj 发表于 2015-3-6 14:57
标准的pcm文件 8bit数据,就是连续存放的,读到ram的时候也应该是连续的。用DMA可以把RAM和DAC的位数全部 ...

首先你单纯从软件上无法实时获取WS的状态,其次就不用想通过WS去切换双bank。
lhk5195 回答时间:2019-8-19 21:02:54
arm8686 发表于 2015-3-6 15:31
不要钻到 原始数据的格式 这个牛角尖里头去。
要想着 DAC 需要什么数据。

能问两个问题么?
使用F429进行录音和放音时使用的是I2S2
为什么SD引脚设置复用功能是GPIO_AF_SPI2
EXT_SD设置的是 GPIO_AF_SPI3
在stm32f4xx_gpio.h里面的说明
#define GPIO_AF_SPI2          ((uint8_t)0x05)  /* SPI2/I2S2 Alternate Function mapping */
#define GPIO_AF_SPI3          ((uint8_t)0x06)  /* SPI3/I2S3 Alternate Function mapping */
GPIO_AF_SPI2 才是SPI2/I2S2复用功能
GPIO_AF_SPI3 是SPI3/I2S3
这个好难理解

第二个问题
播放DMA设置数据流是4通道0
录音的是数据流3通道3
根据DMA表查询数据流4通道0是SPI2_TX
数据流3通道3是I2S2_ext_RX
这两个数据流为什么不是设置I2S2_EXT_RX和I2S2_EXT_TX或者SPI2_TX和SPI2_RX?

我试过程序了只有按照上面的设置才可以正常的使用 帮忙解答下 谢谢

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版