搜索
bottom↓
回复: 44

STM32 I2S实现录音和放音的方案,上电路图和源码,已调试通过

  [复制链接]

出0入0汤圆

发表于 2011-9-16 22:37:24 | 显示全部楼层 |阅读模式
用STM32的I2S2音频接口驱动WM8978,实现录音和回放功能。支持录音时通过耳机监听MIC拾取的声音。
        录音格式可以自由设定,录音数据存储在外部SRAM,容量1M字节。录音和放音都是从SRAM开头开始进行,存储的数据
都是原始音频数据,未经过压缩。

        程序运行后,LCD会显示操作界面:
        [TAMPER]键     = 选择音频格式
        [WAKEUP]键     = 开始录音
        [USER]键       = 开始回放
        摇杆上/下键    = 调节音量
        摇杆左/右键    = 调节MIC增益
        摇杆OK键       = 终止录放

        I2S_StartRecord() 和 I2S_StartPlay()函数的形参值域
    接口标准支持:
                #define I2S_Standard_Phillips           ((uint16_t)0x0000)
                #define I2S_Standard_MSB                ((uint16_t)0x0010)
                #define I2S_Standard_LSB                ((uint16_t)0x0020)
                #define I2S_Standard_PCMShort           ((uint16_t)0x0030)
                #define I2S_Standard_PCMLong            ((uint16_t)0x00B0)

    字长支持:
            #define I2S_DataFormat_16b              ((uint16_t)0x0000)
                #define I2S_DataFormat_16bextended      ((uint16_t)0x0001)
                #define I2S_DataFormat_24b              ((uint16_t)0x0003)
                #define I2S_DataFormat_32b              ((uint16_t)0x0005)
       
        采样频率支持:
                #define I2S_AudioFreq_192k               ((uint32_t)192000)
                #define I2S_AudioFreq_96k                ((uint32_t)96000)
                #define I2S_AudioFreq_48k                ((uint32_t)48000)
                #define I2S_AudioFreq_44k                ((uint32_t)44100)
                #define I2S_AudioFreq_32k                ((uint32_t)32000)
                #define I2S_AudioFreq_22k                ((uint32_t)22050)
                #define I2S_AudioFreq_16k                ((uint32_t)16000)
                #define I2S_AudioFreq_11k                ((uint32_t)11025)
                #define I2S_AudioFreq_8k                 ((uint32_t)8000)


安富莱STM32开发板原理图(见CODEC音频部分的电路)ourdev_676994A5BC27.pdf(文件大小:188K) (原文件名:安富莱STM32F103ZE-EK(V3)_原理图.pdf)
I2S录音和回放源代码(IAR和KEIL下均调试OK)ourdev_676995RMBB7C.rar(文件大小:501K) (原文件名:Ex021-I2S录音和回放例程(WM8978)_2011-09-14.rar)


wm8978 (原文件名:WM8978.jpg)


WM8978可以支持同时放音和录音,但是STM32的I2S接口是个“跛子”,同一时刻只能选择一个方向传输数据。标准的I2S接口的CODEC芯片(比如WM8978)具有2个独立的数据引脚,1个是ADCDAT,用于录音;1个是DACDAT用于放音。由于STM32的I2S接口只有一个数据引脚,因此在设计引脚的时候,就需要确定是录音还是放音。为了方便学习,开发板上增加了软件可控制的录音和放音切换电路。可以实现类似于对讲机的半双工模式(即不能同时录音和放音)。


方向切换电路 (原文件名:1G125.jpg)

SN74LVC1G125是一个单路数字切换开关。OE = 0时,Y = A;OE = 1时,Y = 高阻。
OE = 0 为录音状态。WM8978的ADCDAT引脚通过SN74LVC1G125连接到CPU的I2S2_SD引脚。
OE = 1 为放音状态。CPU的I2S2_SD引脚连接到WM8978的ADCDAT,WM8978的ADCDAT引脚和CPU的I2S2_SD引脚隔离,避免干扰I2S2_SD引脚上的音频数字信号。
为了节约CPU的GPIO资源,SN74LVC125的OE引脚由WM8978的WM_GPIO1控制。WM_GPIO1可以通过给WM8978发送命令设置为高或者低,从而实现录音和放音的切换。
WM8978复位之后,WM_GPIO1处于输入状态,R121上拉电阻的设计保证了SN74LVC1G125的Y输出脚在上电后处于高阻状态,从而避免和CPU的PB15引脚冲突。R122限流电阻的设计保证了即使软件设计存在BUG(即SN74LVC1G125的Y脚输出使能,CPU的PB15输出使能,会造成2个输出信号短路)也不会导致硬件损坏。

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2011-9-16 22:45:58 | 显示全部楼层
顶一下,很想用,但是没有时间

