完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
F4系列的官方例程有播放wave文件的例程,wave文件使用的是16bit双声道格式,dma传输时可以先左后右自动传输, 但是如果wave文件是单声道8bit的文件,怎么配置DMA呢?
|
|
相关推荐
9个回答
|
|
DMA 并没有先左后右吧?只是一种乒乓操作。
数据流里头是 左声道+右声道。 如果只有一个声道,DMA 还是一样的乒乓操作,不然码流就会断掉了,毕竟没有无限的 RAM 存储空间。 |
|
|
|
你的意思是单声道wave文件播放时会丢失一半的数据。 或者说是本来只有一个通道的数据分配到两个通道里面去了。 |
|
|
|
不是。 如果 DAC 是单通道的,那就连续地发给它一个声道的数据就可以。不会丢失数据。 如果 DAC 是双通道的,那其中空余的声道,随意填充个数据即可。 |
|
|
|
ji5687 发表于 2018-12-3 15:49 哦, 可能是我没有说清楚,播放音频用的i2s总线, 我理解双通道的数据时分别发到WS为高和低的时候,但是在dma配置中并没有这些说明,所以碰到单声道数据会丢。 |
|
|
|
60user196 发表于 2018-12-3 15:58 跟 DMA 没有关系的。 I2S 播放音频,一般就是使用 DMA 的乒乓方式。 按照你的系统,8bit 单声道,就需要给 DAC 16bit 的数据,其中有 8bit 是填充的。 如果将 8bit 的数据连续存放在 RAM 里头,当然会丢失一半。因为被传送到一个不使用的声道里头去了。 |
|
|
|
标准的pcm文件 8bit数据,就是连续存放的,读到ram的时候也应该是连续的。用DMA可以把RAM和DAC的位数全部配置为8Bit,着样就不存在填充问题了, 只是i2s每一个ws的周期需要两个数据,如果WS为高时,取RAM【0】中的数据,那么WS为低时回去取RAM【1】中的数据,显然这是不对的。 除非有一种模式可以这样,RAM1 中存真实数据,RAM2为空,WS为高时取RAM1中数据,WS为低时取RAM2中数据对应索引值中的数据, 难道你说的乒乓模式就是这样的吗 |
|
|
|
60user196 发表于 2018-12-3 16:19 本帖最后由 arm8686 于 2015-3-6 15:29 编辑 PCM 8 bit数据连续存放,这没有关系。 转换一下,例如左移 8 位。这样在 RAM 就会是 16 bit 的数据。 再通过 I2S 传输出去。这时候,就只有一个通道有声音了。 不要想着左取一个字节,右取一个字节。 /*---------------------------------------------------------------------------*/ RAM1:左右 左右 左右 …… (例如共 4k 字节)RAM2:左右 左右 左右 …… (例如共 4k 字节) 先准备好 RAM1 的数据,启动 DMA 往 I2S 传数据(就是所谓的播放)。 接着该准备好 RAM2 里面的数据了,不然播放完 RAM1 的数据,就断了码流。 当 RAM1 播放完之后,触发 DMA 的中断。此时切换 DMA 通道,指向 RAM2 的首地址。 在播放 RAM2 数据的时候,准备 RAM1 的数据。 这就是所谓的 DMA 乒乓方式。 |
|
|
|
|
|
|
|
还没涉及到I2S,MARK一下
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2105 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1941 浏览 3 评论
4537 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2084 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2599 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:01 , Processed in 0.751714 second(s), Total 88, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号