Saltar al contenido principal

Uso de comandos I2C para controlar la reSpeaker XVF3800 USB Mic Array con XIAO ESP32S3

Introducción

Esta sección proporciona la lista de comandos de control I2C para la ReSpeaker XVF3800, junto con ejemplos de lectura/escritura I2C y diagramas de la ruta de señal de hardware para los dos modos de funcionamiento. Para un ejemplo de aplicación de control de la ReSpeaker XVF3800 a través de la interfaz I2C, consulta la sección Device Control.

pir

Diagrama de la ruta de señal de hardware de reSpeaker

Ruta de señal en modo I2S

pir

Ruta de grabación

Los micrófonos capturan datos en bruto, que son procesados por los módulos de algoritmo. Los datos procesados son luego leídos por el controlador host a través de la interfaz I2S.

Ruta de reproducción

En modo I2S, la ruta de reproducción de audio se divide en dos recorridos: Host → XVF3800 → DAC y Host → DAC.

1. Host → XVF3800 → DAC

El controlador host envía datos de audio al XVF3800 a través de la interfaz I2S. Los datos son procesados por el bloque Optional Far DSP y luego se vuelven a transmitir al DAC para la reproducción a través del bus I2S.

nota

Para un ejemplo de aplicación de reproducción a través de esta ruta, consulta la sección reSpeaker XVF3800 Record and Playback Audio Using I2S.

2. Host → DAC

El host envía datos de audio directamente al DAC para la reproducción a través de la interfaz I2S, omitiendo el XVF3800.

nota

Para un ejemplo de aplicación de reproducción a través de esta ruta, consulta la sección reSpeaker XVF3800 Audio Playback and Volume Control via I2C.

Ruta de control

La ruta de control, al igual que la ruta de reproducción, se divide en dos recorridos:

1. Host → XVF3800 → DAC
  • Comunicación Host ↔ XVF3800: El host actúa como I2C Master y el XVF3800 actúa como I2C Slave. El host usa I2C para configurar el Optional Far DSP, Optional PP, GPIO y otros bloques del XVF3800.
  • Comunicación XVF3800 ↔ DAC: El XVF3800 actúa como I2C Master y el DAC actúa como I2C Slave. El XVF3800 controla la reproducción del DAC mediante I2C.
2. Host → DAC

El host se comunica directamente con el DAC. El host usa I2C para controlar directamente el DAC para la reproducción de audio y el control de volumen.

Ruta de señal en modo USB

pir

En modo USB, solo hay una ruta de datos: Host → XVF3800 → DAC, que se divide en dos segmentos: Host → XVF3800 y XVF3800 → DAC.

  • Host ↔ XVF3800: La comunicación es vía USB. Tanto los datos de audio (los datos en bruto capturados por los micrófonos, que son procesados por los módulos de algoritmo) como los datos de control (para configurar el Optional Far DSP, Optional PP, GPIO y otros bloques del XVF3800) se transmiten por USB.

  • XVF3800 ↔ DAC: La comunicación es vía I2C e I2S. El XVF3800 actúa como I2C Master e I2S Master para controlar el DAC para la reproducción de audio.

nota

Para un ejemplo de aplicación de reproducción a través de esta ruta, consulta la sección reSpeaker XVF3800 Control with Python.

Formato de trama I2C

Operación de escritura

[resid] [cmd] [write_byte_num] [data...]
FieldDescription
residResource ID
cmdCommand ID
write_byte_numNumber of data bytes to write
data...Data bytes to be written

Operación de lectura (primero escribir comando, luego leer respuesta):

Step 1 (Write): [resid] [cmd | 0x80] [read_len + 1]
Step 2 (Read): [status] [data...]
FieldDescription
cmd|0x80Command ID con el bit más significativo establecido en 1, indicando una operación de lectura
read_len + 1Número esperado de bytes a leer (+1 para el byte de estado)
statusByte de estado de la respuesta (0 = éxito, 64 = reintentar)
data...Bytes de datos devueltos
nota

Para la lista detallada de comandos I2C, consulta la sección I2C Command List.

Ejemplo de lectura y escritura con Arduino

#define XMOS_ADDR 0x2C  // XVF3800 I2C 7-bit Address

Escritura

