MAX98357A 是一块 3W 单声道 D 类功放,用三根 I2S 线直接接收 ESP32 送出的数字音频。BCLK 接 GPIO27、LRC 接 GPIO26、DIN 接 GPIO25,Vin 接 ESP32 的 5V VIN 引脚,GND 接 GND,GAIN 和 SD 先悬空不接,一段很短的程序就能让小喇叭发出干净的测试音——不用 DAC 模块,不用模拟电路,也不用音量电位器。
本文用的是我们的 MAX98357A I2S 功放模块——一块只有指甲盖大小的深紫色小板,也是从蜂鸣器的哔哔声进阶到语音、提示音和音乐最省事的一步。接线之前先提醒一句:模块出厂时排针和绿色接线端子都还没焊上,迷你喇叭的两个焊片也只是裸焊盘,所以要先留一点时间焊接——我们的排针焊接教程有完整步骤。
用大白话讲,I2S 是什么?
I2S(Inter-IC Sound)是一种三线数字连接,专门把已经做好的音频采样从一颗芯片送到另一颗芯片。BCLK 就像节拍器,每秒大约滴答 140 万次;每滴答一下,DIN 就送出当前采样的一个位;LRC 在低电平和高电平之间来回切换,标明这些位属于左声道还是右声道。每个采样 16 位、每秒 44,100 个采样、两个声道——乘起来正好是那 1.41MHz 的位时钟,全部由 ESP32 的硬件自动产生,你的程序同时可以去做别的事。
因为线上传的只有 0 和 1,这条连接几乎不怕干扰。在模拟音频电路里,导线拾取到的每一毫伏干扰都会叠加到音乐上,再跟着一起被放大;而在 I2S 线上,拾取到的噪声只是骑在 3.3V 方波上面,除非它把电平拉过芯片的输入阈值——低于 0.6V 读作 0,高于 1.3V 读作 1——否则什么都不会改变,而杂散的嗡嗡声通常只有几毫伏。所以这里杜邦线走得整不整齐几乎无所谓;数模转换也因此放在 MAX98357A 芯片内部完成,离喇叭端子只有几毫米,中间没有任何导线可以被干扰。同样的阈值也让 ESP32 的 3.3V 信号可以直接驱动用 5V 供电的功放,不需要电平转换器。

MAX98357A 也不需要 MCLK——很多 I2S DAC 都要求的第四根高速主时钟线——所以三根数据线加两根电源线就是全部接口。
零件清单:MAX98357A 第一声搭建
Parts list
只需准备一次:功放的排针和螺丝接线端子,以及喇叭的焊片,出厂时都还没焊。公对公杜邦线方便在面包板上跨接电源轨。
五根线分别接哪里?
MAX98357A 模块的底边有七个引脚,丝印从左到右依次是 LRC、BCLK、DIN、GAIN、SD、GND、Vin。第一次搭建只用到其中五个:
| 功放引脚 | ESP32 引脚 | 传输什么 |
|---|---|---|
| Vin | VIN | 来自 USB 线的 5V——不是 3V3(见下文) |
| GND | GND | 共地 |
| BCLK | GPIO27 (D27) | 位时钟——每个位滴答一次 |
| LRC | GPIO26 (D26) | 左右声道选择——每个采样切换一次 |
| DIN | GPIO25 (D25) | 采样数据本身 |
| GAIN | 悬空不接 | 悬空即为 9dB 增益 |
| SD | 悬空不接 | 板上元件已经设定为单声道混音 |
GPIO27、26、25 只是惯例,不是硬性规定:ESP32 的 I2S 外设经由内部 GPIO 矩阵路由,几乎任何能做输出的引脚都可以用。选这三个,是因为它们和 VIN、GND 挨在同一边,而且正是最常用的 ESP32 音频库自带 README 示例里的引脚,网上借来的代码不用改就能跑。
30 针的 ESP32 板本身不要插上面包板:它跨插在 400 孔面包板上时,每个引脚旁边最多只剩一个空孔,还会占掉面包板 30 排里的 15 排(面包板怎么用一文解释了原因)。所以把功放的排针插在面包板上,ESP32 放在旁边,再用公对母杜邦线连起来:母头套在 ESP32 的引脚上,公头插进与功放引脚同一编号的那一排。喇叭则接在功放的螺丝接线端子上。

