AI脑洞板
完整教案
自学课件
第 13 课 · 共 13/51 课

I2S 总线 声音的专用传送带

课时
待定
器材
ESP32-S3 触摸屏板 + USB 线
前置知识
无
配套代码
见项目 demo 目录

你好,我是吴老师。

这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 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 四行波形并排画出来,让它们真的跑起来:

先按暂停,再按"单步"——一次只走一个拍子,慢慢看清每一格。

盯着看四件事:

  1. MCK 在最上面,密密麻麻 —— 它比 BCK 快 8 倍(真实数值:MCK 4.096 MHz,BCK 512 kHz)。
  2. BCK 是"打拍子"的 —— 它每嗒一下,就送走 1 位。数一数:这个拍子从来没停过。
  3. WS 每 16 个拍子翻一次 —— 低的时候是左声道,高的时候是右声道。你看它是不是规规矩矩地来回翻?
  4. 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 不是无限快,它只是不抢道、不回头,把带宽全花在声音上。

I2C 是点播(问一句答一句)、I2S 是直播(声音不断流),为什么声音不能挤 I2C

四、ES8311 的分工

ES8311 要"听"两件事:

  1. 怎么干活:采样率多少、音量多大 → 偶尔说一次 → I2C
  2. 声音本身:每秒 16000 个采样 → 一刻不停 → I2S

一句话:I2C 管事儿,I2S 送货。

所以初始化代码总是两段:先 I2C 配置好 ES8311,再 I2S 跑数据。配置错一档声音就不对,数据线断一根声音直接没。

ES8311 分工:I2C 管配置、I2S 运声音,一句话「I2C 管事儿,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 卡。

第 13 课 · 音量阶梯

第 13 课 · 音量阶梯

循环播放 440Hz 音调,按 BOOT 把 ES8311 音量调低一档,音调一点不变。

13I2S音量I2C
第 13 课 · 声道切换

第 13 课 · 声道切换

播放旋律时按 BOOT,在双声道、只左、只右三种输出之间切换。

13I2S声道WS