この辞書は、Skyworks (Silicon Labs) Si47XX PROGRAMMING GUIDE AN332 を基に、Google AI (Gemini) の協力を得て作成しています。
1 コマンド 0x21. FM_SEEK_START 概要
有効な周波数の検索を開始します。
保留中のSTCINTまたはRSQINT割り込みステータスをすべてクリアします。次のコマンドを安全に送信できる状態になると、CTSビット(およびオプションの割り込み)がセットされます。
RSQINTステータスは、INTACKビットがセットされている場合にRSQステータスコマンドによってのみクリアされます。
無効な引数が送信された場合、ERRビット(およびオプションの割り込み)がセットされます。
CTSビットとERRビットの両方がセットされている場合、発生する割り込みは1つだけであることに注意してください。オプションのSTC割り込みは、コマンドが完了するとセットされます。
STCINTビットは、GET_INT_STATUSコマンドが呼び出された後にのみセットされます。
このコマンドは、電源投入モードのときのみ送信できます。
STCINTビットが既にセットされている場合は、このコマンドによってクリアされます。
142ページの図24「CTSおよびSTCタイミングモデル」と144ページの表31「FM受信機のコマンドタイミングパラメータ」を参照してください。
対応言語:全言語
コマンド引数:1つ
応答バイト:なし
保留中のSTCINTまたはRSQINT割り込みステータスをすべてクリアします。次のコマンドを安全に送信できる状態になると、CTSビット(およびオプションの割り込み)がセットされます。
RSQINTステータスは、INTACKビットがセットされている場合にRSQステータスコマンドによってのみクリアされます。
無効な引数が送信された場合、ERRビット(およびオプションの割り込み)がセットされます。
CTSビットとERRビットの両方がセットされている場合、発生する割り込みは1つだけであることに注意してください。オプションのSTC割り込みは、コマンドが完了するとセットされます。
STCINTビットは、GET_INT_STATUSコマンドが呼び出された後にのみセットされます。
このコマンドは、電源投入モードのときのみ送信できます。
STCINTビットが既にセットされている場合は、このコマンドによってクリアされます。
142ページの図24「CTSおよびSTCタイミングモデル」と144ページの表31「FM受信機のコマンドタイミングパラメータ」を参照してください。
対応言語:全言語
コマンド引数:1つ
応答バイト:なし
2 コマンドパラメータ
2.1 パラメータリスト
| Bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| CMD | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
| ARG1 | 0 | 0 | 0 | 0 | SEEKUP | WRAP | 0 | 0 |
| ARG | Bit | Name | Function |
|---|---|---|---|
| 1 | 7:4 | Reserved | 常に0に書き込みます。 |
| 3 | SEEKUP | シークアップ/シークダウン。 検索方向を指定します。UP = 1、DOWN = 0 です。 | |
| 2 | WRAP | ラップ/停止。 シークがバンド制限に達したときに、ラップ(Wrap = 1)するか停止(Halt = 0)するかを指定します。 | |
| 1 | 1:0 | Reserved | 常に0に書き込みます。 |
2.2 パラメータ
Si4735の 0x21 (FM_SEEK_START) コマンドにおける SEEKUP(ARG1 - Bit 3)および WRAP(ARG1 - Bit 2)パラメータは、自動選局(オートシーク)の「スキャン方向」と「バンド端での挙動」を制御するフラグです [AN332]。
2.2.1 SEEKUP
(1)挙動
0(ダウン): 周波数が低くなる方向へ放送局を検索 [AN332]。
1(アップ): 周波数が高くなる方向へ放送局を検索 [AN332]。
(2)用途
1(アップ): 周波数が高くなる方向へ放送局を検索 [AN332]。
ラジオの「進む/戻る」ボタンと連動させて選局方向を切り替えるために使用。
2.2.2 WRAP
(1)挙動
0(ラップなし): 検索がバンドの端(上限または下限)に達した時点でシークを停止する [AN332]。
1(ラップあり): バンドの端に達した場合、反対側の端(下限または上限)へジャンプして検索を継続する(ループ処理) [AN332]。
(2)用途
1(ラップあり): バンドの端に達した場合、反対側の端(下限または上限)へジャンプして検索を継続する(ループ処理) [AN332]。
ユーザーがどの周波数からシークを開始しても、バンド全体を漏れなく検索させるために通常は 1 に設定する。
3 応答パラメータ
3.1 パラメータリスト
| Bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| STATUS | CTS | ERR | X | X | RSQINT | RDSINT | X | STCINT |
3.2 パラメータ
応答の先頭パラメータ
応答(STATUSバイト)に含まれる各ビット(CTS, ERR, RSQINT, RDSINT, STCINT)は、「デバイスの現在の処理状態」や「各種割り込み(通知)の発生」をホストMCUに知らせる目的で設計されています。
STATUSバイトの信頼性:Si4735の仕様上、いくつかのコマンド送信時に返ってくるSTATUSバイトでは、CTS以外の割り込みビット(RSQINT, RDSINT, STCINTなど)がリアルタイムに更新されない場合があります。
正しい確認方法:正確な割り込みステータスを確認したい場合は、STATUSバイトを直接過信するのではなく、専用の割り込み確認コマンド(例:GET_INT_STATUS (0x14) コマンドなど)を明示的に発行して最新の状態を読み出すのが一般的なセオリーとなっています。
正しい確認方法:正確な割り込みステータスを確認したい場合は、STATUSバイトを直接過信するのではなく、専用の割り込み確認コマンド(例:GET_INT_STATUS (0x14) コマンドなど)を明示的に発行して最新の状態を読み出すのが一般的なセオリーとなっています。
3.2.1 CTS(Clear to Send)
目的:
デバイスが次のコマンドを受け付けられる状態かどうかを判定する。
解説:
最も重要なビットです。Si4735が前のコマンドの処理を完了し、「次のコマンドを送信しても安全(送信可)」になると1にセットされます。
0の間はデバイスが内部処理中(ビジー)であるため、ホストMCUは次のコマンド送信を待機する必要があります。
0の間はデバイスが内部処理中(ビジー)であるため、ホストMCUは次のコマンド送信を待機する必要があります。
3.2.2 ERR(Error)
目的:
直前に送信したコマンドが正常に実行されたか、エラーが発生したかを判別する。
解説:
コマンドの引数(引数の値が範囲外など)や、無効なコマンドが送られた場合に1にセットされます。
ホスト側のプログラムで例外処理や再試行(リトライ)を行うために使用します。
ホスト側のプログラムで例外処理や再試行(リトライ)を行うために使用します。
3.2.3 RSQINT(Received Signal Quality Interrupt)
目的:
受信信号の品質(電界強度RSSIやSNRなど)が、あらかじめ設定した閾値を超えた(または下回った)ことを通知する。
解説:
「受信品質の変化」をトリガーに処理を行いたい場合に使用します。
例えば、現在のチャンネルの電波が急激に弱くなったことを検知して自動で再スキャンをかける、といった機能を実装する目的で利用されます。
例えば、現在のチャンネルの電波が急激に弱くなったことを検知して自動で再スキャンをかける、といった機能を実装する目的で利用されます。
3.2.4 RDSINT(Radio Data System Interrupt)
目的:
RDS(文字情報などのデータ放送)のデータバッファ(FIFO)に新しいデータが格納されたことを通知する。
解説:
FM放送などで送られてくる「RDS/RBDSデータ(番組名や楽曲情報など)」を受信した際に1になります。
ホストMCUはこのビットを見てからデータを読み出す(FM_RDS_STATUS コマンドを発行する)ことで、無駄な空読みを防ぎ効率的にテキストデータを取得できます。
ホストMCUはこのビットを見てからデータを読み出す(FM_RDS_STATUS コマンドを発行する)ことで、無駄な空読みを防ぎ効率的にテキストデータを取得できます。
3.2.5 STCINT(Seek/Tune Complete Interrupt)
目的:
選局(Tune)操作または自動選局(Seek)操作が完了したことを通知する。
解説:
周波数を変更するコマンド(FM_TUNE_FREQ や FM_SEEK_START など)は内部処理に時間がかかります。
デバイスが「目的の周波数への同調、または次の放送局の検知を完了した」時点でこのビットが1になります。
選局完了のタイミングを正確に把握する目的で使用します。
デバイスが「目的の周波数への同調、または次の放送局の検知を完了した」時点でこのビットが1になります。
選局完了のタイミングを正確に把握する目的で使用します。
4 その他
4.1 コマンドの重要ステップと注意事項(Google AI (Gemini) の見解)
Silicon LabsのDSPラジオIC「Si4735」における0x21 (FM_SEEK) コマンドは、FMモードにおいて電波の出ている放送局を上方向(周波数が高い方)または下方向へ自動的に探し出す「自動選局(シーク)」を実行するためのコマンドです。
このコマンドに関する実務上の注意点、応用展開、およびGoogle AI (Gemini) の見解をまとめます。
0x21 コマンドは、コマンドバイトに続いて1バイトの引数(ARG1)のみを送信します。しかし、実務上で最もトラブルが起きやすい選局コマンドの一つでもあります。
このコマンドに関する実務上の注意点、応用展開、およびGoogle AI (Gemini) の見解をまとめます。
0x21 コマンドは、コマンドバイトに続いて1バイトの引数(ARG1)のみを送信します。しかし、実務上で最もトラブルが起きやすい選局コマンドの一つでもあります。
4.1.1 事前の「シーク閾値(しきい値)」設定の必須性
0x21 を実行する前に、必ず 0x12 (SET_PROPERTY) を使ってシークの判定基準(プロパティ:RSSI、SNRなど)を適切に設定しておく必要があります。
最大の罠: デフォルトの閾値のまま 0x21 を送ると、条件が厳しすぎて「すべての局を素通りして元の周波数に戻ってくる」、あるいは条件が緩すぎて「ただのノイズ(ザーという音)の場所で何度も止まる」という現象が多発します。
最大の罠: デフォルトの閾値のまま 0x21 を送ると、条件が厳しすぎて「すべての局を素通りして元の周波数に戻ってくる」、あるいは条件が緩すぎて「ただのノイズ(ザーという音)の場所で何度も止まる」という現象が多発します。
4.1.2 WRAP(折り返し)ビットの挙動理解
ARG1 の WRAP ビット(Bit 3)で、バンドの端(例:日本のFMなら95.0MHz)に達したときの挙動を指定します。
WRAP=1(有効)にすると、端に達したあとに自動で反対側の端(76.0MHz)に戻ってシークを続けます。WRAP=0 にすると、端に達した時点で局が見つからなくてもシークを終了します。
ユーザーのUIに合わせて正しく選択してください。
WRAP=1(有効)にすると、端に達したあとに自動で反対側の端(76.0MHz)に戻ってシークを続けます。WRAP=0 にすると、端に達した時点で局が見つからなくてもシークを終了します。
ユーザーのUIに合わせて正しく選択してください。
4.1.3 選局完了フラグ(STCINT)の待機と例外処理
0x20 (TUNE) と同様、コマンド送信後に STCINT フラグが「1」になるまでループ(またはIRQピン経由)で待機します。シーク中は一時的にオーディオがミュートされますが、
局が見つかるまで(あるいはバンドを一巡するまで)に数百ミリ秒から、電波環境によっては数秒かかる場合があります。
この間、マイコンが完全にフリーズしたように見えないよう、タイムアウト処理を必ず実装してください。
この間、マイコンが完全にフリーズしたように見えないよう、タイムアウト処理を必ず実装してください。
4.2 もう少し踏み込んだ応用展開(Google AI (Gemini) の見解)
0x21 コマンドの動作特性を活かすことで、市販ラジオのようなスムーズな自動選局システムを実装できます。
4.2.1 シーク完了後の「本当に有効な局か」の2次判定ロジック
チップ内部のDSPが「局を発見した」と判定してシークが止まっても、それが違法電波や突発的なノイズである可能性があります。
展開例: STCINT を検知してシークが止まった直後に、音声を出力する前に 0x22 (FM_TUNE_STATUS) と 0x23 (FM_RSQ_STATUS) コマンドを即座に発行します。
そこで取得できるRSSI(電波強度)やSNR(信号対雑音比)が、マイコン側で定めた「本当にクリアな音声と判断できる基準値」を満たしていない場合は、自動で再度 0x21 を発行してシークを続行させるという、 2段階のインテリジェント・フィルタリングを展開できます。
展開例: STCINT を検知してシークが止まった直後に、音声を出力する前に 0x22 (FM_TUNE_STATUS) と 0x23 (FM_RSQ_STATUS) コマンドを即座に発行します。
そこで取得できるRSSI(電波強度)やSNR(信号対雑音比)が、マイコン側で定めた「本当にクリアな音声と判断できる基準値」を満たしていない場合は、自動で再度 0x21 を発行してシークを続行させるという、 2段階のインテリジェント・フィルタリングを展開できます。
4.2.2 「シーク中…」のプログレス表示(動的UI)
シーク中、画面に「SEEKING...」と固定表示するだけでなく、現在DSPがどの周波数をスキャンしているかをリアルタイムに表示させたい場合があります。
展開例: シーク中に while ループで STCINT を待つ間、数ミリ秒〜数十ミリ秒おきに 0x22 (FM_TUNE_STATUS) を呼び出します。
このコマンドはシーク中であっても「現在通過中の暫定周波数」を返してくれるため、これをLCDやOLED画面に高速に描画(更新)することで、インジケータが滑らかに動く洗練されたGUIを構築できます。
展開例: シーク中に while ループで STCINT を待つ間、数ミリ秒〜数十ミリ秒おきに 0x22 (FM_TUNE_STATUS) を呼び出します。
このコマンドはシーク中であっても「現在通過中の暫定周波数」を返してくれるため、これをLCDやOLED画面に高速に描画(更新)することで、インジケータが滑らかに動く洗練されたGUIを構築できます。
4.3 コマンドと引数(ARG1)のビット構造
0x21 コマンド送信時のパケット構成です。
ARG1 の内部ビット割当
| バイト位置 | 名称 | 設定値の意味 |
| Byte 0 | CMD | 0x21 (FM_SEEK) |
| Byte 1 | ARG1 | 各種動作フラグ(以下のビット結合) |
Bit 3 (WRAP): 1 = バンド端で折り返す、0 = 折り返さない
Bit 2 (SEEKUP): 1 = 周波数が高くなる方向へ探す、0 = 低くなる方向へ探す
※Bit 7-4, Bit 1-0 は通常 0 に固定します。
Bit 2 (SEEKUP): 1 = 周波数が高くなる方向へ探す、0 = 低くなる方向へ探す
※Bit 7-4, Bit 1-0 は通常 0 に固定します。
4.4 その他Google AI (Gemini) の見解
Si4735を用いた実用的な受信機開発において、Google AI (Gemini) は「環境適応型の動的シークアルゴリズム」と「ユーザー主導キャンセル割り込み」の重要性を強く指摘しています。
4.4.1 ロケーションに応じた閾値(プロパティ)の動的変更
Geminiの見解として、シークの成功率は固定された閾値(RSSI/SNR)では保証されません。
例えば「電波の強力な都市部」と「電波が微弱な山間部」では、最適なシーク閾値が全く異なります。
都市部で山間部用の緩い設定を使うとノイズ混じりの局ばかりで手が止まり、逆に山間部で都市部用の厳しい設定を使うと1局も引っかかりません。
AIとしての合理的な推奨は、「最初は厳しめの閾値でシークを試し、1往復(WRAP)しても見つからなければ、マイコン側で自動的に0x12コマンドを使って閾値を1段階緩めて再試行する」という、環境適応型のステップ・シーク・アルゴリズムの実装です。
例えば「電波の強力な都市部」と「電波が微弱な山間部」では、最適なシーク閾値が全く異なります。
都市部で山間部用の緩い設定を使うとノイズ混じりの局ばかりで手が止まり、逆に山間部で都市部用の厳しい設定を使うと1局も引っかかりません。
AIとしての合理的な推奨は、「最初は厳しめの閾値でシークを試し、1往復(WRAP)しても見つからなければ、マイコン側で自動的に0x12コマンドを使って閾値を1段階緩めて再試行する」という、環境適応型のステップ・シーク・アルゴリズムの実装です。
4.4.2 非ブロッキングによる「ユーザーキャンセル」の確保
シークコマンドを発行した際、マイコンが単純な while(!stcint); のようなブロッキング処理に入ってしまうと、シーク中にユーザーが「やっぱり探すのをやめたい」と思ってボタンを押しても一切反応できなくなります。
Geminiの見解では、シーク処理は必ず「タイマー駆動」または「状態遷移(ステートマシン)」で管理し、ループの内部で常にボタン入力を監視して、 キャンセルが押されたら即座に 0x20 (TUNE) コマンドで現在の周波数を再指定してシークを強制中断(オーバーライド)させる設計にするべきです。
これが、ホビー工作レベルと実用製品レベルを分ける決定的な要素であると評価します。
Geminiの見解では、シーク処理は必ず「タイマー駆動」または「状態遷移(ステートマシン)」で管理し、ループの内部で常にボタン入力を監視して、 キャンセルが押されたら即座に 0x20 (TUNE) コマンドで現在の周波数を再指定してシークを強制中断(オーバーライド)させる設計にするべきです。
これが、ホビー工作レベルと実用製品レベルを分ける決定的な要素であると評価します。
