你好,我是吴老师。
这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 AI,加一句"请一次只解释一个概念,讲完问我一个小问题"。
读完之后,你应该能:说出 I2S 每根线的角色;解释声音为什么要有专用传送带;说清 ES8311 用 I2C 管什么、用 I2S 运什么。
用时:45–60 分钟。准备:板子、数据线、已经接入板卡 Skill 的 WorkBuddy。
一、两条你已经偷偷用过的总线
前两课放声音、收声音,那些数字是怎么在板子和 ES8311 之间跑的?我们把初始化代码整段借来用,没打开看。今天打开盖子。
声音数据走 I2S;ES8311 还有一根线走 I2C(第 8 课触摸芯片也走 I2C)。
奇怪:同一颗芯片,为什么声音走 I2S,配置走 I2C?先记结论:
- I2C 是点播:问一句答一句,用来"告诉芯片怎么干活"
- I2S 是直播:声音数据一刻不停地流,用来"搬声音本身"
二、拆开 I2S 这条传送带
I2S = Inter-IC Sound,专为数字声音设计。最少三根线,有的板子多一根:
| 线 | 名字 | 比喻 | 干什么 |
|---|---|---|---|
| BCK | 位时钟 | 打拍子 | 每送一位"嗒"一下,对齐节奏 |
| WS | 声道选择 | 红绿灯 | 现在走左声道还是右声道 |
| DOUT/DIN | 数据线 | 传送带 | 把声音数字送出去 / 接进来 |
| MCK | 主时钟 | 总指挥 | 让节奏更稳定 |
为什么送数字要专门配一根打拍子的线?
因为声音是直播。画面卡一下没关系,声音时快时慢就变调了。声音必须严格按固定节奏到达,所以要一根时钟线专门卡节奏。
💡 这是 I2S 和普通数据总线最大的不同:它有"专职打拍子"的线。
亲眼看一遍:四根线是怎么配合的
光记名字没用,关键是它们怎么"对表"。下面这个动画把 MCK、BCK、WS、DOUT 四行波形并排画出来,让它们真的跑起来:
先按暂停,再按"单步"——一次只走一个拍子,慢慢看清每一格。
盯着看四件事:
- MCK 在最上面,密密麻麻 —— 它比 BCK 快 8 倍(真实数值:MCK 4.096 MHz,BCK 512 kHz)。
- BCK 是"打拍子"的 —— 它每嗒一下,就送走 1 位。数一数:这个拍子从来没停过。
- WS 每 16 个拍子翻一次 —— 低的时候是左声道,高的时候是右声道。你看它是不是规规矩矩地来回翻?
- DOUT 上的数字换了一批又一批 —— 每个声道正好占用 16 位,和 WS 的高低完全对齐。
试着点这三个按钮,对比它们的差别:
| 你点哪个 | WS 会怎样 | DOUT 会怎样 |
|---|---|---|
| ① 立体声 | 照常每 16 拍翻一次 | 左右两格都有数据 |
| ② 右声道填 0 | 照样在翻(没变!) | 右声道那 16 位全变成 0 |
| ③ 真正的单声道 | 不翻了,一直保持低 | 右声道那一格根本不存在 |
💡 ②和③的差别是本课最值钱的一幕——它们听起来都是"只有左声道有声",但原理完全不同:
- ② 是"轮到你了,但不给你东西":WS 照常在翻,只是右声道那格内容被填成了 0。 (本项目
demo02用的就是这招:slot 模式没变,只把数据填 0。)- ③ 是"不轮到你了":把硬件配置改成 MONO 模式,连"左右轮流"这件事都取消了, 所以 WS 一直保持低电平。
这就解释了你以后会遇到的问题:声音"一边没声",先查 WS——看它是"在翻但数据是 0", 还是"压根不翻了"。 两种情况,修的地方不一样。
三、为什么声音不能挤 I2C 的线
I2C 只有两根线,能挂很多设备,靠地址点名。特点是省线、灵活、一次传一点。
问题就在"一次传一点"。我们录音一秒 16000 个采样,每个 32 位(立体声)——光声音就把 I2C 塞满了,它还要服务触摸屏呢。
I2S 干脆不省线,专门拿几根线,只为声音持续跑。把最好的路,留给最赶时间的货。
⚠️ 比喻有边界:I2S 不是无限快,它只是不抢道、不回头,把带宽全花在声音上。
四、ES8311 的分工
ES8311 要"听"两件事:
- 怎么干活:采样率多少、音量多大 → 偶尔说一次 → I2C
- 声音本身:每秒 16000 个采样 → 一刻不停 → I2S
一句话:I2C 管事儿,I2S 送货。
所以初始化代码总是两段:先 I2C 配置好 ES8311,再 I2S 跑数据。配置错一档声音就不对,数据线断一根声音直接没。
五、自检小测
先自己想,再点开对答案。
1. 两条总线,一句话各是什么?
- I2C 是"点播":问一句答一句 —— 用它告诉芯片怎么干活。
- I2S 是"直播":一刻不停地流 —— 用它搬声音本身。
I2C 管事儿,I2S 送货。
2. I2S 四根线,各像什么?各干什么?
| 线 | 像什么 | 干什么 |
|---|---|---|
| MCK | 总指挥 | 定基准,别人都听它的 |
| BCK | 打拍子 | 每"嗒"一下,送 1 位 |
| WS | 红绿灯 | 该左声道还是右声道 |
| DOUT | 传送带 | 声音数字本身 |
3. 为什么声音非得配一根"专门的时钟线"?
因为声音耽误不起。
- 画面卡一下 → 只是顿一下;
- 声音一快一慢 → 音调当场就变了。
所以声音必须按固定节奏到达,需要一根线专门管节奏(BCK)。
4. ES8311 用两条线分别"听"什么?
- 走 I2C:怎么干活 —— 音量多大、采样率多少(偶尔说一次)
- 走 I2S:声音本身 —— 每秒 16000 个采样(一刻不停)
5. 你把音量调小了。这时候 I2S 上滚的数字,变了吗?
没变。
音量是配置,走 I2C;声音数字在 I2S 上照原样滚。
所以你看到:声音立刻变小,数据线一点没动。
6. 声音出毛病了,照这张表猜——三种"坏法"各查哪里?
| 症状 | 先查哪里 |
|---|---|
| 变调(音高不对) | 查节奏:采样率 / BCK / MCK |
| 一边没声 | 查 WS / 声道设置 |
| 完全没声 | 查数据线和功放(功放 GPIO1 低电平才开) |
记住这张表,比背代码有用。
7. 用一句话把这一课讲给同学听。
参考说法(不是唯一答案):
"声音走 I2S,配置走 I2C。 I2S 上有四根线:MCK 总指挥、BCK 打拍子、WS 红绿灯、DOUT 传送带。 声音又急又多,普通线挤不下,所以给它修了条专线—— 把最好的路,留给最赶时间的货。"
六、还能玩什么
- 双声道实验:播放切换左/右/立体声
- 变速变调:把回声做成机器人音
- 采样率地图:8k/16k/32k 播同一段音乐,讨论"够用就好"
下一课离开声音,去认识板子的"长期记忆"——TF 卡。