之前购买了一个MAX98357 I2S功放模块,这次编写简单的代码进行测试。
硬件连接如下:
MAX98357 | ESP32S3 | 用途 |
SPK+/- 连接喇叭 | 连接喇叭正负极,喇叭输出 | |
DIN | 48 | 从 ESP32S3 发送的 I2S数据 |
BCLK | 45 | 从 ESP32S3 发送的 I2S Clock |
LRC | 35 | 从 ESP32S3 发送的 I2S 左右声道选择信号 |
GND | GND | 地 |
VCC | 5V | 供电 |
按照上述方案连接好后,烧录如下代码:
#include <I2S.h>
const int frequency = 440; // frequency of square wave in Hz
const int amplitude = 32000; // amplitude of square wave
const int sampleRate = 8000; // sample rate in Hz
const int bps = 16;
const int halfWavelength = (sampleRate / frequency); // half wavelength of square wave
short sample = amplitude; // current sample value
int count = 0;
i2s_mode_t mode = I2S_PHILIPS_MODE; // I2S decoder is needed
// i2s_mode_t mode = ADC_DAC_MODE; // Audio amplifier is needed
// Mono channel input
// This is ESP specific implementation -
// samples will be automatically copied to both channels inside I2S driver
// If you want to have true mono output use I2S_PHILIPS_MODE and interlay
// second channel with 0-value samples.
// The order of channels is RIGH followed by LEFT
//i2s_mode_t mode = I2S_RIGHT_JUSTIFIED_MODE; // I2S decoder is needed
void setup() {
Serial.begin(115200);
Serial.println("I2S simple tone");
delay(5000);
//setAllPins(int sckPin, int fsPin, int sdPin, int outSdPin, int inSdPin);
I2S.setAllPins(45 , 35 , 48 , 48 , -1);
// start I2S at the sample rate with 16-bits per sample
if (!I2S.begin(mode, sampleRate, bps)) {
Serial.println("Failed to initialize I2S!");
while (1); // do nothing
}
}
void loop() {
while (Serial.available()) {
char c = Serial.read();
if (c == '3') {
ESP.restart();
}
// 主机端发送 l, 回复 z 用于识别串口
if (c == '1') {
Serial.print('z');
}
// 主机端发送 l, 回复 z 用于识别串口
if (c == '2') {
Serial.printf("getSckPin:%d getFsPin:%d getDataPin:%d",
I2S.getSckPin(),
I2S.getFsPin(),
I2S.getDataPin());
}
}
if (count % halfWavelength == 0 ) {
// invert the sample every half wavelength count multiple to generate square wave
sample = -1 * sample;
}
if(mode == I2S_PHILIPS_MODE || mode == ADC_DAC_MODE){ // write the same sample twice, once for Right and once for Left channel
I2S.write(sample); // Right channel
I2S.write(sample); // Left channel
}else if(mode == I2S_RIGHT_JUSTIFIED_MODE || mode == I2S_LEFT_JUSTIFIED_MODE){
// write the same only once - it will be automatically copied to the other channel
I2S.write(sample);
}
// increment the counter for the next sample
count++;
}
测试的视频在下面可以看到: