Skip to main content

使用 I2C 命令通过 XIAO ESP32S3 控制 reSpeaker XVF3800 USB Mic Array

介绍

本节提供 ReSpeaker XVF3800 的 I2C 控制命令列表,以及 I2C 读写示例和两种工作模式下的硬件信号路径图。关于通过 I2C 接口控制 ReSpeaker XVF3800 的应用示例,请参考 Device Control 章节。

pir

reSpeaker 硬件信号路径图

I2S 模式信号路径

pir

录音路径

麦克风采集原始数据,由算法模块进行处理,处理后的数据通过 I2S 接口由主控读取。

回放路径

在 I2S 模式下,音频回放路径分为两路:Host → XVF3800 → DAC 和 Host → DAC。

1. Host → XVF3800 → DAC

主控通过 I2S 接口将音频数据发送到 XVF3800,数据经 Optional Far DSP 模块处理后,再通过 I2S 总线重新传输到 DAC 进行回放。

note

关于通过此路径进行回放的应用示例,请参考 reSpeaker XVF3800 Record and Playback Audio Using I2S 章节。

2. Host → DAC

主控通过 I2S 接口将音频数据直接发送到 DAC 进行回放,绕过 XVF3800。

note

关于通过此路径进行回放的应用示例,请参考 reSpeaker XVF3800 Audio Playback and Volume Control via I2C 章节。

控制路径

控制路径与回放路径类似,也分为两路:

1. Host → XVF3800 → DAC
  • Host ↔ XVF3800 通信: 主控作为 I2C 主机,XVF3800 作为 I2C 从机。主控通过 I2C 配置 XVF3800 的 Optional Far DSP、Optional PP、GPIO 以及其他模块。
  • XVF3800 ↔ DAC 通信: XVF3800 作为 I2C 主机,DAC 作为 I2C 从机。XVF3800 通过 I2C 控制 DAC 回放。
2. Host → DAC

主控直接与 DAC 通信。主控通过 I2C 直接控制 DAC 进行音频回放和音量调节。

USB 模式信号路径

pir

在 USB 模式下,仅有一条数据路径:Host → XVF3800 → DAC,该路径又分为两个部分:Host → XVF3800 和 XVF3800 → DAC。

  • Host ↔ XVF3800: 通过 USB 通信。音频数据(麦克风采集的原始数据,经算法模块处理)和控制数据(用于配置 XVF3800 的 Optional Far DSP、Optional PP、GPIO 及其他模块)均通过 USB 传输。

  • XVF3800 ↔ DAC: 通过 I2C 和 I2S 通信。XVF3800 作为 I2C 主机和 I2S 主机,控制 DAC 进行音频回放。

note

关于通过此路径进行回放的应用示例,请参考 reSpeaker XVF3800 Control with Python 章节。

I2C 帧格式

写操作

[resid] [cmd] [write_byte_num] [data...]
FieldDescription
resid资源 ID
cmd命令 ID
write_byte_num要写入的数据字节数
data...要写入的数据字节

读操作(先写命令,再读响应):

Step 1 (Write): [resid] [cmd | 0x80] [read_len + 1]
Step 2 (Read): [status] [data...]
FieldDescription
cmd|0x80最高位(MSB)置 1 的命令 ID,表示读操作
read_len + 1期望读取的字节数(+1 为状态字节)
status响应状态字节(0 = 成功,64 = 重试)
data...返回的数据字节
note

关于详细的 I2C 命令列表,请参考 I2C Command List 章节。

Arduino 读写示例

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

写入

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

读取

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

读取固件版本示例

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

预期输出

pir

note

关于通过 I2C 接口控制 ReSpeaker XVF3800 的应用示例,请参考 Device Control 章节。

I2C 命令列表

ResID 列表

