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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版