功放要从 ESP32 的 VIN 引脚取电(这个引脚接的就是 USB 线的 5V),千万不要接 3V3。芯片在 2.5V 到 5.5V 之间都能工作,但 D 类功放的输出功率与电源电压的平方成正比——数据手册里 8Ω 的输出功率从 5V 时的 1.8W 降到 3.7V 时的 0.93W——而且 3V3 引脚后面是板上那颗小稳压器,它本来就要应付 ESP32 Wi-Fi 的瞬间大电流。我们的 ESP32 供电指南详细算过这笔电流账。
GAIN 和 SD 引脚到底有什么用?
MAX98357A 的 GAIN 和 SD 都不是数字输入。两者都按模拟电压电平读取,再和芯片内部比较器的阈值比较,而电平由引脚怎样用电阻接线决定——这正是为什么照抄别家模块的接线,会在毫无报错的情况下完全没声,或者小声得像耳语:接法不同,芯片就处在另一种模式。
GAIN 可以选择五档固定增益,见 MAX98357A 数据手册:
| GAIN 引脚接法 | 增益 |
|---|---|
| 经 100kΩ 电阻接 GND | 15dB |
| 直接接 GND | 12dB |
| 悬空不接(本模块默认) | 9dB |
| 直接接 Vin | 6dB |
| 经 100kΩ 电阻接 Vin | 3dB |
SD 的名字来自 shutdown(关断),但它其实是一个分四段的模式引脚,内部带 100kΩ 下拉电阻:
| SD 上的电压 | 功放的动作 |
|---|---|
| 低于 0.16V | 关断——没有输出 |
| 0.16V – 0.77V | 播放(左 + 右)÷ 2——单声道混音 |
| 0.77V – 1.4V | 只播放右声道 |
| 高于 1.4V | 只播放左声道 |
这块模块用一颗印着 105(1MΩ)的小黑电阻把 SD 接到 Vin,它和内部那颗 100kΩ 下拉电阻组成分压:5V × 100k ÷ 1.1M ≈ 0.45V,稳稳落在 0.16–0.77V 区间。所以开袋即用时,模块播放的是(左 + 右)÷ 2——这也是开箱后最常见的意外:MAX98357A 是单声道功放。一个喇叭,两个声道混在一起。要真正的立体声,就得用两块模块接在同样的三根 I2S 线上:SD 直接接 Vin 的那块播放左声道(5V 远高于 1.4V),另一块在 SD 和 Vin 之间加一颗 560kΩ 电阻,与板上的 1MΩ 并联后约为 1.1V,就播放右声道。
应该配什么喇叭?
MAX98357A 在 5V 供电下能向 4Ω 输出 3.2W、向 8Ω 输出 1.8W(总谐波失真 10% 时),因为它的桥接负载(BTL)输出是把喇叭接在两个反相摆动的输出端之间——喇叭两端看到的电压摆幅接近单个 5V 输出端的两倍,而功率等于电压的平方除以电阻。所以 4Ω 3W 的全频喇叭是天生的搭档,旧蓝牙音箱和音乐玩具里的喇叭往往正是这个规格——丢掉之前值得先拆下来。不过满功率时,功放要从 5V 抽大约 0.7A(3.2W ÷ 5V,再加上自身损耗),再加上 ESP32 自己的 Wi-Fi 瞬间电流,已经超过笔记本电脑 500mA USB 口能给的电流,所以要开大声的 4Ω 作品,请用 1A 的手机充电头供电。
零件清单里的 8Ω 0.5W 迷你喇叭适合第一声测试和语音提示,但要老实说明一点:功放能给它推到 1.8W,是它额定功率的三倍多。增益接法决定满幅时有多大声:数据手册的增益以 1.27V RMS 为基准,所以在默认 9dB 下,满幅正弦波约为 3.6V RMS,接 8Ω 约 1.6W。把 GAIN 经 100kΩ 接到 Vin(3dB),满幅就降到约 0.4W,不管软件送出什么,都在喇叭的额定范围内。用默认增益时,软件音量要压低;全部开到最大,迟早会闻到音圈烧焦的味道。
迷你喇叭的焊片是裸焊盘,所以要接两条引线:从杜邦线包里拿一条多余的剪成两段,两头都剥皮,一头分别焊在两个焊片上,另一头锁进功放的绿色螺丝接线端子。以后换喇叭只要几秒钟。
BTL 结构直接带出一条安全规则:两个喇叭端子都是主动驱动的,所以绝对不能把任何一端接到 GND,也绝对不能让两条引线互相碰到——任何一种情况都等于把输出级直接短路。模块喇叭孔旁边的 − 和 + 标记只表示“接线方向”,并不是“负极就是地”。
怎样让它发出第一声?
第一个 MAX98357A 程序完全不用装库——Arduino-ESP32 核心自带 ESP_I2S,可以直接驱动 I2S 硬件。它从 ESP32 开发板包 3.0 版开始提供,本文两段程序都需要 3.0 或更新版本,所以先在开发板管理器里确认 esp32 by Espressif Systems 是 3.0 或以上;在 2.x 上,这段程序会卡在 ESP_I2S.h: No such file or directory。然后选择 ESP32 Dev Module,用数据线上传。
// MAX98357A 第一声测试:干净的 441 Hz 测试音,不需要装库。
// 开发板:ESP32 Dev Module(30 针 NodeMCU 款式,CH340,USB-C)
#include <ESP_I2S.h>
#include <math.h>
const uint8_t PIN_BCLK = 27; // 接功放 BCLK
const uint8_t PIN_LRC = 26; // 接功放 LRC(字选择 / 左右声道)
const uint8_t PIN_DIN = 25; // 接功放 DIN(采样数据)
const uint32_t SAMPLE_RATE = 44100;
const int FRAMES_PER_CYCLE = 100; // 44100 / 100 = 正好 441 Hz
const int16_t VOLUME = 3000; // 约为满幅的 9%,对 0.5W 喇叭很温和
I2SClass i2s;
int16_t wave[FRAMES_PER_CYCLE * 2]; // 一个完整正弦周期,左右声道交错存放
void setup() {
for (int n = 0; n < FRAMES_PER_CYCLE; n++) {
int16_t s = (int16_t)(VOLUME * sinf(2.0f * PI * n / FRAMES_PER_CYCLE));
wave[2 * n] = s; // 左声道
wave[2 * n + 1] = s; // 右声道,反正功放会把两者取平均
}
i2s.setPins(PIN_BCLK, PIN_LRC, PIN_DIN);
i2s.begin(I2S_MODE_STD, SAMPLE_RATE, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO);
}
void loop() {
i2s.write((uint8_t *)wave, sizeof(wave)); // 阻塞,直到 DMA 缓冲区收下这批数据
}
上传后,喇叭会持续发出稳定的 441Hz 音。这个看起来有点怪的频率是故意的:在 44.1kHz 下,一个正弦周期正好 100 个采样,所以 loop 可以无限重放这一小段缓冲区,没有接缝,也没有咔嗒声。VOLUME 常数特意设在满幅的约 9%:在默认 9dB 下,接 8Ω 喇叭约 13mW,听得很清楚,又远低于它 0.5W 的额定功率。音量交给软件调,增益接法只决定上限。
怎样播放 WAV 或 MP3 文件?
测试音证明 MAX98357A 的接线没问题;声音文件则证明整条工具链都没问题。最常用的库是 ESP32-audioI2S,但版本要注意:它近期的版本是为 ESP32-S3 这类带 PSRAM 的芯片而写的,而本文的 30 针 WROOM-32 板没有 PSRAM。它在库管理器里显示为 ESP32-audioI2S-master——请选 3.0.13 版,这是一个仍能在普通 ESP32 板上运行的旧版本(作者标明 3.2.1 是最后一个不需要 PSRAM 的版本);它自带的 README 示例用的也是这三个引脚。
// MAX98357A 第二步:从 ESP32 的闪存(SPIFFS)播放 WAV 文件。
// 库:ESP32-audioI2S v3.0.13(PSRAM 之前的版本,能在普通 ESP32 板上运行)
#include <Arduino.h>
#include <Audio.h>
#include <SPIFFS.h>
Audio audio;
void setup() {
SPIFFS.begin();
audio.setPinout(27, 26, 25); // BCLK、LRC、DIN,和测试音用的是同样三根线
audio.setVolume(8); // 范围 0-21;小喇叭先从低音量开始
audio.connecttoFS(SPIFFS, "/hello.wav");
}
void loop() {
audio.loop(); // 持续喂数据给解码器;loop() 里不要放延时
}
文件本身存放在 ESP32 自己的闪存里:把 hello.wav 放进程序文件夹里的 data 文件夹。Arduino IDE 2 没有内置这个上传工具,所以要安装免费的 arduino-spiffs-upload 插件,关掉串口监视器,然后在命令面板(Ctrl+Shift+P,Mac 上是 Cmd+Shift+P)里运行 Upload SPIFFS to Pico/ESP8266/ESP32;之后每次开机,程序都会播放这个文件。setVolume() 的范围是 0–21——迷你喇叭从 8 左右开始。
WAV 要导出成 16 位 PCM、44.1kHz,语音可以用 16kHz,千万不要用 22.05kHz。这个库会按文件本身的采样率设置 I2S 时钟;MAX98357A 在 8、16、32、44.1 或 48kHz 下都能正常工作,但数据手册把 11.025、12、22.05 和 24kHz 列为不支持,所以这些采样率的音频就算测试音正常,也可能播放无声或杂乱失真。文件也要短:默认分区方案大约只留 1.4MB 给文件,约等于 15 秒的 44.1kHz 单声道音频。更长的片段改用 MP3,在同一个 connecttoFS() 调用里改一行就行;要播放网络电台,只需再加上连接 Wi-Fi 的代码。
我们常见的错误
程序在跑,却完全没声音。最典型的原因是 BCLK 和 LRC 接反了:这时功放看到的位时钟只有 44.1kHz,远低于它 243kHz 的下限,而帧时钟却是 1.41MHz,远高于 96kHz 的上限,所以永远找不到有效的帧,一直保持静音。第二个原因是 SD:照抄了把 SD 接地的原理图,功放就会一直处于关断状态。两种情况都只要改一根杜邦线。
没有 COM 口,什么都上传不了。这根本不是音频问题:要么是只能充电的 USB 线,要么是没装 CH340 驱动——上传失败排查指南逐一讲了这两个原因。
声音之间有沙沙的底噪。增益接到 12–15dB,再配一个贴近耳朵的小喇叭,功放自身的底噪就会和音乐一起被放大。反直觉地做:把增益接低(3–9dB),再用软件把音量推回来——音乐回来了,沙沙声却不会。
声音小、失真,或者一到大声的段落开发板就重启。功放接的是 3V3。输出功率随电源电压的平方下降,大声段落还要和 Wi-Fi 射频抢那颗小稳压器。把功放 Vin 的杜邦线移到 VIN 引脚。已经接在 VIN、用的又是 4Ω 喇叭?把笔记本 USB 口换成 1A 的手机充电头。
常见问题
MAX98357A 是立体声还是单声道?
单声道。它能接收立体声 I2S 数据流,但在这块模块上只通过一个喇叭播放(左 + 右)÷ 2 的混音。要立体声,就用两块模块接同样的三根 I2S 线:左声道那块的 SD 直接接 Vin,右声道那块在 SD 和 Vin 之间加一颗 560kΩ 电阻。
MAX98357A 能推耳机吗?
不能。它的桥接输出两端都是主动驱动的,而耳机插座的套筒是接地的——插上耳机就等于把一个正在驱动的输出端短路到公共端。它在耳边也大声得危险:默认 9dB 下,满幅接 32Ω 耳机约 400mW。要接耳机或线路输出,请改用对地参考输出的 I2S DAC 板。
GAIN 和 SD 引脚一定要接吗?
第一次搭建不用。GAIN 悬空就是 9dB,模块板上的电阻也已经把 SD 保持在单声道混音区间。想改变音量上限就给 GAIN 接电阻;只有组立体声或做硬件静音时才需要动 SD。
MAX98357A 要接 ESP32 哪些引脚?
任何能做输出的引脚都行——ESP32 的 GPIO 矩阵几乎能把 I2S 路由到任何地方。GPIO27(BCLK)、GPIO26(LRC)和 GPIO25(DIN)是库示例和接线教程里事实上的标准,用它们可以让借来的代码照样能跑。
MAX98357A 配什么喇叭最好?
额定约 3W 的 4Ω 喇叭能拿到芯片在 5V 下的全部 3.2W;8Ω 喇叭最多只有 1.8W。旧蓝牙音箱里的全频喇叭通常就是 4Ω 3W,搭配起来非常好。0.5W 迷你喇叭适合测试音和语音提示;把 GAIN 接到 3dB,就算满幅也只有约 0.4W。
最后更新:2026年11月。有问题?WhatsApp 联系我们。



MAX98357A I2S 3W CLASS D AUDIO AMPLIFIER BREAKOUT BOARD FOR RASPBERRY PI ESP32
NodeMCU ESP32 Wi-Fi + Bluetooth Development Board CH340/CP2012 - For IOT Project - ESP-32 (CH340)
8 Ohm 0.5W Mini Speaker Small Round Audio Speaker for Arduino DIY Projects Electronic Components Sound Module
MB102 Breadboard 170 400 830 Holes Breadboard Donut Board Arduino Prototype Multi Color - BREADBOARD (400 HOLES)
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-F 30CM
Data Cable Type-A Type-C MicroUSB Type-B 0.5m 1m 30cm 0.3m 100cm Data Transfer Upload Code - TYPE-A TO TYPE-C CABLE (0.5M)
80W Electronics Soldering Iron with LCD Display Ajustable Temperature Microconstroller Electronic Project
50g Soldering Wire Lead with Flux Core 1mm Diameter
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-M 20CM