void xmos_write_bytes(uint8_t resid, uint8_t cmd, uint8_t *value, uint8_t write_byte_num) {
Wire.beginTransmission(XMOS_ADDR);
Wire.write(resid);
Wire.write(cmd);
Wire.write(write_byte_num);
for (uint8_t i = 0; i < write_byte_num; i++) {
Wire.write(value[i]);
}
Wire.endTransmission();
}

Lectura

bool xmos_read_bytes(uint8_t resid, uint8_t cmd, uint8_t *buffer, uint8_t read_len, uint8_t *status) {
Wire.beginTransmission(XMOS_ADDR);
Wire.write(resid);
Wire.write(cmd | 0x80);
Wire.write(read_len + 1); // +1 for status byte
uint8_t result = Wire.endTransmission();

if (result != 0) {
Serial.print("I2C Write Error: ");
Serial.println(result);
return false;
}

Wire.requestFrom(XMOS_ADDR, (uint8_t)(read_len + 1));
if (Wire.available() < read_len + 1) {
Serial.println("I2C Read Error: Not enough data received.");
return false;
}

*status = Wire.read(); // First byte is status (0 = success, 64 = retry)
for (uint8_t i = 0; i < read_len; i++) {
buffer[i] = Wire.read();
}

return true;
}

Ejemplo de lectura de la versión del firmware

#include <Wire.h>

#define XMOS_ADDR 0x2C // XVF3800 I2C 7-bit Address

#define APPLICATION_SERVICER_RESID 48 // ResID = 48 (Application Servicer)
#define VERSION_CMD 0 // CmdID = 0 (VERSION)
#define VERSION_NUM_BYTES 3 // 3 bytes: MAJOR, MINOR, PATCH

void setup() {
Serial.begin(115200);
while (!Serial);
Wire.begin();
delay(1000);
Serial.println("XVF3800 Firmware Version Read Test Starting...");
}

void loop() {
uint8_t version[VERSION_NUM_BYTES] = {0};
uint8_t status = 0xFF;

// Read 3 bytes: [MAJOR] [MINOR] [PATCH]
bool success = xmos_read_bytes(APPLICATION_SERVICER_RESID, VERSION_CMD,
version, VERSION_NUM_BYTES, &status);

if (success && status == 0) {
Serial.print("Firmware Version: v");
Serial.print(version[0]); // MAJOR
Serial.print(".");
Serial.print(version[1]); // MINOR
Serial.print(".");
Serial.println(version[2]); // PATCH
Serial.print(" (Status byte: 0x");
Serial.print(status, HEX);
Serial.println(")");
} else {
Serial.print("Read failed. Status byte: 0x");
Serial.println(status, HEX);
}

delay(2000);
}

bool xmos_read_bytes(uint8_t resid, uint8_t cmd, uint8_t *buffer, uint8_t read_len, uint8_t *status) {
Wire.beginTransmission(XMOS_ADDR);
Wire.write(resid);
Wire.write(cmd | 0x80);
Wire.write(read_len + 1); // +1 for status byte
uint8_t result = Wire.endTransmission();

if (result != 0) {
Serial.print("I2C Write Error: ");
Serial.println(result);
return false;
}

Wire.requestFrom(XMOS_ADDR, (uint8_t)(read_len + 1));
if (Wire.available() < read_len + 1) {
Serial.println("I2C Read Error: Not enough data received.");
return false;
}

*status = Wire.read(); // First byte is status (0 = success, 64 = retry)
for (uint8_t i = 0; i < read_len; i++) {
buffer[i] = Wire.read();
}

return true;
}

Salida esperada

pir

nota

Para un ejemplo de aplicación de control de la ReSpeaker XVF3800 a través de la interfaz I2C, consulta la sección Device Control.

Lista de comandos I2C

Lista de ResID

Servicer NameResIDHexDescription
PP Servicer (Post-Processing)170x11AGC, limitador, supresión de ruido, supresión de eco
GPO Servicer (GPIO/LED/DOA)200x14Lectura/escritura GPO, efecto/color/velocidad/brillo de LED, DOA
AEC Servicer (Acoustic Echo Cancellation)330x21Filtro AEC, haz, acimut, RT60
Audio Manager350x23Ganancia, I2S, selección de canal, enrutamiento de salida
Application Servicer (System)480x30Versión, reinicio, guardado de configuración, profundidad de bits USB

Lista de CmdID

ResID = 48 — Application Servicer (System Control)

