Pular para o conteúdo principal

Usando comandos I2C para controlar o reSpeaker XVF3800 USB Mic Array com XIAO ESP32S3

Introdução

Esta seção fornece a lista de comandos de controle I2C para o ReSpeaker XVF3800, juntamente com exemplos de leitura/gravação I2C e diagramas de caminho de sinal de hardware para os dois modos de operação. Para um exemplo de aplicação de controle do ReSpeaker XVF3800 via interface I2C, consulte a seção Device Control.

pir

Diagrama do caminho de sinal de hardware do reSpeaker

Caminho de sinal em modo I2S

pir

Caminho de gravação

Os microfones capturam dados brutos, que são processados pelos módulos de algoritmo. Os dados processados são então lidos pelo controlador host via interface I2S.

Caminho de reprodução

No modo I2S, o caminho de reprodução de áudio é dividido em duas rotas: Host → XVF3800 → DAC e Host → DAC.

1. Host → XVF3800 → DAC

O controlador host envia dados de áudio para o XVF3800 via interface I2S. Os dados são processados pelo bloco Optional Far DSP e então retransmitidos para o DAC para reprodução via barramento I2S.

nota

Para um exemplo de aplicação de reprodução por este caminho, consulte a seção reSpeaker XVF3800 Record and Playback Audio Using I2S.

2. Host → DAC

O controlador host envia dados de áudio diretamente para o DAC para reprodução via interface I2S, ignorando o XVF3800.

nota

Para um exemplo de aplicação de reprodução por este caminho, consulte a seção reSpeaker XVF3800 Audio Playback and Volume Control via I2C.

Caminho de controle

O caminho de controle, assim como o caminho de reprodução, é dividido em duas rotas:

1. Host → XVF3800 → DAC
  • Comunicação Host ↔ XVF3800: O host atua como I2C Master e o XVF3800 atua como I2C Slave. O host usa I2C para configurar o Optional Far DSP, Optional PP, GPIO e outros blocos do XVF3800.
  • Comunicação XVF3800 ↔ DAC: O XVF3800 atua como I2C Master e o DAC atua como I2C Slave. O XVF3800 controla a reprodução do DAC via I2C.
2. Host → DAC

O host se comunica diretamente com o DAC. O host usa I2C para controlar diretamente o DAC para reprodução de áudio e controle de volume.

Caminho de sinal em modo USB

pir

No modo USB, há apenas um caminho de dados: Host → XVF3800 → DAC, que é dividido em dois segmentos: Host → XVF3800 e XVF3800 → DAC.

  • Host ↔ XVF3800: A comunicação é via USB. Tanto os dados de áudio (os dados brutos capturados pelos microfones, que são processados pelos módulos de algoritmo) quanto os dados de controle (para configurar o Optional Far DSP, Optional PP, GPIO e outros blocos do XVF3800) são transmitidos via USB.

  • XVF3800 ↔ DAC: A comunicação é via I2C e I2S. O XVF3800 atua como I2C Master e I2S Master para controlar o DAC para reprodução de áudio.

nota

Para um exemplo de aplicação de reprodução por este caminho, consulte a seção reSpeaker XVF3800 Control with Python.

Formato de quadro I2C

Operação de escrita

[resid] [cmd] [write_byte_num] [data...]
FieldDescription
residID do recurso
cmdID do comando
write_byte_numNúmero de bytes de dados a serem escritos
data...Bytes de dados a serem escritos

Operação de leitura (primeiro escreve o comando, depois lê a resposta):

Step 1 (Write): [resid] [cmd | 0x80] [read_len + 1]
Step 2 (Read): [status] [data...]
FieldDescription
cmd|0x80ID do comando com o MSB definido como 1, indicando uma operação de leitura
read_len + 1Número esperado de bytes a serem lidos (+1 para o byte de status)
statusByte de status da resposta (0 = sucesso, 64 = tentar novamente)
data...Bytes de dados retornados
nota

Para a lista detalhada de comandos I2C, consulte a seção I2C Command List.

Exemplo de leitura e escrita com Arduino

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

Escrita

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();
}

Leitura

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;
}

Exemplo de leitura da versão do 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;
}

Saída esperada

pir

nota

Para um exemplo de aplicação de controle do ReSpeaker XVF3800 via interface I2C, consulte a seção Device Control.

Lista de comandos I2C

Lista de ResID

