这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 合作大赛 » STM32 I2S实现录音和放音的方案(附电路图,源代码)

共1条 1/1 1 跳转至

STM32 I2S实现录音和放音的方案(附电路图,源代码)

高工
2015-06-30 16:38:44     打赏
用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)




wm8978 


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


方向切换电路 

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个输出信号短路)也不会导致硬件损坏。

——回复可见内容——



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]