NameCmdIDDirectionData TypeValuesBytesDescription
VERSION0rouint833Versión de firmware (MAJOR, MINOR, PATCH)
BLD_MSG1rochar5050Mensaje de compilación (nombre de la configuración de compilación)
BLD_HOST2rochar3030Información del host de compilación CI
BLD_REPO_HASH3rochar4040Hash de GIT
BLD_MODIFIED4rochar66Indica si el firmware fue modificado
BOOT_STATUS5rochar33Modo de arranque (SPI/JTAG/FLASH)
TEST_CORE_BURN6rwuint811Prueba de estrés del núcleo (reinicia el chip)
REBOOT7wouint811Reiniciar chip, restaurar parámetros predeterminados
USB_BIT_DEPTH8rwuint822Profundidad de bits USB (16/24/32), solo en modo USB
SAVE_CONFIGURATION9wouint811Guardar configuración actual en la flash
CLEAR_CONFIGURATION10wouint811Borrar configuración, restaurar valores predeterminados
AIC3104_HP_LEVEL11rwuint811Nivel de salida de auriculares [0..9]
AIC3104_LINEOUT_LEVEL12rwuint811Nivel de salida de línea [0..9]

ResID = 20 — GPO Servicer (GPIO and LED Control)

NameCmdIDDirectionData TypeValuesBytesDescription
GPO_READ_VALUES0rouint855Leer todos los niveles de los pines GPO
GPO_WRITE_VALUE1wouint822Establecer el nivel del pin GPO especificado
GPO_PORT_PIN_INDEX2rwuint3228Índice de puerto/pin GPO
GPO_PIN_VAL3wouint833Escribir el valor del pin de puerto especificado
GPO_PIN_ACTIVE_LEVEL4rwuint3214Nivel activo (1=alto, 0=bajo)
LED_EFFECT12rwuint811Efecto LED (0=off 1=breathing 2=rainbow 3=solid 4=DOA 5=ring)
LED_BRIGHTNESS13rwuint811Brillo del LED
LED_GAMMIFY14rwuint811Corrección gamma (0=off 1=on)
LED_SPEED15rwuint811Velocidad del LED
LED_COLOR16rwuint3214Color del LED (RGB)
LED_DOA_COLOR17rwuint3228Color en modo DOA (color base + color DOA)
DOA_VALUE18rouint1624Ángulo DOA (0-359) + indicador de detección de voz
LED_RING_COLOR19rwuint321248Color por LED en modo anillo

ResID = 33 — Servicer AEC (Cancelación de Eco Acústico)

