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

📅 2026/8/11 3:21:25
基于 RA8P1 的数字录音与播放工程
本篇在原有触摸屏的基础上新增数字录音功能按屏幕按钮即可录音声音经 WM8960 音频编解码器采集以 WAV 格式存入 SD 卡录完自动回放。一、WM8960 音频编解码器与 I2S 接口WM8960 是低功耗立体声音频编解码器内部集成 ADC/DAC、输入可编程增益放大器PGA和 D 类扬声器功放。它对外有两个接口I2C 控制接口7 位地址 0x1A负责寄存器配置I2S 音频接口负责双向传输 PCM 数据。调试中遇到的一个关键特性WM8960 是只写设备不支持寄存器回读对控制接口发起读操作一律返回 NACK。这意味着不能像调试 I2C 传感器那样读回寄存器验证配置排障只能靠对写入值做位级分析和实际听感/采集波形验证。录音增益链路从麦克风到 I2S 输出1. 输入 PGALINVOL/RINVOL 寄存器0.75 dB 一步范围 -17.25 到 30 dB满增益 0x3F2. LPGA 后级增益LADC_PATH 寄存器 bit6:40 到 21 dB3 dB 步进3. ADC 数字音量LADCVOL/RADCVOL-97.5 到 30 dB4. 电源管理PWR1 提供 VMID/VREF/MICBIAS 偏置PWR2/PWR3 分别控制输出与输入通路电源——录音时只开输入域并断开输出混音器防止回授啸叫。音频编解码模块二、新增外设与引脚配置音频相关的硬件资源全部为 RA8P1 自带外设无需额外编解码芯片之外的新器件外设SSIE1I2S 音频接口用途主机模式16-bit PCM、32-bit word slot录音与播放分时使用引脚BCLK 接 P907、LRCK 接 P906、DATA 接 P206外设GPT2通用定时器用途输出 12.5 MHz MCLK 给 WM8960LRCK 随之锁定在 48.828 kHz引脚GTIOC2A 接 PD06外设IIC1硬件 I2C用途主模式控制 WM8960 寄存器7 位地址 0x1A约 98 kbit/s引脚SDA 接 P511、SCL 接 P512外设SDHI0SD 卡主机接口用途4-bit 模式读写 WAV 文件配合 FAT 文件系统Lab-Project-FreeRTOS-FAT引脚CLK-PD05、CMD-PD04、DAT0 到 DAT3 接 PD03/PD02/PD01/P111、CD-PD07外设UARTSCI9用途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_thread5 毫秒主循环驱动 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 也是 0ALC 原本就未使能。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_writerWAV 解析与写入、pcm_resampler重采样src/device/storage/sd_cardSD 卡驱动与 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?pwdztjw 提取码: ztjw感谢阅读欢迎指正。