搜索
bottom↓
回复: 0

关于stm32的I2S的一个问题

[复制链接]

出0入0汤圆

发表于 2012-8-27 15:37:04 | 显示全部楼层 |阅读模式
本帖最后由 yuzhangyuan 于 2012-8-27 15:54 编辑

在reference manual里有一段描述stm32所支持的音频协议,如下:
-------
支持的音频协议:
三线总线支持2 个声道上音频数据的时分复用:左声道和右声道,但是只有一个16位寄存器用作
发送或接收。因此,软件必须在对数据寄存器写入数据时,根据当前传输中的声道写入相应的
数据;同样,在读取寄存器数据时,通过检查寄存器SPI_SR的CHSIDE 位来判明接收到的数据
属于哪个声道。左声道总是先于右声道发送数据(CHSIDE位在PCM协议下无意义)。
有四种可用的数据和包帧组合。可以通过以下四种数据格式发送数据:  
● 16位数据打包进16位帧
● 16位数据打包进32位帧
● 24位数据打包进32位帧
● 32位数据打包进32位帧
在使用16位数据扩展到32位帧时,前16位(MSB) 是有意义的数据,后16位(LSB) 被强制为0 ,该
操作不需要软件干预,也不需要有DMA请求(仅需要一次读/ 写操作)。
24位和32位数据帧需要CPU对寄存器SPI_DR进行2 次读或写操作,在使用DMA时,需要2 次
DMA传输
对于24位数据,扩展到32位后,最低8位由硬件置0。
------
首先我想问个问题,对于24bit的双声道格式的声音文件, 其存储格式是否是如下所示:


如果是的话, 那么在I2S的传输采用DMA方式时,I2S只有16位的宽度, 而24位的数据被打包成32位的数据(低8位由硬件置0)来传,
那么此时该如何进行I2S与DMA的设置呢?
1: I2S_DataFormat = ? bit;
2: DMA_PeripheralDataSize = ? bit;
3: DMA_MemoryDataSize = ? bit;

我从WAV文件中读出的数据是存储在unsigned char的数组中, 每个声道的数据由3个字节组成.
我测试时设置:
1: I2S_DataFormat = 24bit;
2: DMA_PeripheralDataSize = 16bit;
3: DMA_MemoryDataSize = 16bit;
按照如上设置, 播放出来时噪声很大, 虽然也能听到歌声,但一定不是正确的做法.
并且启动DMA传输时, 我只是简单地设置了数据缓冲区的起始地址与长度(这个数据是32bit的数据,其中我做了处理:每三个字节后第四个字节用0填充)
/* Configure the buffer address and size */
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Addr;
  DMA_InitStructure.DMA_BufferSize = (uint32_t)(Size);

另外, 不知道两次DMA传输体现在哪里?  直接16比特16比特地传不行么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 06:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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