Servicer NameResIDHexDescription
PP Servicer (Pós-processamento)170x11AGC, limitador, supressão de ruído, supressão de eco
GPO Servicer (GPIO/LED/DOA)200x14Leitura/gravação de GPO, efeito/cor/velocidade/brilho de LED, DOA
AEC Servicer (Acoustic Echo Cancellation)330x21Filtro AEC, feixe, azimute, RT60
Gerenciador de áudio350x23Ganho, I2S, seleção de canal, roteamento de saída
Application Servicer (Sistema)480x30Versão, reinicialização, salvamento de configuração, profundidade de bits USB

Lista de CmdID

ResID = 48 — Application Servicer (Controle do sistema)

NameCmdIDDirectionData TypeValuesBytesDescription
VERSION0rouint833Versão do firmware (MAJOR, MINOR, PATCH)
BLD_MSG1rochar5050Mensagem de build (nome da configuração de build)
BLD_HOST2rochar3030Informações do host de build de CI
BLD_REPO_HASH3rochar4040Hash do GIT
BLD_MODIFIED4rochar66Indica se o firmware foi modificado
BOOT_STATUS5rochar33Modo de boot (SPI/JTAG/FLASH)
TEST_CORE_BURN6rwuint811Teste de estresse do core (reinicia o chip)
REBOOT7wouint811Reinicia o chip, restaura parâmetros padrão
USB_BIT_DEPTH8rwuint822Profundidade de bits USB (16/24/32), apenas modo USB
SAVE_CONFIGURATION9wouint811Salva a configuração atual na flash
CLEAR_CONFIGURATION10wouint811Limpa a configuração, restaura padrões
AIC3104_HP_LEVEL11rwuint811Nível de saída de fone de ouvido [0..9]
AIC3104_LINEOUT_LEVEL12rwuint811Nível de saída de linha [0..9]

ResID = 20 — GPO Servicer (Controle de GPIO e LED)

NameCmdIDDirectionData TypeValuesBytesDescription
GPO_READ_VALUES0rouint855Lê todos os níveis dos pinos GPO
GPO_WRITE_VALUE1wouint822Define o nível do pino GPO especificado
GPO_PORT_PIN_INDEX2rwuint3228Índice de porta/pino GPO
GPO_PIN_VAL3wouint833Escreve o valor do pino de porta especificado
GPO_PIN_ACTIVE_LEVEL4rwuint3214Nível ativo (1=alto, 0=baixo)
LED_EFFECT12rwuint811Efeito de LED (0=off 1=breathing 2=rainbow 3=solid 4=DOA 5=ring)
LED_BRIGHTNESS13rwuint811Brilho do LED
LED_GAMMIFY14rwuint811Correção de gama (0=off 1=on)
LED_SPEED15rwuint811Velocidade do LED
LED_COLOR16rwuint3214Cor do LED (RGB)
LED_DOA_COLOR17rwuint3228Cor em modo DOA (cor base + cor DOA)
DOA_VALUE18rouint1624Ângulo DOA (0-359) + flag de detecção de voz
LED_RING_COLOR19rwuint321248Cor por LED no modo anel

ResID = 33 — AEC Servicer (Cancelamento de Eco Acústico)

