Skip to main content

I2S 测试

这个项目是一个测试程序,用于验证 ReSpeaker Lite 板上 I2S 接口的功能,该板集成了 XIAO ESP32S3 微控制器和麦克风阵列。该程序生成方波音频信号,将其写入 I2S 接口,然后从板载麦克风阵列读取采样数据,以检查 I2S 传输和接收的完整性。

功能

程序首先初始化串行通信并配置 I2S 引脚,然后根据指定的频率和幅度生成方波音频信号。生成的音频采样使用 I2S.write() 函数写入 I2S 接口。

程序然后通过 I2S 接口使用 I2S.read() 函数从麦克风阵列读取采样数据,并统计接收到的非零采样数量。

代码

#include <ESP_I2S.h>
#include <wav_header.h>

I2SClass I2S;

const int sampleRate = 16000; // 采样率,单位 Hz
const int frequency = 440; // 方波频率,单位 Hz
const int amplitude = 500; // 方波幅度
int32_t sample = amplitude; // 当前采样值
const int halfWavelength = sampleRate / frequency; // 方波半波长

int count = 0;
int i2s_read = 0;
bool i2s_test = true;

void setup() {
Serial.begin(115200);
while(!Serial); // 等待串口连接

I2S.setPins(8, 7, 43, 44); // 配置 I2S 引脚
if (!I2S.begin(I2S_MODE_STD, sampleRate, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO)){
Serial.println("Failed to initialize I2S!");
while(1); // 如果初始化失败则停止
}
}

void loop() {
if(i2s_test){
Serial.println("I2S test!");

// 生成并写入方波采样
for(int i = 0; i < 32000; i++){
if(count % halfWavelength == 0){
sample = -sample; // 切换采样值以创建方波
}
I2S.write(sample); // 将采样写入右声道
count++;
}

// 从 I2S 读取采样并统计非零采样
i2s_read=0;
for(int i = 0; i < 32000; i++){
int sample_read = I2S.read();
Serial.print(sample_read);
Serial.print(" ");
if(sample_read != 0 && sample_read != 0xFFFF){
i2s_read++;
}
}
Serial.println();

// 检查有效采样数量是否超过阈值
if(i2s_read > 16000){
Serial.println("I2S RX pass!");
} else{
i2s_read = 0;
for(int i = 0; i < 32000; i++){
int sample_read = I2S.read();
if (sample_read != 0 && sample_read != 0xFFFF){
i2s_read++;
}
}
if(i2s_read > 16000)
Serial.println("I2S RX pass!");
else
Serial.println("I2S RX fail!");
}

Serial.println("OVER");
i2s_test = false;
}
}

如果接收到的非零采样数量超过阈值(在这种情况下为 16000),则认为 I2S 接收通过。否则,认为失败。

测试结果,包括 I2S 采样值和通过/失败状态,会打印到串行监视器。

打开 串行监视器 查看测试结果。

pir

Loading Comments...