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

I2C コマンドを使用して XIAO ESP32S3 で reSpeaker XVF3800 USB Mic Array を制御する

はじめに

このセクションでは、ReSpeaker XVF3800 の I2C 制御コマンド一覧に加え、I2C の読み書き例および 2 つの動作モードにおけるハードウェア信号パス図を示します。I2C インターフェース経由で ReSpeaker XVF3800 を制御するアプリケーション例については、Device Control セクションを参照してください。

pir

reSpeaker ハードウェア信号パス図

I2S モードの信号パス

pir

録音パス

マイクロフォンが生データを取得し、そのデータはアルゴリズムモジュールによって処理されます。処理されたデータは、I2S インターフェースを介してホストコントローラによって読み出されます。

再生パス

I2S モードでは、オーディオ再生パスは Host → XVF3800 → DAC と Host → DAC の 2 つの経路に分かれます。

1. Host → XVF3800 → DAC

ホストコントローラは I2S インターフェースを介して XVF3800 にオーディオデータを送信します。データは Optional Far DSP ブロックで処理され、その後 I2S バス経由で DAC に再送され、再生されます。

注記

この経路を介した再生のアプリケーション例については、reSpeaker XVF3800 Record and Playback Audio Using I2S セクションを参照してください。

2. Host → DAC

ホストコントローラは I2S インターフェースを介して DAC に直接オーディオデータを送信し、XVF3800 をバイパスして再生します。

注記

この経路を介した再生のアプリケーション例については、reSpeaker XVF3800 Audio Playback and Volume Control via I2C セクションを参照してください。

制御パス

制御パスも再生パスと同様に、2 つの経路に分かれます:

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 の 1 つだけであり、Host → XVF3800 と XVF3800 → DAC の 2 つの区間に分かれます。

  • Host ↔ XVF3800: 通信は USB 経由で行われます。マイクロフォンで取得された生データをアルゴリズムモジュールで処理したオーディオデータと、XVF3800 の Optional Far DSP、Optional PP、GPIO などのブロックを設定するための制御データの両方が USB 上で送受信されます。

  • XVF3800 ↔ DAC: 通信は I2C および I2S 経由で行われます。XVF3800 は I2C マスターおよび I2S マスターとして動作し、DAC のオーディオ再生を制御します。

注記

この経路を介した再生のアプリケーション例については、reSpeaker XVF3800 Control with Python セクションを参照してください。

I2C フレーム形式

書き込み動作

[resid] [cmd] [write_byte_num] [data...]
FieldDescription
residResource ID
cmdCommand ID
write_byte_num書き込むデータバイト数
data...書き込まれるデータバイト

読み出し動作(先にコマンドを書き込み、その後レスポンスを読み出し):

Step 1 (Write): [resid] [cmd | 0x80] [read_len + 1]
Step 2 (Read): [status] [data...]
FieldDescription
cmd|0x80MSB を 1 に設定したコマンド ID(読み出し動作を示す)
read_len + 1読み出しが想定されるバイト数(ステータスバイト分として +1)
statusレスポンスステータスバイト(0 = 成功、64 = 再試行)
data...返されるデータバイト
注記

詳細な 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

注記

I2C インターフェース経由で ReSpeaker XVF3800 を制御するアプリケーション例については、Device Control セクションを参照してください。

I2C コマンド一覧

ResID 一覧

Servicer NameResIDHexDescription
PP Servicer (Post-Processing)170x11AGC、リミッタ、ノイズ抑制、エコー抑制
GPO Servicer (GPIO/LED/DOA)200x14GPO 読み書き、LED エフェクト/色/速度/明るさ、DOA
AEC Servicer (Acoustic Echo Cancellation)330x21AEC フィルタ、ビーム、方位角、RT60
Audio Manager350x23ゲイン、I2S、チャネル選択、出力ルーティング
Application Servicer (System)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現在の設定をフラッシュに保存
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=high, 0=low)
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リングモードの LED ごとの色

ResID = 33 — AEC サービサー(Acoustic Echo Cancellation)

名前CmdID方向データ型バイト数説明
AEC_AECPATHCHANGE0roint3214AEC パス変更検出 (0,1)
AEC_HPFONOFF1rwint3214ハイパスフィルタ (0=off 1=70Hz 2=125Hz 3=150Hz 4=180Hz)
AEC_AECSILENCELEVEL2rwfloat28無音しきい値 [0.0..1.0]
AEC_AECCONVERGED3roint3214AEC 収束状態 (0,1)
AEC_AECEMPHASISONOFF4rwint3214プリ/デエンファシス (0=off 1=on 2=on_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=residual 1=ASR processed)
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=linear 2=square)
AEC_MIC_ARRAY_GEO74rofloat1248マイクアレイ形状 (3D XYZ 座標)
AEC_AZIMUTH_VALUES75roradians416方位角 (beam1/2/free/auto)
TEST_AEC_DISABLE_CONTROL76wouint3214AEC 制御の無効化(テスト専用)
AEC_CURRENT_IDLE_TIME77rouint3214現在のアイドル時間 (10ns ティック)
AEC_MIN_IDLE_TIME78rouint3214最小アイドル時間 (10ns ティック)
AEC_RESET_MIN_IDLE_TIME79wouint3214最小アイドル時間のリセット
AEC_SPENERGY_VALUES80rofloat416音声エネルギー (beam1/2/free/auto)
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 — Audio Manager(オーディオ管理)

名前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_TIME9woint3214I2S アイドル時間のリセット
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=active 1=inactive)
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=normal 1=training 2=training2)
PP_MGSCALE29rwfloat312最小ゲインスケール (max,min,cur)
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_TIME72wouint3214PP 最小アイドル時間のリセット
PP_NL_MODEL_CMD_ABORT94woint3214NL モデル読み書きステートマシンの中止
PP_EQUALIZATION_CMD_ABORT100woint3214イコライザ読み書きステートマシンの中止

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

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

Loading Comments...