Servicer NameResIDHexDescription
PP Servicer (后处理)170x11AGC、限幅、噪声抑制、回声抑制
GPO Servicer (GPIO/LED/DOA)200x14GPO 读写、LED 效果/颜色/速度/亮度、DOA
AEC Servicer (声学回声消除)330x21AEC 滤波器、波束、方位角、RT60
Audio Manager350x23增益、I2S、通道选择、输出路由
Application Servicer (系统)480x30版本、重启、配置保存、USB 位深

CmdID 列表

ResID = 48 — Application Servicer(系统控制)

NameCmdIDDirectionData TypeValuesBytesDescription
VERSION0rouint833固件版本(MAJOR、MINOR、PATCH)
BLD_MSG1rochar5050构建信息(构建配置名称)
BLD_HOST2rochar3030CI 构建主机信息
BLD_REPO_HASH3rochar4040GIT 哈希值
BLD_MODIFIED4rochar66固件是否被修改
BOOT_STATUS5rochar33启动模式(SPI/JTAG/FLASH)
TEST_CORE_BURN6rwuint811核心压力测试(重启芯片)
REBOOT7wouint811重启芯片,恢复默认参数
USB_BIT_DEPTH8rwuint822USB 位深(16/24/32),仅 USB 模式
SAVE_CONFIGURATION9wouint811将当前配置保存到 flash
CLEAR_CONFIGURATION10wouint811清除配置,恢复默认值
AIC3104_HP_LEVEL11rwuint811耳机输出电平 [0..9]
AIC3104_LINEOUT_LEVEL12rwuint811线路输出电平 [0..9]

ResID = 20 — GPO Servicer(GPIO 和 LED 控制)

NameCmdIDDirectionData TypeValuesBytesDescription
GPO_READ_VALUES0rouint855读取所有 GPO 引脚电平
GPO_WRITE_VALUE1wouint822设置指定 GPO 引脚电平
GPO_PORT_PIN_INDEX2rwuint3228GPO 端口/引脚索引
GPO_PIN_VAL3wouint833写入指定端口引脚值
GPO_PIN_ACTIVE_LEVEL4rwuint3214有效电平(1=高,0=低)
LED_EFFECT12rwuint811LED 效果(0=off 1=breathing 2=rainbow 3=solid 4=DOA 5=ring)
LED_BRIGHTNESS13rwuint811LED 亮度
LED_GAMMIFY14rwuint811伽马校正(0=off 1=on)
LED_SPEED15rwuint811LED 速度
LED_COLOR16rwuint3214LED 颜色(RGB)
LED_DOA_COLOR17rwuint3228DOA 模式颜色(基础颜色 + DOA 颜色)
DOA_VALUE18rouint1624DOA 角度(0-359)+ 语音检测标志
LED_RING_COLOR19rwuint321248环形模式逐灯颜色

ResID = 33 — AEC 服务器(声学回声消除)