出0入12汤圆

发表于 2011-9-17 09:30:18 | 显示全部楼层
为什么 不用VS1003???一代经典啊

出0入0汤圆

发表于 2011-9-17 10:29:55 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2011-9-17 21:18:43 | 显示全部楼层
留个记号,备用。

出0入0汤圆

发表于 2011-9-17 23:55:31 | 显示全部楼层
STM32的ADC有12位,最高采样率有1MSPS,搞个麦克风传感器输入来采集声音,44K到100K的采样率,数据实时传到电脑保存,可以无限采集声音,音质更好。何必搞那么复杂。

出0入0汤圆

发表于 2011-9-18 01:22:47 | 显示全部楼层
顶下,过两天我就调试这个,到时候再细看

出0入0汤圆

发表于 2011-9-18 03:47:46 | 显示全部楼层
不错,玩的是技术.

出10入10汤圆

发表于 2011-9-18 10:07:08 | 显示全部楼层
回复【6楼】lg2009  
stm32的adc有12位,最高采样率有1msps,搞个麦克风传感器输入来采集声音,44k到100k的采样率,数据实时传到电脑保存,可以无限采集声音,音质更好。何必搞那么复杂。
-----------------------------------------------------------------------

照你这么说,如果电脑象手机这么小,他这个就不用做了。但是有吗?

再说,成本不需要考虑吗?

出0入0汤圆

发表于 2011-9-18 10:16:45 | 显示全部楼层
不错,顶

出0入476汤圆

发表于 2011-9-18 11:26:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-18 22:31:48 | 显示全部楼层
mARK

出0入0汤圆

发表于 2011-9-19 01:50:27 | 显示全部楼层
回复【6楼】lg2009  
stm32的adc有12位,最高采样率有1msps,搞个麦克风传感器输入来采集声音,44k到100k的采样率,数据实时传到电脑保存,可以无限采集声音,音质更好。何必搞那么复杂。
-----------------------------------------------------------------------
买一支 ipad ,通通都有,何必搞那么复杂。
-----------------------------------------------------------------------
回复【2楼】skynet 青青草原
为什么 不用VS1003???一代经典啊
-----------------------------------------------------------------------
都停产了,搞懂要卖给谁?

出0入0汤圆

发表于 2011-9-19 08:23:55 | 显示全部楼层
回复【9楼】yangyi  
回复【6楼】lg2009  
stm32的adc有12位,最高采样率有1msps,搞个麦克风传感器输入来采集声音,44k到100k的采样率,数据实时传到电脑保存,可以无限采集声音,音质更好。何必搞那么复杂。
-----------------------------------------------------------------------
照你这么说,如果电脑象手机这么小,他这个就不用做了。但是有吗?
再说,成本不需要考虑吗?
-----------------------------------------------------------------------

如果用麦克风传感器电路成本更低,不用什么WM8978。

STM32主要是用在控制方面,老是用来搞什么mp3和录音。市场上5寸屏的mp4才100多块,哪个成本更低?

出0入0汤圆

发表于 2011-9-19 08:25:05 | 显示全部楼层
回复【13楼】nono2000  
回复【6楼】lg2009  
stm32的adc有12位,最高采样率有1msps,搞个麦克风传感器输入来采集声音,44k到100k的采样率,数据实时传到电脑保存,可以无限采集声音,音质更好。何必搞那么复杂。
-----------------------------------------------------------------------
买一支 ipad ,通通都有,何必搞那么复杂。
-----------------------------------------------------------------------

STM32主要是用在控制方面,老是用来搞什么mp3和录音。市场上5寸屏的mp4才100多块,通通都有,哪个成本更低?

出0入0汤圆

发表于 2011-9-19 08:47:15 | 显示全部楼层
原来只是PCM播放。。。。。。

出0入0汤圆

发表于 2011-11-28 09:01:58 | 显示全部楼层
mark~

出0入0汤圆

发表于 2012-2-15 17:23:17 | 显示全部楼层

出0入0汤圆

发表于 2012-2-15 17:36:27 | 显示全部楼层
好帖子,顶!

出0入0汤圆

