开始前适用开发板:ESP32-S3 Korvo · 开发框架:ESP-IDF
适用开发板:Korvo S3 · 工程
03.development.audio_record_play· targetesp32s3
前置:I2S Codec
学习时长:约 25 分钟 · 难度:★★★☆☆
学习目标
完成本节后,你将能够:
- 理解 I2S 全双工音频通路(录音 ADC + 播放 DAC)
- 掌握 ES7210(录音)和 ES8311(播放)的协作方式
- 了解 PSRAM 作为音频缓冲区的使用方法
- 学会用 LVGL UI 安全地控制录音/播放状态
1. 这个例子在干嘛
一个完整的 录音 → 暂存 → 回放 应用。ES7210 采集麦克风音频写入 PSRAM 缓冲区(约 6 秒),按钮切换后通过 ES8311 播放出来。断电数据丢失。
生活类比:手机的语音备忘录,但只有一条,关机就没了。
┌───────────┐ 模拟 ┌──────────┐ I2S ┌──────────┐ PSRAM
│ 板载麦克风 │────────→│ ES7210 │────────→│ ESP32-S3 │──────→ 音频缓冲
│ │ 音频信号 │ ADC 采集 │ PCM 数据│ │ ~6 秒
└───────────┘ └──────────┘ │ │
│ LVGL UI │
│ 🔴录音 │
┌───────────┐ 模拟 ┌──────────┐ I2S │ 🟢播放 │ PSRAM
│ 板载扬声器 │←────────│ ES8311 │←────────│ │←───── 音频缓冲
│ │ 音频信号 │ DAC 播放 │ PCM 数据│ │
└───────────┘ └──────────┘ └──────────┘
2. 编译烧录
cd Korvo_Firmware\03.development.audio_record_play
idf.py set-target esp32s3
idf.py build flash monitor
接好扬声器或耳机。
3. 使用步骤
- 屏幕出现红色(录音)和绿色(播放)两个按钮
- 按 红色按钮 → 开始录音(对着麦克风说话)
- 录满约 6 秒自动停止(或再按一次停止)
- 按 绿色按钮 → 播放刚录的内容
- 可反复录制和播放
4. 运行现象
| 阶段 | 屏幕 | 串口 | 声音 |
|---|---|---|---|
| 启动 | 红/绿按钮显示 | I2C/I2S 初始化 | 静音 |
| 录音中 | 红色按钮高亮 | Recording... | — |
| 录音完成 | 按钮恢复 | Record done: N samples | — |
| 播放中 | 绿色按钮高亮 | Playing... | 喇叭出声 |
| 播放完成 | 按钮恢复 | Play done | 静音 |
5. 关键文件与代码解析
| 文件 | 作用 | 重点 |
|---|---|---|
main/app_main.c | 入口:Codec + 显示 + 音频 | 初始化顺序 |
main/audio_record_play.c | 核心:录音/播放逻辑 | I2S + PSRAM |
main/ui_audio.c | LVGL 按钮 UI | 线程安全控制 |
核心技术要点
| 模块 | 芯片/技术 | I2C 地址 | 说明 |
|---|---|---|---|
| 录音 ADC | ES7210 | 0x40 | 4 通道 ADC,本例用 1 通道 |
| 播放 DAC | ES8311 | 0x18 | 单声道 DAC + 功放驱动 |
| 数据总线 | I2S | — | BCLK + WS + DATA |
| 控制总线 | I2C | — | SDA + SCL 配置寄存器 |
| 音频缓冲 | PSRAM | — | 掉电丢失 |
录音/播放流程
录音:
i2s_channel_read(rx_channel, psram_buf, chunk_size)
→ 循环填充 PSRAM 直到满或用户停止
播放:
i2s_channel_write(tx_channel, psram_buf, chunk_size)
→ 循环输出 PSRAM 中的 PCM 数据
LVGL 线程安全
录音/播放在 FreeRTOS 任务中运行,UI 在 LVGL 任务中。不能直接在音频任务中调用 LVGL API。
正确 ✓:通过队列/标志位通知 LVGL 任务更新 UI
错误 ✗:在音频任务中直接 lv_label_set_text()
6. 音频参数
| 参数 | 典型值 | 说明 |
|---|---|---|
| 采样率 | 16000 Hz | 语音质量足够 |
| 位深 | 16 bit | 每个采样 2 字节 |
| 声道 | 1(单声道) | ES8311 单声道 |
| 缓冲时长 | ~6 秒 | 受 PSRAM 分配限制 |
| 数据量 | 16000×2×6 = 192 KB | 约 192 KB PSRAM |
7. 常见问题与排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 录音无声 | ES7210 I2C 地址/通信失败 | 串口看 I2C 错误;跑 board_test |
| 录音无声 | 麦克风硬件故障 | 检查焊接 |
| 播放杂音 | 采样率不匹配 | 录音和播放采样率必须一致 |
| 播放杂音 | I2S 时钟配置 | BCLK/WS/DATA 引脚确认 |
| 录音太短 | PSRAM 分配不足 | 降低采样率(16k→8k)可翻倍 |
| 按钮无反应 | 触摸校准/LVGL | 检查 I2C 触摸驱动 |
| 播放音量小 | PA 未使能 | 检查 TCA9554 PA 引脚/增益 |
8. 动手改造建议
- 存 SD 卡:录音保存为 WAV 文件到 TF 卡(永久保存)
- 多段录音:支持录制多段,列表选择播放
- 音量调节:添加 LVGL 滑条控制 ES8311 DAC 音量
- 网络对讲:录音 → Wi-Fi 发送 → 另一块板子播放
- 变声器:修改 PCM 数据的采样率实现变速/变调
9. 知识延伸
- I2S 全双工:ESP32-S3 I2S 可同时收发,一个通道录音一个通道播放
- PSRAM vs Flash:PSRAM 读写快但掉电丢失,Flash 持久但写入慢且有擦写寿命
- PCM 格式:未压缩的原始音频数据,每个采样是一个 16 位有符号整数
- 采样率与音质:8kHz 电话质量,16kHz 语音识别质量,44.1kHz CD 质量
10. 下一步
| 方向 | 推荐例程 | 说明 |
|---|---|---|
| MP3 播放 | MP3 Player | 从文件解码播放 |
| 音频频谱 | Audio FFT | 频谱可视化 |
| I2S 基础 | I2S Codec | Codec 初始化入门 |
| P4C5 对比 | P4C5 录音播放 | MIPI 大屏版 |
酷世DIY · Kevincoooool