三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

基于 RA8P1 的数字录音与播放工程

基于 RA8P1 的数字录音与播放工程

本篇在原有触摸屏的基础上新增数字录音功能:按屏幕按钮即可录音,声音经 WM8960 音频编解码器采集,以 WAV 格式存入 SD 卡,录完自动回放。

一、WM8960 音频编解码器与 I2S 接口

WM8960 是低功耗立体声音频编解码器,内部集成 ADC/DAC、输入可编程增益放大器(PGA)和 D 类扬声器功放。它对外有两个接口:I2C 控制接口(7 位地址 0x1A)负责寄存器配置,I2S 音频接口负责双向传输 PCM 数据。

调试中遇到的一个关键特性:WM8960 是"只写"设备,不支持寄存器回读,对控制接口发起读操作一律返回 NACK。这意味着不能像调试 I2C 传感器那样读回寄存器验证配置,排障只能靠对写入值做位级分析和实际听感/采集波形验证。

录音增益链路(从麦克风到 I2S 输出):

1. 输入 PGA:LINVOL/RINVOL 寄存器,0.75 dB 一步,范围 -17.25 到 +30 dB,满增益 0x3F;
2. LPGA 后级增益:LADC_PATH 寄存器 bit6:4,0 到 +21 dB(3 dB 步进);
3. ADC 数字音量:LADCVOL/RADCVOL,-97.5 到 +30 dB;
4. 电源管理:PWR1 提供 VMID/VREF/MICBIAS 偏置,PWR2/PWR3 分别控制输出与输入通路电源——录音时只开输入域并断开输出混音器,防止回授啸叫。

音频编解码模块

二、新增外设与引脚配置

音频相关的硬件资源全部为 RA8P1 自带外设,无需额外编解码芯片之外的新器件:

外设:SSIE1(I2S 音频接口)
用途:主机模式,16-bit PCM、32-bit word slot,录音与播放分时使用
引脚:BCLK 接 P907、LRCK 接 P906、DATA 接 P206

外设:GPT2(通用定时器)
用途:输出 12.5 MHz MCLK 给 WM8960,LRCK 随之锁定在 48.828 kHz
引脚:GTIOC2A 接 PD06

外设:IIC1(硬件 I2C)
用途:主模式控制 WM8960 寄存器(7 位地址 0x1A),约 98 kbit/s
引脚:SDA 接 P511、SCL 接 P512

外设:SDHI0(SD 卡主机接口)
用途:4-bit 模式读写 WAV 文件,配合 FAT 文件系统(Lab-Project-FreeRTOS-FAT)
引脚:CLK-PD05、CMD-PD04、DAT0 到 DAT3 接 PD03/PD02/PD01/P111、CD-PD07

外设:UART(SCI9)
用途:printf 调试日志输出
引脚:TX-P209、RX-P208

需要注意的硬件风险点:RA8P1 的 SSIE1 只有一根双向数据线 P206,而 WM8960 的 DACDAT(输入)与 ADCDAT(输出)是分开的引脚。本工程录音与播放严格分时工作,板级验证可行;若需同时收发,应改用带独立 SSITXD0/SSIRXD0 的 SSIE0 或增加数据线切换。

相关引脚

三、录音与回放链路

录音流程:

1. UI 层按屏幕"3×3 数字按钮"中的 N,发出"录音 N 秒"命令;
2. 音频线程切换到录音 codec 配置(电源域、PGA、ADC、通路),启动 I2S 采集;
3. 采集数据经 DMA 写入双缓冲,每满一帧即由 CPU 追加写入 SD 卡的 WAV 文件(按键录音直存 48.828 kHz 立体声,回放链路同格式、无需重采样);
4. 定时到点后关闭采集、落盘,自动切到播放配置并回放刚录的文件。

播放流程:WAV 文件从 SD 卡流式读取,经重采样(仅跨格式路径)填充多块缓冲区,I2S 发送空中断触发补填,数据经 WM8960 DAC 与输出混音器驱动扬声器。输出音量由 SPKVOL 寄存器控制(0-127,默认 60%,可持久化保存)。

UI界面

四、系统架构与内存约定

工程在裁剪后只保留两条线程:

音频线程(player_Thread):负责音频外设初始化(I2C、WM8960、I2S、SD 卡)、录音/播放/提示音命令状态机,主循环处理命令队列、播放补填与录音落盘;
UI 线程(ui_thread):5 毫秒主循环驱动 LVGL,数字录音页交互与状态显示。

内存约定(板级验证):

数据:录音采集双缓冲
位置:内部 SRAM 的 .ram_noinit_nocache 段,32 字节对齐
约束:I2S DMA 直接写入、CPU 读取,必须绕过 D-Cache,否则读到的行可能来自上一轮填充,文件固定相位处出现"稳定间隔的冻结段(啪啪声)"

数据:播放 TX 环形缓冲与源数据缓冲
位置:内部 SRAM 的 .ram_noinit_nocache 段,32 字节对齐
约束:I2S DMA 直接读取,同样必须避开 D-Cache

五、工程裁剪中的问题排查

裁剪后出现"录音回放声音很小/无声"的问题,排查过程走了弯路,也最终确认了正确方法:

1. 误判一(噪声门):怀疑 WM8960 噪声门把安静信号静音,把噪声门寄存器 0x00C1 改为 0x0000。事后按数据手册位义核对,0x00C1 的使能位 bit8 本就是 0,噪声门原本就是关闭的,此改动不改变实际行为。
2. 误判二(ALC 自动增益控制):怀疑 ALC 压低增益,把 0x007B 改为 0x0000。同样按位核对,0x007B 的 ALCSW bit8 也是 0,ALC 原本就未使能。
3. 误判三(增益不足):把 LPGA 从 0 提升到 +21 dB、ADC 数字音量从 +22 拉到 +30 dB,总增益高达 +81 dB——声音反而变成"底噪轰鸣、人声依旧很小",随后还原。


六、工程代码结构(新增部分)

src/player_Thread_entry.c:音频线程入口(外设初始化、录音落盘、命令处理)
src/drivers/audio/wm8960/:WM8960 驱动(寄存器配置、录音/播放 profile 切换、音量控制)
src/middleware/audio/:audio_cmd_handler(录音/播放/提示音状态机)、pcm_capture(采集)、pcm_player(播放)、wav_reader/wav_writer(WAV 解析与写入)、pcm_resampler(重采样)
src/device/storage/sd_card:SD 卡驱动与 FAT 接入
src/application/ui/ui_page_dial:数字录音页(3×3 按钮交互)
src/application/core/:app_bridge(命令桥接)、app_state/app_events(状态与事件)

通过网盘分享的文件:麦克风与扬声器.zip
链接: https://pan.baidu.com/s/1XRfwnuU4UsRjR-cs51pf7w?pwd=ztjw 提取码: ztjw

感谢阅读,欢迎指正。

← 返回列表