名称CmdID方向数据类型数值字节数描述
AEC_AECPATHCHANGE0roint3214AEC 路径变化检测 (0,1)
AEC_HPFONOFF1rwint3214高通滤波器 (0=关闭 1=70Hz 2=125Hz 3=150Hz 4=180Hz)
AEC_AECSILENCELEVEL2rwfloat28静音阈值 [0.0..1.0]
AEC_AECCONVERGED3roint3214AEC 收敛状态 (0,1)
AEC_AECEMPHASISONOFF4rwint3214预加重/去加重 (0=关闭 1=开启 2=开启_eq)
AEC_FAR_EXTGAIN5rwfloat14远端外部增益 (dB)
AEC_PCD_COUPLINGI6rwfloat14PCD 灵敏度 [0.0..1.0]
AEC_PCD_MINTHR7rwfloat14PCD 最小阈值 [0.0..0.02]
AEC_PCD_MAXTHR8rwfloat14PCD 最大阈值 [0.025..0.2]
AEC_RT609rofloat14RT60 混响估计 [0.250..0.900] 秒
AEC_ASROUTONOFF35rwint3214ASR 输出开关 (0=残差 1=ASR 处理后)
AEC_ASROUTGAIN36rwfloat14ASR 输出增益 [0.0..1000.0]
AEC_FIXEDBEAMSONOFF37rwint3214固定波束模式开关 (0,1)
AEC_FIXEDBEAMNOISETHR38rwfloat28固定波束噪声阈值 [0.0..1.0]
SHF_BYPASS70rwuint811AEC 旁路
AEC_NUM_MICS71roint3214麦克风数量
AEC_NUM_FARENDS72roint3214远端参考数量
AEC_MIC_ARRAY_TYPE73roint3214麦克风阵列类型 (1=线性 2=方形)
AEC_MIC_ARRAY_GEO74rofloat1248麦克风阵列几何结构 (3D XYZ 坐标)
AEC_AZIMUTH_VALUES75roradians416方位角 (波束 1/2/自由/自动)
TEST_AEC_DISABLE_CONTROL76wouint3214禁用 AEC 控制(仅测试)
AEC_CURRENT_IDLE_TIME77rouint3214当前空闲时间 (10ns 计时)
AEC_MIN_IDLE_TIME78rouint3214最小空闲时间 (10ns 计时)
AEC_RESET_MIN_IDLE_TIME79wouint3214重置最小空闲时间
AEC_SPENERGY_VALUES80rofloat416语音能量 (波束 1/2/自由/自动)
AEC_FIXEDBEAMSAZIMUTH_VALUES81rwradians28固定波束方位角
AEC_FIXEDBEAMSELEVATION_VALUES82rwradians28固定波束仰角
AEC_FIXEDBEAMSGATING83rwuint811固定波束门控开关
SPECIAL_CMD_AEC_FAR_MIC_INDEX90woint3228AEC 滤波器读取索引(触发命令)
SPECIAL_CMD_AEC_FILTER_COEFF_START_OFFSET91rwint3214滤波器系数起始偏移量
SPECIAL_CMD_AEC_FILTER_COEFFS92rwfloat1560AEC 滤波器系数读/写
SPECIAL_CMD_AEC_FILTER_LENGTH93roint3214AEC 滤波器长度
AEC_FILTER_CMD_ABORT94woint3214中止滤波器读/写状态机

ResID = 35 — 音频管理器(音频管理)

名称CmdID方向数据类型数值字节数描述
AUDIO_MGR_MIC_GAIN0rwfloat14麦克风增益(SHF 之前)
AUDIO_MGR_REF_GAIN1rwfloat14参考信号增益(SHF 之前)
AUDIO_MGR_CURRENT_IDLE_TIME2roint3214当前空闲时间 (10ns 计时)
AUDIO_MGR_MIN_IDLE_TIME3roint3214最小空闲时间 (10ns 计时)
AUDIO_MGR_RESET_MIN_IDLE_TIME4woint3214重置最小空闲时间
MAX_CONTROL_TIME5roint3214最大控制时间
RESET_MAX_CONTROL_TIME6woint3214重置最大控制时间
I2S_CURRENT_IDLE_TIME7roint3214I2S 当前空闲时间
I2S_MIN_IDLE_TIME8roint3214I2S 最小空闲时间
I2S_RESET_MIN_IDLE_TIME9woint3214重置 I2S 空闲时间
I2S_INPUT_PACKED10rwuint811I2S/USB 输入打包模式
AUDIO_MGR_SELECTED_AZIMUTHS11roradians28选定波束方位角(处理 DOA + 自动选择 DOA)
AUDIO_MGR_SELECTED_CHANNELS12rwuint822选定输出通道
AUDIO_MGR_OP_PACKED13rwuint822L/R 输出打包状态
AUDIO_MGR_OP_UPSAMPLE14rwuint822L/R 输出上采样状态
AUDIO_MGR_OP_L15rwuint822L 通道类别和源 (= OP_L_PK0)
AUDIO_MGR_OP_L_PK016rwuint822L 通道打包源 0
AUDIO_MGR_OP_L_PK117rwuint822L 通道打包源 1
AUDIO_MGR_OP_L_PK218rwuint822L 通道打包源 2
AUDIO_MGR_OP_R19rwuint822R 通道类别和源 (= OP_R_PK0)
AUDIO_MGR_OP_R_PK020rwuint822R 通道打包源 0
AUDIO_MGR_OP_R_PK121rwuint822R 通道打包源 1
AUDIO_MGR_OP_R_PK222rwuint822R 通道打包源 2
AUDIO_MGR_OP_ALL23rwuint81212所有 L/R 打包源设置
I2S_INACTIVE24rouint811I2S 活动状态 (0=活动 1=非活动)
AUDIO_MGR_FAR_END_DSP_ENABLE25rwuint811远端 DSP 开关
AUDIO_MGR_SYS_DELAY26rwint3214参考信号延迟(采样点)
I2S_DAC_DSP_ENABLE27rwuint811DAC 远端 DSP 开关