NomeCmdIDDireçãoTipo de dadoValoresBytesDescrição
AEC_AECPATHCHANGE0roint3214Detecção de mudança de caminho do AEC (0,1)
AEC_HPFONOFF1rwint3214Filtro passa‑alta (0=desligado 1=70Hz 2=125Hz 3=150Hz 4=180Hz)
AEC_AECSILENCELEVEL2rwfloat28Limite de silêncio [0.0..1.0]
AEC_AECCONVERGED3roint3214AEC convergiu (0,1)
AEC_AECEMPHASISONOFF4rwint3214Pré/de‑ênfase (0=desligado 1=ligado 2=ligado_eq)
AEC_FAR_EXTGAIN5rwfloat14Ganho externo de extremidade distante (dB)
AEC_PCD_COUPLINGI6rwfloat14Sensibilidade PCD [0.0..1.0]
AEC_PCD_MINTHR7rwfloat14Limite mínimo de PCD [0.0..0.02]
AEC_PCD_MAXTHR8rwfloat14Limite máximo de PCD [0.025..0.2]
AEC_RT609rofloat14Estimativa de reverberação RT60 [0.250..0.900] s
AEC_ASROUTONOFF35rwint3214Chave de saída ASR (0=residual 1=processado por ASR)
AEC_ASROUTGAIN36rwfloat14Ganho de saída ASR [0.0..1000.0]
AEC_FIXEDBEAMSONOFF37rwint3214Chave do modo de feixe fixo (0,1)
AEC_FIXEDBEAMNOISETHR38rwfloat28Limite de ruído de feixe fixo [0.0..1.0]
SHF_BYPASS70rwuint811Bypass de AEC
AEC_NUM_MICS71roint3214Número de microfones
AEC_NUM_FARENDS72roint3214Número de referências de extremidade distante
AEC_MIC_ARRAY_TYPE73roint3214Tipo de matriz de microfones (1=linear 2=quadrada)
AEC_MIC_ARRAY_GEO74rofloat1248Geometria da matriz de microfones (coordenadas 3D XYZ)
AEC_AZIMUTH_VALUES75roradians416Azimute (feixe1/2/livre/auto)
TEST_AEC_DISABLE_CONTROL76wouint3214Desativar controle de AEC (apenas teste)
AEC_CURRENT_IDLE_TIME77rouint3214Tempo ocioso atual (tick de 10ns)
AEC_MIN_IDLE_TIME78rouint3214Tempo ocioso mínimo (tick de 10ns)
AEC_RESET_MIN_IDLE_TIME79wouint3214Redefinir tempo ocioso mínimo
AEC_SPENERGY_VALUES80rofloat416Energia de fala (feixe1/2/livre/auto)
AEC_FIXEDBEAMSAZIMUTH_VALUES81rwradians28Azimute de feixe fixo
AEC_FIXEDBEAMSELEVATION_VALUES82rwradians28Elevação de feixe fixo
AEC_FIXEDBEAMSGATING83rwuint811Chave de gating de feixe fixo
SPECIAL_CMD_AEC_FAR_MIC_INDEX90woint3228Índice de leitura do filtro AEC (comando de disparo)
SPECIAL_CMD_AEC_FILTER_COEFF_START_OFFSET91rwint3214Deslocamento inicial do coeficiente de filtro
SPECIAL_CMD_AEC_FILTER_COEFFS92rwfloat1560Leitura/gravação de coeficientes de filtro AEC
SPECIAL_CMD_AEC_FILTER_LENGTH93roint3214Comprimento do filtro AEC
AEC_FILTER_CMD_ABORT94woint3214Abortar máquina de estados de leitura/gravação de filtro

ResID = 35 — Audio Manager (Gerenciamento de Áudio)

NomeCmdIDDireçãoTipo de dadoValoresBytesDescrição
AUDIO_MGR_MIC_GAIN0rwfloat14Ganho do microfone (antes do SHF)
AUDIO_MGR_REF_GAIN1rwfloat14Ganho de referência (antes do SHF)
AUDIO_MGR_CURRENT_IDLE_TIME2roint3214Tempo ocioso atual (tick de 10ns)
AUDIO_MGR_MIN_IDLE_TIME3roint3214Tempo ocioso mínimo (tick de 10ns)
AUDIO_MGR_RESET_MIN_IDLE_TIME4woint3214Redefinir tempo ocioso mínimo
MAX_CONTROL_TIME5roint3214Tempo máximo de controle
RESET_MAX_CONTROL_TIME6woint3214Redefinir tempo máximo de controle
I2S_CURRENT_IDLE_TIME7roint3214Tempo ocioso atual de I2S
I2S_MIN_IDLE_TIME8roint3214Tempo ocioso mínimo de I2S
I2S_RESET_MIN_IDLE_TIME9woint3214Redefinir tempo ocioso de I2S
I2S_INPUT_PACKED10rwuint811Modo compactado de entrada I2S/USB
AUDIO_MGR_SELECTED_AZIMUTHS11roradians28Azimute de feixe selecionado (processar DOA + seleção automática de DOA)
AUDIO_MGR_SELECTED_CHANNELS12rwuint822Canais de saída selecionados
AUDIO_MGR_OP_PACKED13rwuint822Status compactado de saída L/R
AUDIO_MGR_OP_UPSAMPLE14rwuint822Status de upsampling de saída L/R
AUDIO_MGR_OP_L15rwuint822Categoria e fonte do canal L (= OP_L_PK0)
AUDIO_MGR_OP_L_PK016rwuint822Fonte compactada 0 do canal L
AUDIO_MGR_OP_L_PK117rwuint822Fonte compactada 1 do canal L
AUDIO_MGR_OP_L_PK218rwuint822Fonte compactada 2 do canal L
AUDIO_MGR_OP_R19rwuint822Categoria e fonte do canal R (= OP_R_PK0)
AUDIO_MGR_OP_R_PK020rwuint822Fonte compactada 0 do canal R
AUDIO_MGR_OP_R_PK121rwuint822Fonte compactada 1 do canal R
AUDIO_MGR_OP_R_PK222rwuint822Fonte compactada 2 do canal R
AUDIO_MGR_OP_ALL23rwuint81212Todas as configurações de fonte compactada L/R
I2S_INACTIVE24rouint811I2S ativo (0=ativo 1=inativo)
AUDIO_MGR_FAR_END_DSP_ENABLE25rwuint811Chave de DSP de extremidade distante
AUDIO_MGR_SYS_DELAY26rwint3214Atraso do sinal de referência (amostras)
I2S_DAC_DSP_ENABLE27rwuint811Chave de DSP de extremidade distante do DAC