NombreCmdIDDirecciónTipo de datoValoresBytesDescripción
AEC_AECPATHCHANGE0roint3214Detección de cambio de ruta AEC (0,1)
AEC_HPFONOFF1rwint3214Filtro pasa-altos (0=apagado 1=70Hz 2=125Hz 3=150Hz 4=180Hz)
AEC_AECSILENCELEVEL2rwfloat28Umbral de silencio [0.0..1.0]
AEC_AECCONVERGED3roint3214AEC convergido (0,1)
AEC_AECEMPHASISONOFF4rwint3214Pre/de-énfasis (0=apagado 1=encendido 2=on_eq)
AEC_FAR_EXTGAIN5rwfloat14Ganancia externa de extremo lejano (dB)
AEC_PCD_COUPLINGI6rwfloat14Sensibilidad PCD [0.0..1.0]
AEC_PCD_MINTHR7rwfloat14Umbral mínimo PCD [0.0..0.02]
AEC_PCD_MAXTHR8rwfloat14Umbral máximo PCD [0.025..0.2]
AEC_RT609rofloat14Estimación de reverberación RT60 [0.250..0.900] s
AEC_ASROUTONOFF35rwint3214Conmutador de salida ASR (0=residual 1=procesado por ASR)
AEC_ASROUTGAIN36rwfloat14Ganancia de salida ASR [0.0..1000.0]
AEC_FIXEDBEAMSONOFF37rwint3214Conmutador de modo de haz fijo (0,1)
AEC_FIXEDBEAMNOISETHR38rwfloat28Umbral de ruido de haz fijo [0.0..1.0]
SHF_BYPASS70rwuint811Bypass de AEC
AEC_NUM_MICS71roint3214Número de micrófonos
AEC_NUM_FARENDS72roint3214Número de referencias de extremo lejano
AEC_MIC_ARRAY_TYPE73roint3214Tipo de matriz de micrófonos (1=lineal 2=cuadrada)
AEC_MIC_ARRAY_GEO74rofloat1248Geometría de la matriz de micrófonos (coordenadas 3D XYZ)
AEC_AZIMUTH_VALUES75roradians416Acimut (haz1/2/libre/auto)
TEST_AEC_DISABLE_CONTROL76wouint3214Desactivar control AEC (solo prueba)
AEC_CURRENT_IDLE_TIME77rouint3214Tiempo de inactividad actual (tick de 10ns)
AEC_MIN_IDLE_TIME78rouint3214Tiempo mínimo de inactividad (tick de 10ns)
AEC_RESET_MIN_IDLE_TIME79wouint3214Restablecer tiempo mínimo de inactividad
AEC_SPENERGY_VALUES80rofloat416Energía del habla (haz1/2/libre/auto)
AEC_FIXEDBEAMSAZIMUTH_VALUES81rwradians28Acimut de haz fijo
AEC_FIXEDBEAMSELEVATION_VALUES82rwradians28Elevación de haz fijo
AEC_FIXEDBEAMSGATING83rwuint811Conmutador de compuerta de haz fijo
SPECIAL_CMD_AEC_FAR_MIC_INDEX90woint3228Índice de lectura del filtro AEC (comando de disparo)
SPECIAL_CMD_AEC_FILTER_COEFF_START_OFFSET91rwint3214Desplazamiento inicial del coeficiente del filtro
SPECIAL_CMD_AEC_FILTER_COEFFS92rwfloat1560Lectura/escritura de coeficientes del filtro AEC
SPECIAL_CMD_AEC_FILTER_LENGTH93roint3214Longitud del filtro AEC
AEC_FILTER_CMD_ABORT94woint3214Abortar máquina de estados de lectura/escritura de filtro

ResID = 35 — Audio Manager (Gestión de Audio)

NombreCmdIDDirecciónTipo de datoValoresBytesDescripción
AUDIO_MGR_MIC_GAIN0rwfloat14Ganancia de micrófono (antes de SHF)
AUDIO_MGR_REF_GAIN1rwfloat14Ganancia de referencia (antes de SHF)
AUDIO_MGR_CURRENT_IDLE_TIME2roint3214Tiempo de inactividad actual (tick de 10ns)
AUDIO_MGR_MIN_IDLE_TIME3roint3214Tiempo mínimo de inactividad (tick de 10ns)
AUDIO_MGR_RESET_MIN_IDLE_TIME4woint3214Restablecer tiempo mínimo de inactividad
MAX_CONTROL_TIME5roint3214Tiempo máximo de control
RESET_MAX_CONTROL_TIME6woint3214Restablecer tiempo máximo de control
I2S_CURRENT_IDLE_TIME7roint3214Tiempo de inactividad actual de I2S
I2S_MIN_IDLE_TIME8roint3214Tiempo mínimo de inactividad de I2S
I2S_RESET_MIN_IDLE_TIME9woint3214Restablecer tiempo de inactividad de I2S
I2S_INPUT_PACKED10rwuint811Modo empaquetado de entrada I2S/USB
AUDIO_MGR_SELECTED_AZIMUTHS11roradians28Acimut de haz seleccionado (procesar DOA + selección automática de DOA)
AUDIO_MGR_SELECTED_CHANNELS12rwuint822Canales de salida seleccionados
AUDIO_MGR_OP_PACKED13rwuint822Estado empaquetado de salida L/R
AUDIO_MGR_OP_UPSAMPLE14rwuint822Estado de sobremuestreo de salida L/R
AUDIO_MGR_OP_L15rwuint822Categoría y fuente del canal L (= OP_L_PK0)
AUDIO_MGR_OP_L_PK016rwuint822Fuente empaquetada 0 del canal L
AUDIO_MGR_OP_L_PK117rwuint822Fuente empaquetada 1 del canal L
AUDIO_MGR_OP_L_PK218rwuint822Fuente empaquetada 2 del canal L
AUDIO_MGR_OP_R19rwuint822Categoría y fuente del canal R (= OP_R_PK0)
AUDIO_MGR_OP_R_PK020rwuint822Fuente empaquetada 0 del canal R
AUDIO_MGR_OP_R_PK121rwuint822Fuente empaquetada 1 del canal R
AUDIO_MGR_OP_R_PK222rwuint822Fuente empaquetada 2 del canal R
AUDIO_MGR_OP_ALL23rwuint81212Todos los ajustes de fuentes empaquetadas L/R
I2S_INACTIVE24rouint811I2S activo (0=activo 1=inactivo)
AUDIO_MGR_FAR_END_DSP_ENABLE25rwuint811Conmutador DSP de extremo lejano
AUDIO_MGR_SYS_DELAY26rwint3214Retardo de señal de referencia (muestras)
I2S_DAC_DSP_ENABLE27rwuint811Conmutador DSP de extremo lejano del DAC

