メインコンテンツまでスキップ

reSpeaker Flex と XIAO ESP32S3 の I2S テスト

このプロジェクトは、XIAO ESP32S3ReSpeaker Flex 間の I2S インターフェースの機能を検証するためのテストスケッチです。目的は、I2S バスを介したデータの送受信が正しく動作していることを確認することです。そのために、このスケッチは合成の矩形波オーディオ信号を生成し、それを I2S インターフェースへ書き込みます。続いて、ReSpeaker Flex のマイクアレイからオーディオデータを読み取り、受信したサンプルの整合性を検証します。

reSpeaker Flex XVF3800 Linear と XIAO ESP32S3reSpeaker Flex XVF3800 Circular と XIAO ESP32S3

動作概要

このスケッチは、XIAO ESP32S3 と ReSpeaker Flex 間のフルデュプレックス I2S 通信をテストします。440 Hz の矩形波信号を生成し、それを I2S 送信ラインへ連続的に書き込みながら、同時にマイクアレイから入力されるオーディオサンプルを読み取ります。受信データは、基本的な整合性チェックとして有効(ゼロ以外)のサンプル数をカウントするために解析されます。有効サンプル数に基づいて、プログラムは I2S 受信経路が正しく機能しているかどうかを判定します。

#include "AudioTools.h"

const int sampleRate = 16000; // Hz
const int frequency = 440; // Hz square wave
const int amplitude = 500; // peak value
const int halfWavelength = sampleRate / frequency;

AudioInfo info(sampleRate, 2, 32); // stereo, 16-bit
I2SStream i2s;
I2SConfig cfg;

int32_t sample = amplitude;
int count = 0;

void printSamplesAndCount(int &nonZero) {
nonZero = 0;
bool truncated = false;
for (int i = 0; i < 32000; i++) {
int32_t rxSample;
size_t n = i2s.readBytes((uint8_t*)&rxSample, sizeof(rxSample));
if (n == sizeof(rxSample)) {
if (rxSample != 0 && rxSample != 0xFFFFFFFF) {
nonZero++;
}
if (i < 200) {
Serial.printf("%d ", rxSample);
} else if (!truncated) {
Serial.print("... (truncated)");
truncated = true;
}
}
}
Serial.println();
}


void setup() {
Serial.begin(115200);
while (!Serial);
AudioLogger::instance().begin(Serial, AudioLogger::Info);

cfg = i2s.defaultConfig(RXTX_MODE); // full duplex
cfg.copyFrom(info);
cfg.pin_bck = 8;
cfg.pin_ws = 7;
cfg.pin_data = 44; // TX data pin
cfg.pin_data_rx = 43; // RX data pin
cfg.is_master = true;
i2s.begin(cfg);

Serial.println("I2S full-duplex test start");
}

void loop() {
// 1) Generate and write 32k samples of square wave
for (int i = 0; i < 32000; i++) {
if (count % halfWavelength == 0) {
sample = -sample; // toggle polarity for square wave
}
i2s.write((uint8_t*)&sample, sizeof(sample));
count++;
}

// 2) First read attempt
int nonZero = 0;
Serial.println("First read attempt:");
printSamplesAndCount(nonZero);
Serial.printf("Valid samples: %d\n", nonZero);

// 3) Check pass/fail or do second attempt
if (nonZero > 16000) {
Serial.println("I2S RX PASS!");
} else {
Serial.println("Valid samples below threshold, trying second read...");
nonZero = 0;
Serial.println("Second read attempt:");
printSamplesAndCount(nonZero);
Serial.printf("Valid samples: %d\n", nonZero);
if (nonZero > 16000) {
Serial.println("I2S RX PASS!");
} else {
Serial.println("I2S RX FAIL!");
}
}

Serial.println("Test complete");
while (true); // stop here
}


技術サポート & 製品ディスカッション

弊社製品をお選びいただきありがとうございます。私たちは、製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートを提供しています。お好みやニーズに応じてお選びいただける、複数のコミュニケーションチャネルをご用意しています。

Loading Comments...