ResID = 17 — PP Servicer (Pós-processamento: AGC/Ruído/Eco)

NomeCmdIDDireçãoTipo de dadoValoresBytesDescrição
PP_AGCONOFF10rwint3214Chave AGC (0,1)
PP_AGCMAXGAIN11rwfloat14Ganho máximo de AGC [1.0..1000.0]
PP_AGCDESIREDLEVEL12rwfloat14Potência alvo de AGC [1e-8..1.0]
PP_AGCGAIN13rwfloat14Ganho atual de AGC [1.0..1000.0]
PP_AGCTIME14rwfloat14Constante de tempo de AGC [0.5..4.0] s
PP_AGCFASTTIME15rwfloat14Tempo de decaimento rápido de AGC [0.05..4.0] s
PP_AGCALPHAFASTGAIN16rwfloat14Limite de ganho do modo rápido [0.0..1000.0]
PP_AGCALPHASLOW17rwfloat14Parâmetro de memória lenta [0.0..1.0]
PP_AGCALPHAFAST18rwfloat14Parâmetro de memória rápida [0.0..1.0]
PP_LIMITONOFF19rwint3214Chave do limitador (0,1)
PP_LIMITPLIMIT20rwfloat14Potência máxima do limitador [1e-8..1.0]
PP_MIN_NS21rwfloat14Piso de ganho de ruído em regime permanente [0.0..1.0]
PP_MIN_NN22rwfloat14Piso de ganho de ruído não estacionário [0.0..1.0]
PP_ECHOONOFF23rwint3214Chave de supressão de eco (0,1)
PP_GAMMA_E24rwfloat14Fator de super‑subtração de eco [0.0..2.0]
PP_GAMMA_ETAIL25rwfloat14Fator de super‑subtração de eco de cauda [0.0..2.0]
PP_GAMMA_ENL26rwfloat14Fator de super‑subtração de eco não linear [0.0..5.0]
PP_NLATTENONOFF27rwint3214Chave de atenuação de eco não linear (0,1)
PP_NLAEC_MODE28rwint3214Modo de treinamento de AEC não linear (0=normal 1=treinamento 2=treinamento2)
PP_MGSCALE29rwfloat312Escala de ganho mínimo (máx,mín,atual)
PP_FMIN_SPEINDEX30rwfloat14Limite de frequência de double‑talk [0.0..7999.0]
PP_DTSENSITIVE31rwint3214Sensibilidade de double‑talk [0..5, 10..15]
PP_ATTNS_MODE32rwint3214Chave de atenuação extra de não fala (0,1)
PP_ATTNS_NOMINAL33rwfloat14Atenuação nominal de fala [0.0..1.0]
PP_ATTNS_SLOPE34rwfloat14Inclinação de atenuação [0.0..5.0]
PP_CURRENT_IDLE_TIME70rouint3214Tempo ocioso atual de PP (tick de 10ns)
PP_MIN_IDLE_TIME71rouint3214Tempo ocioso mínimo de PP (tick de 10ns)
PP_RESET_MIN_IDLE_TIME72wouint3214Redefinir tempo ocioso mínimo de PP
PP_NL_MODEL_CMD_ABORT94woint3214Abortar máquina de estados de leitura/gravação de modelo NL
PP_EQUALIZATION_CMD_ABORT100woint3214Abortar máquina de estados de leitura/gravação do equalizador

Suporte Técnico e Discussão de Produtos

Obrigado por escolher nossos produtos! Estamos aqui para fornecer 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.

Loading Comments...