Teste I2S do reSpeaker Flex com XIAO ESP32S3
Este projeto serve como um sketch de teste para verificar a funcionalidade da interface I2S entre o XIAO ESP32S3 e o ReSpeaker Flex. O objetivo é confirmar que a transmissão e recepção de dados pelo barramento I2S estão funcionando corretamente. Para isso, o sketch gera um sinal de áudio sintético em onda quadrada e o escreve na interface I2S. Em seguida, ele lê os dados de áudio do array de microfones do ReSpeaker Flex e verifica a integridade das amostras recebidas.
| reSpeaker Flex XVF3800 Linear com XIAO ESP32S3 | reSpeaker Flex XVF3800 Circular com XIAO ESP32S3 | |
|---|---|---|
![]() | ![]() | |
Como funciona
Este sketch testa a comunicação I2S full-duplex entre o XIAO ESP32S3 e o ReSpeaker Flex. Ele gera um sinal de onda quadrada de 440 Hz e o escreve continuamente na linha de transmissão I2S enquanto, simultaneamente, lê as amostras de áudio recebidas do array de microfones. Os dados recebidos são analisados para contar amostras válidas (diferentes de zero) como uma verificação básica de integridade. Com base no número de amostras válidas, o programa determina se o caminho de recepção I2S está funcionando corretamente.
#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
}
Suporte Técnico e Discussão de Produtos
Obrigado por escolher nossos produtos! Estamos aqui para oferecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

