录音格式可以自由设定,录音数据存储在外部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个输出信号短路)也不会导致硬件损坏。
——回复可见内容——