ResID = 17 — PP 服务器(后处理:AGC/噪声/回声)

名称CmdID方向数据类型数值字节数描述
PP_AGCONOFF10rwint3214AGC 开关 (0,1)
PP_AGCMAXGAIN11rwfloat14AGC 最大增益 [1.0..1000.0]
PP_AGCDESIREDLEVEL12rwfloat14AGC 目标功率 [1e-8..1.0]
PP_AGCGAIN13rwfloat14AGC 当前增益 [1.0..1000.0]
PP_AGCTIME14rwfloat14AGC 时间常数 [0.5..4.0] 秒
PP_AGCFASTTIME15rwfloat14AGC 快速衰减时间 [0.05..4.0] 秒
PP_AGCALPHAFASTGAIN16rwfloat14快速模式增益阈值 [0.0..1000.0]
PP_AGCALPHASLOW17rwfloat14慢速记忆参数 [0.0..1.0]
PP_AGCALPHAFAST18rwfloat14快速记忆参数 [0.0..1.0]
PP_LIMITONOFF19rwint3214限幅器开关 (0,1)
PP_LIMITPLIMIT20rwfloat14限幅器最大功率 [1e-8..1.0]
PP_MIN_NS21rwfloat14稳态噪声增益下限 [0.0..1.0]
PP_MIN_NN22rwfloat14非稳态噪声增益下限 [0.0..1.0]
PP_ECHOONOFF23rwint3214回声抑制开关 (0,1)
PP_GAMMA_E24rwfloat14回声过度减法因子 [0.0..2.0]
PP_GAMMA_ETAIL25rwfloat14尾部回声过度减法因子 [0.0..2.0]
PP_GAMMA_ENL26rwfloat14非线性回声过度减法因子 [0.0..5.0]
PP_NLATTENONOFF27rwint3214非线性回声衰减开关 (0,1)
PP_NLAEC_MODE28rwint3214非线性 AEC 训练模式 (0=正常 1=训练 2=训练 2)
PP_MGSCALE29rwfloat312最小增益缩放 (最大,最小,当前)
PP_FMIN_SPEINDEX30rwfloat14双讲频率边界 [0.0..7999.0]
PP_DTSENSITIVE31rwint3214双讲灵敏度 [0..5, 10..15]
PP_ATTNS_MODE32rwint3214非语音额外衰减开关 (0,1)
PP_ATTNS_NOMINAL33rwfloat14标称语音衰减 [0.0..1.0]
PP_ATTNS_SLOPE34rwfloat14衰减斜率 [0.0..5.0]
PP_CURRENT_IDLE_TIME70rouint3214PP 当前空闲时间 (10ns 计时)
PP_MIN_IDLE_TIME71rouint3214PP 最小空闲时间 (10ns 计时)
PP_RESET_MIN_IDLE_TIME72wouint3214重置 PP 最小空闲时间
PP_NL_MODEL_CMD_ABORT94woint3214中止 NL 模型读/写状态机
PP_EQUALIZATION_CMD_ABORT100woint3214中止均衡器读/写状态机

技术支持与产品讨论

感谢您选择我们的产品!我们将为您提供多种支持,确保您在使用我们产品的过程中尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...