自学读本:跟着读、照着做,卡住就问 AI
你好,我是吴老师。
这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 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 和普通数据总线最大的不同:它有"专职打拍子"的线。
三、为什么声音不能挤 I2C 的线
I2C 只有两根线,能挂很多设备,靠地址点名。特点是省线、灵活、一次传一点。
问题就在"一次传一点"。我们录音一秒 16000 个采样,每个 32 位(立体声)——光声音就把 I2C 塞满了,它还要服务触摸屏呢。
I2S 干脆不省线,专门拿几根线,只为声音持续跑。把最好的路,留给最赶时间的货。
⚠️ 比喻有边界:I2S 不是无限快,它只是不抢道、不回头,把带宽全花在声音上。
四、ES8311 的分工
ES8311 要"听"两件事:
- 怎么干活:采样率多少、音量多大 → 偶尔说一次 → I2C
- 声音本身:每秒 16000 个采样 → 一刻不停 → I2S
一句话:I2C 管事儿,I2S 送货。
所以初始化代码总是两段:先 I2C 配置好 ES8311,再 I2S 跑数据。配置错一档声音就不对,数据线断一根声音直接没。
五、实验一:改配置,不改数据
请用本课的音频封装做程序:
循环播放 440Hz 音调,屏幕上显示当前音量等级。
按一次 BOOT 就把 ES8311 音量调低一档(走 I2C 改配置),
按到最轻再按恢复最大。播放不用停。
| 我按了几次 | 预测 | 实际 |
|---|---|---|
| 0 次 | ||
| 3 次 | ||
| 到最低 |
关键:程序没碰声音数据,只改一个配置数字,声音立刻变小。 音调变了吗?应该没变——音调由数据决定,音量由配置决定。
六、实验二:改"声道"参数
第二个程序:正常播放一小段旋律,
播到一半把 I2S 临时改成"只用左声道",再播,再改回来。
屏幕提示现在是立体声还是只左声道。
听声音变化——如果本板喇叭少听不出明显差别,就把它当解剖练习:你能说出哪个参数管左右声道吗?(答案是 WS 和声道掩码。)
七、一条线都不白给
回头看第 11 课的"播放 = 按节奏送数字":
- 数字走 DOUT/DIN
- 节奏由 BCK/MCK 掐着
- 左右由 WS 分
- 配置由 I2C 管
以后声音出问题,照这个表猜:变调 → 查节奏(采样率/时钟);一边没声 → 查 WS/声道;完全没声 → 查数据线和功放。
八、过关检查
- I2S 最少几根线?各管什么?(用比喻)
- 声音为什么需要专用传送带?
- ES8311 用 I2C、I2S 各听什么?举例。
- 改音量为什么立刻生效?数据线动了吗?
- 声音变调先怀疑什么?
九、还能玩什么
- 双声道实验:播放切换左/右/立体声
- 变速变调:把回声做成机器人音
- 采样率地图:8k/16k/32k 播同一段音乐,讨论"够用就好"
下一课离开声音,去认识板子的"长期记忆"——SD 卡。