この解説は、Skyworks (Silicon Labs) Si47XX PROGRAMMING GUIDE AN332 を基に、Google AI (Gemini) の協力を得て作成しています。
1 コマンド 概要
PATCH_DATA (Patch Data Transfer)
Silicon Labs社製ラジオレシーバIC(Si4735/32等)において、「0x16: PATCH_DATA」はファームウェアパッチをデバイスの内部RAMにロードするためのコマンド(Command)です。
パッチデータの構造はPATCH の構造を参照下さい。
[目的と概要]:
Silicon Labs社製ラジオレシーバIC(Si4735/32等)において、「0x16: PATCH_DATA」はファームウェアパッチをデバイスの内部RAMにロードするためのコマンド(Command)です。
パッチデータの構造はPATCH の構造を参照下さい。
[目的と概要]:
外部ホストマイコンからSi47xxの内部RAMへ、ファームウェアパッチの本体データ(7バイト分)を1行ずつ流し込むための専用コマンド。
[AN332で記載されていない目的と解説]:
パッチファイルの大部分(約9割以上)を占めるコマンドです。
内部的にはパッチ受信用アドレスポインタを自動インクリメントしながらデータをRAMに書き込んでおり、 0x15 (PATCH_ARGS) がアドレスや制御の切り替えを行うのに対し、0x16 は連続する純粋なバイナリデータの高速な流し込みに特化しています。
内部的にはパッチ受信用アドレスポインタを自動インクリメントしながらデータをRAMに書き込んでおり、 0x15 (PATCH_ARGS) がアドレスや制御の切り替えを行うのに対し、0x16 は連続する純粋なバイナリデータの高速な流し込みに特化しています。
2 コマンドパラメータ
2.1 パラメータリスト
ホストから送信するパケットは、先頭のコマンドバイトを含めて常に計8バイト固定です。
AN332で記載されていない目的と解説:
海外の著名なライブラリ(pu2clr氏のSi4735ライブラリなど)では、マイコンのROM容量(Flash)を節約するため、 配列データからこの 0x16 を全て削除して保存し、送信関数内で動的に 0x16 を付与して送信する「圧縮パッチ(Compressed Patch)」手法が標準化されています。
AN332で記載されていない目的と解説:
海外の著名なライブラリ(pu2clr氏のSi4735ライブラリなど)では、マイコンのROM容量(Flash)を節約するため、 配列データからこの 0x16 を全て削除して保存し、送信関数内で動的に 0x16 を付与して送信する「圧縮パッチ(Compressed Patch)」手法が標準化されています。
| Bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| CMD | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
| ARG1 | X | X | X | X | X | X | X | X |
| ARG2 | X | X | X | X | X | X | X | X |
| ARG3 | X | X | X | X | X | X | X | X |
| ARG4 | X | X | X | X | X | X | X | X |
| ARG5 | X | X | X | X | X | X | X | X |
| ARG6 | X | X | X | X | X | X | X | X |
| ARG7 | X | X | X | X | X | X | X | X |
| ARG | Bit | Name | Function |
|---|---|---|---|
| 1 | 8 | Patch Data Byte 1 | |
| 2 | 8 | Patch Data Byte 2 | |
| 3 | 8 | Patch Data Byte 3 | |
| 4 | 8 | Patch Data Byte 4 | |
| 5 | 8 | Patch Data Byte 5 | |
| 6 | 8 | Patch Data Byte 6 | |
| 7 | 8 | Patch Data Byte 7 |
3 応答パラメータ
STATUS (Status Byte)[目的と概要]:
コマンド(8バイト)を1行送信するごとに、デバイスから1バイトのステータスが返されます。
[目的と概要]:
デバイスの現在の状態を示す1バイトの応答。最上位ビット(Bit 7)の CTS (Clear to Send) と、Bit 6の ERR (Error) を含みます。
[詳細解説]:
CTS (Bit 7): デバイスが1行(8バイト)のデータ処理を終え、次のパッチコマンド(0x15 または 0x16)を受け入れ可能になったら 1 になります。
ホストはこのビットを必ずポーリング(監視)する必要があります。
ERR (Bit 6): パッチの転送中に内部チェックサムエラーや、データの順序不正(シーケンスエラー)を検出した場合、デバイスはこのビットを 1 にしてパッチ処理を強制停止(ハルト)します。
コマンド(8バイト)を1行送信するごとに、デバイスから1バイトのステータスが返されます。
[目的と概要]:
デバイスの現在の状態を示す1バイトの応答。最上位ビット(Bit 7)の CTS (Clear to Send) と、Bit 6の ERR (Error) を含みます。
[詳細解説]:
CTS (Bit 7): デバイスが1行(8バイト)のデータ処理を終え、次のパッチコマンド(0x15 または 0x16)を受け入れ可能になったら 1 になります。
ホストはこのビットを必ずポーリング(監視)する必要があります。
ERR (Bit 6): パッチの転送中に内部チェックサムエラーや、データの順序不正(シーケンスエラー)を検出した場合、デバイスはこのビットを 1 にしてパッチ処理を強制停止(ハルト)します。
4 その他(Google AI (Gemini) の見解)
4.1 コマンドの重要ステップと注意事項
POWER_UPでの有効化:
厳密な8バイト送信:
ディレイではなくCTS同期:
0x01: POWER_UP コマンドを発行する際、引数の FUNC でパッチ起動フラグ(Patching enabled)をあらかじめ有効にしておかなければ、0x16 コマンドは一切受け付けられません。
厳密な8バイト送信:
I2CまたはSPI通信において、必ず1回あたり「0x16 + 7バイト」の計8バイトを途切れなく送信する必要があります。
1バイトでも過不足があると内部ポインタがズレてERRハルトの原因になります。
1バイトでも過不足があると内部ポインタがズレてERRハルトの原因になります。
ディレイではなくCTS同期:
パッチのRAM書き込み処理時間はデータによって僅かに変動します。
固定のウェイト(ディレイ時間)を設けるのではなく、必ずSTATUSバイトを読み出してCTSビットが 1 になったことを確認してから次の行を送信してください。
固定のウェイト(ディレイ時間)を設けるのではなく、必ずSTATUSバイトを読み出してCTSビットが 1 になったことを確認してから次の行を送信してください。
4.2 もう少し踏み込んだ応用展開
SSB機能(LSB/USB)の動的ロード:
メモリの効率的な圧縮(Compressed Patch):
Si4735/32における 0x16 コマンドの最大の恩恵は、通常のAM/FMラジオにSSB受信機能を実装することです。
パッチデータは1000行(約8KB以上)を超えるため、高速なパッチ転送ドライバの設計が起動速度を左右します。
パッチデータは1000行(約8KB以上)を超えるため、高速なパッチ転送ドライバの設計が起動速度を左右します。
メモリの効率的な圧縮(Compressed Patch):
前述の通り、パッチ内は 0x16 が圧倒的多数を占めます。
そのため、0x15 が出現する行番号(インデックス)だけを別個の軽量なインデックス配列で管理し、 メインのパッチ配列からは先頭の 0x16 を全て取り除いて7バイトずつ保存することで、Arduino Uno(ATmega328P)のようなROM容量の厳しい環境でもSSBパッチを内蔵可能になります。
そのため、0x15 が出現する行番号(インデックス)だけを別個の軽量なインデックス配列で管理し、 メインのパッチ配列からは先頭の 0x16 を全て取り除いて7バイトずつ保存することで、Arduino Uno(ATmega328P)のようなROM容量の厳しい環境でもSSBパッチを内蔵可能になります。
4.3 デバッグ時のチェックリスト
I2C送信バッファ制限の確認:
エラー(ERR)ビットのリアルタイム監視:
最終適用リビジョンの確認:
マイコン側のI2Cライブラリ(Wireなど)の送信バッファが8バイト以上に対応しているか?(一部の環境ではバッファ制限でデータが途切れる罠があります)
エラー(ERR)ビットのリアルタイム監視:
転送中の任意のタイミングでSTATUSのBit 6(ERR)が 1 になっていないか?(もし 1 になった場合、それ以降の 0x16 は全て無視されるため、ハードウェアリセットからやり直す必要があります)
最終適用リビジョンの確認:
すべてのパッチデータを送り終えた後、0x10: GET_REV コマンドを発行し、CHIPREV や FWREV がSSB対応パッチのバージョン(例: 固有名詞のパッチリビジョン)に正しく切り替わっているか確認する。
4.4 まとめ
0x16: PATCH_DATA コマンドは、Si47xxシリーズに「SSB受信」という強力な新機能を吹き込むためのデータ転送の主役です。
全体のデータ量が非常に多いため、このコマンドをいかに「高速」かつ「確実(CTS同期)」にマイコンから流し込めるかが、自作短波ラジオ等の起動安定性と快適性を決定づけます。
全体のデータ量が非常に多いため、このコマンドをいかに「高速」かつ「確実(CTS同期)」にマイコンから流し込めるかが、自作短波ラジオ等の起動安定性と快適性を決定づけます。