发表于 2012-5-29 14:28:38 | 显示全部楼层
不知道楼主还在不在啊,代码下载不下来,给传一份啊!老论坛的下载问题何时能解决啊

出0入0汤圆

发表于 2012-5-29 15:06:24 | 显示全部楼层
VS1003 啥时候停产了???

出0入0汤圆

发表于 2012-5-30 00:27:21 | 显示全部楼层
顶一下!

出0入0汤圆

发表于 2012-6-18 20:53:17 | 显示全部楼层
顶!呵呵!

出0入0汤圆

发表于 2012-6-18 21:09:45 | 显示全部楼层
vs1003停产了么?我现在还在用呢!

出0入0汤圆

发表于 2012-6-27 20:55:23 | 显示全部楼层
马克一下

出0入0汤圆

发表于 2012-6-28 10:33:52 | 显示全部楼层
zhangyb 发表于 2012-6-18 21:09
vs1003停产了么?我现在还在用呢!

能透露一下你的vs1003用在那些方面的么?怎么感觉这个芯片价格很高,好像接受不了呢?

出0入0汤圆

发表于 2012-6-28 14:43:54 | 显示全部楼层
我现在也是试验阶段,没有考虑价格问题?我主要用在MP3播放

出0入0汤圆

发表于 2012-7-26 10:16:33 | 显示全部楼层
顶顶顶 有用 看看哈哈

出0入0汤圆

发表于 2012-11-7 17:30:00 | 显示全部楼层
lg2009 发表于 2011-9-17 23:55
STM32的ADC有12位,最高采样率有1MSPS,搞个麦克风传感器输入来采集声音,44K到100K的采样率,数据实时传到 ...

我看可行,那你做过吗?

出0入0汤圆

发表于 2012-11-17 11:03:19 | 显示全部楼层
学习学习,谢谢

出0入0汤圆

发表于 2012-11-17 12:28:23 | 显示全部楼层
wm8978的例子 标记

出0入0汤圆

发表于 2013-4-25 18:06:22 | 显示全部楼层

wm8978的例子 mark

出0入0汤圆

发表于 2013-4-27 21:50:37 | 显示全部楼层
顶一个

出0入0汤圆

发表于 2013-4-28 11:41:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-5-1 11:31:50 | 显示全部楼层
lg2009 发表于 2011-9-17 23:55
STM32的ADC有12位,最高采样率有1MSPS,搞个麦克风传感器输入来采集声音,44K到100K的采样率,数据实时传到 ...

请问一下大神~在测麦克风输入信号AD时,要不要加什么电路滤波了啊?

出0入0汤圆

发表于 2013-11-30 14:33:49 | 显示全部楼层
不错,自主创新,真功夫

出0入0汤圆

发表于 2013-12-5 23:39:23 | 显示全部楼层
lg2009 发表于 2011-9-17 23:55
STM32的ADC有12位,最高采样率有1MSPS,搞个麦克风传感器输入来采集声音,44K到100K的采样率,数据实时传到 ...

兄弟你搞过这样的吗?

出0入0汤圆

发表于 2013-12-19 22:05:11 | 显示全部楼层
lg2009 发表于 2011-9-17 23:55
STM32的ADC有12位,最高采样率有1MSPS,搞个麦克风传感器输入来采集声音,44K到100K的采样率,数据实时传到 ...

如果你这样的话,我看直接用电脑的声卡更简单,你说呢?

出0入0汤圆

发表于 2014-5-7 14:05:47 | 显示全部楼层
效果如何

出0入0汤圆

发表于 2014-5-7 23:09:01 | 显示全部楼层
请教楼主,如何读取VS1003的数据,我想把数据传输出去,不存放在SD卡等存储器里面。但是不知道如何读取VS1003的数据,关键是不知道哪个寄存器是存放数据的。。。。。其次,我用别人的调试通过的例子读取VS1003里面设置好的寄存器,为什么读到的全是00,郁闷之极啊!

出0入0汤圆

发表于 2014-6-30 15:09:51 | 显示全部楼层
前段时间用 WM8731做了一个,...   但是用FPGA驱动的

出0入0汤圆

发表于 2015-1-28 09:37:45 | 显示全部楼层
受教了,谢谢

出0入0汤圆

发表于 2015-4-2 17:45:52 | 显示全部楼层
。。。观摩一下。貌似现在方案还是很多的

出0入8汤圆

发表于 2015-4-2 18:01:46 | 显示全部楼层
还有摇杆,好高端啊,看一下先~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-9 10:19

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

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