开始前适用开发板:ESP32-S3 Korvo · 开发框架:ESP-IDF
适用开发板:Korvo S3 · 工程
02.beginner.i2s_codec· targetesp32s3
学习时长:约 25 分钟 · 难度:★★☆☆☆
Korvo 独有:P4C5 无此独立例程
学习目标
完成本节后,你将能够:
- 理解 I2S 协议的基本概念(BCLK、WS、DATA 三线制)
- 区分 I2C(控制总线)和 I2S(数据总线)在音频中的分工
- 掌握 ES8311(播放 DAC)和 ES7210(录音 ADC)的初始化流程
- 为后续录音播放、MP3、FFT 等例程打下音频基础
1. 这个例子在干嘛
演示 I2S 与板载音频 Codec 芯片的初始化与收发。通过 I2C 总线配置 Codec 芯片参数(采样率、增益等),然后通过 I2S 总线传输音频 PCM 数据。屏幕和串口显示各阶段初始化状态。
生活类比:I2C 是"给音频芯片发遥控指令"(配置寄存器),I2S 是"实际传递音乐的管道"(PCM 数据流)。
┌───────────────────────────────────────────────────────┐
│ I2C 总线(控制 —— 低速,配置寄存器) │
│ ESP32-S3 ──I2C──→ ES8311 (0x18) 播放 DAC │
│ ──I2C──→ ES7210 (0x40) 录音 ADC │
├───────────────────────────────────────────────────────┤
│ I2S 总线(数据 —— 高速,传输 PCM 音频) │
│ ESP32-S3 ←─I2S── ES7210 (麦克风 → PCM 数据) │
│ ──I2S──→ ES8311 (PCM 数据 → 扬声器) │
└───────────────────────────────────────────────────────┘
I2C 与 I2S 对比
| 协议 | 用途 | 信号线 | 速率 | 音频中的角色 |
|---|---|---|---|---|
| I2C | 配置 Codec 寄存器 | SDA + SCL | 100~400 kHz | "遥控器" |
| I2S | 传输 PCM 音频数据 | BCLK + WS + DATA | MHz 级 | "音乐管道" |
2. 编译烧录
cd Korvo_Firmware\02.beginner.i2s_codec
idf.py set-target esp32s3
idf.py build flash monitor
3. 运行现象
| 阶段 | 屏幕/串口 | 说明 |
|---|---|---|
| I2C 初始化 | I2C init OK | SDA/SCL 引脚配置 |
| ES8311 检测 | ES8311 found at 0x18 | 播放 DAC 在线 |
| ES7210 检测 | ES7210 found at 0x40 | 录音 ADC 在线 |
| Codec 配置 | Codec configured: 16kHz | 采样率/增益/通道 |
| I2S 初始化 | I2S init OK | BCLK/WS/DATA 就绪 |
| 就绪 | Audio ready | 可以开始收发 |
4. 关键文件与代码解析
| 文件 | 作用 | 重点 |
|---|---|---|
main/app_main.c | 入口 + 初始化流程 | 顺序很重要 |
核心初始化顺序
1. I2C 总线初始化(SDA/SCL 引脚 + 频率)
2. ES8311 初始化
├── i2c_master_write_reg(0x18, ...) → 配置采样率
├── 配置 DAC 增益
└── 使能输出
3. ES7210 初始化
├── i2c_master_write_reg(0x40, ...) → 配置采样率
├── 配置 ADC 增益
└── 使能通道
4. I2S 通道初始化
├── i2s_channel_init_std_mode() → 标准模式
└── i2s_channel_enable() → 使能收/发
核心 API
| API | 说明 |
|---|---|
i2s_channel_init_std_mode() | 标准模式 I2S 通道初始化 |
i2s_channel_enable() | 使能通道 |
i2s_channel_read(rx, buf, size) | 读取录音 PCM 数据 |
i2s_channel_write(tx, buf, size) | 写入播放 PCM 数据 |
es8311_init() | ES8311 DAC 初始化(通过 I2C) |
es7210_init() | ES7210 ADC 初始化(通过 I2C) |
5. I2S 三线时序简介
BCLK ─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─ 位时钟(每个脉冲传 1 bit)
└─┘ └─┘ └─┘ └─┘ └─┘ └─┘
WS ──────────┐ ┌── 字选择(高=右声道, 低=左声道)
└─────────────────┘
DATA ──D15─D14─D13─...──D1──D0── PCM 数据(MSB 先发)
- BCLK(Bit Clock):每个脉冲传输 1 bit 数据
- WS(Word Select):区分左右声道(16kHz 采样率时 WS=16kHz)
- DATA:实际的 PCM 音频数据
6. 常见问题与排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
ES8311 not found | I2C 地址/引脚错误 | 确认 SDA/SCL;i2cdetect 扫描 |
ES7210 not found | 同上 | 检查 I2C 总线上的设备 |
| I2S 无数据 | BCLK/WS/DATA 引脚配错 | 对照原理图 |
| 杂音 | 采样率不匹配 | Codec 和 I2S 采样率必须一致 |
| 音量小 | DAC 增益太低 | 修改 ES8311 增益寄存器 |
| 单声道只有一侧 | WS 极性配置 | 检查 i2s_std_slot_config_t |
7. 动手改造建议
- 环回测试:麦克风 → I2S 读 → I2S 写 → 扬声器(实时听到自己的声音)
- 修改采样率:从 16kHz 改为 44.1kHz,对比音质差异
- 录音存 Flash:将 PCM 数据写入 SPIFFS
- 简单音效:生成正弦波 PCM 数据播放(蜂鸣器效果)
8. 知识延伸
- PCM 格式:未压缩的原始音频。16bit 采样 = 每个点 -32768~+32767 的整数
- 采样率决定频率上限:奈奎斯特定理,16kHz 采样最高还原 8kHz 的声音
- ES8311 芯片:Everest Semiconductor 出品,低功耗音频 codec,支持 8~96kHz
- ES7210 芯片:4 通道 ADC,本板用 1~2 通道,支持数字麦克风阵列
9. 下一步
| 方向 | 推荐例程 | 说明 |
|---|---|---|
| 录音播放 | Audio Record Play | 完整闭环 |
| MP3 播放 | MP3 Player | 解码播放 |
| 音频频谱 | Audio FFT | 频谱分析 |
| 通用音频 | Audio 教程 | 理论详解 |
酷世DIY · Kevincoooool