ResID = 17 — Servicer PP (Postprocesamiento: AGC/Ruido/Eco)

NombreCmdIDDirecciónTipo de datoValoresBytesDescripción
PP_AGCONOFF10rwint3214Conmutador AGC (0,1)
PP_AGCMAXGAIN11rwfloat14Ganancia máxima de AGC [1.0..1000.0]
PP_AGCDESIREDLEVEL12rwfloat14Potencia objetivo de AGC [1e-8..1.0]
PP_AGCGAIN13rwfloat14Ganancia actual de AGC [1.0..1000.0]
PP_AGCTIME14rwfloat14Constante de tiempo de AGC [0.5..4.0] s
PP_AGCFASTTIME15rwfloat14Tiempo de decaimiento rápido de AGC [0.05..4.0] s
PP_AGCALPHAFASTGAIN16rwfloat14Umbral de ganancia de modo rápido [0.0..1000.0]
PP_AGCALPHASLOW17rwfloat14Parámetro de memoria lenta [0.0..1.0]
PP_AGCALPHAFAST18rwfloat14Parámetro de memoria rápida [0.0..1.0]
PP_LIMITONOFF19rwint3214Conmutador de limitador (0,1)
PP_LIMITPLIMIT20rwfloat14Potencia máxima del limitador [1e-8..1.0]
PP_MIN_NS21rwfloat14Piso de ganancia de ruido estacionario [0.0..1.0]
PP_MIN_NN22rwfloat14Piso de ganancia de ruido no estacionario [0.0..1.0]
PP_ECHOONOFF23rwint3214Conmutador de supresión de eco (0,1)
PP_GAMMA_E24rwfloat14Factor de sobre-sustracción de eco [0.0..2.0]
PP_GAMMA_ETAIL25rwfloat14Factor de sobre-sustracción de eco de cola [0.0..2.0]
PP_GAMMA_ENL26rwfloat14Factor de sobre-sustracción de eco no lineal [0.0..5.0]
PP_NLATTENONOFF27rwint3214Conmutador de atenuación de eco no lineal (0,1)
PP_NLAEC_MODE28rwint3214Modo de entrenamiento AEC no lineal (0=normal 1=entrenamiento 2=entrenamiento2)
PP_MGSCALE29rwfloat312Escala de ganancia mínima (máx,mín,act)
PP_FMIN_SPEINDEX30rwfloat14Límite de frecuencia de doble conversación [0.0..7999.0]
PP_DTSENSITIVE31rwint3214Sensibilidad de doble conversación [0..5, 10..15]
PP_ATTNS_MODE32rwint3214Conmutador de atenuación extra de no voz (0,1)
PP_ATTNS_NOMINAL33rwfloat14Atenuación nominal del habla [0.0..1.0]
PP_ATTNS_SLOPE34rwfloat14Pendiente de atenuación [0.0..5.0]
PP_CURRENT_IDLE_TIME70rouint3214Tiempo de inactividad actual de PP (tick de 10ns)
PP_MIN_IDLE_TIME71rouint3214Tiempo mínimo de inactividad de PP (tick de 10ns)
PP_RESET_MIN_IDLE_TIME72wouint3214Restablecer tiempo mínimo de inactividad de PP
PP_NL_MODEL_CMD_ABORT94woint3214Abortar máquina de estados de lectura/escritura del modelo NL
PP_EQUALIZATION_CMD_ABORT100woint3214Abortar máquina de estados de lectura/escritura del ecualizador

Soporte técnico y debate sobre el producto

Gracias por elegir nuestros productos. Estamos aquí para ofrecerte diferentes tipos de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a distintas preferencias y necesidades.

Loading Comments...