この辞書は、Skyworks (Silicon Labs) Si47XX PROGRAMMING GUIDE AN332 を基に、Google AI (Gemini) の協力を得て作成しています。
1 コマンド 0x42. AM_TUNE_STATUS 概要
1.1 概要
Si4735の0x42コマンド(AM_SEEK_STATUS)は、前述の 0x41(AM_SEEK_START)による自動選局が現在どのような状態にあるかを確認したり、シークを途中で強制終了したりするために使用するコマンドです。
また、現在の受信状態(電波強度や音質)をリアルタイムに取得する目的でも頻繁に使用されます。
AM_TUNE_FREQまたはAM_SEEK_STARTコマンドのステータスを返します。
これらのコマンドは、現在の周波数、RSSI、SNR、およびアンテナ同調容量値(0~6143)を返します。
ARG1のINTACKビットがセットされている場合、このコマンドはSTCINT割り込みビットをクリアします。
次のコマンドを安全に送信できる場合、CTSビット(およびオプションの割り込み)がセットされます。
このコマンドは、電源投入モードのときのみ送信できます。
注:AMRXコンポーネント2.1以前のバージョンでは、AFCRLビットは正しく動作しません。
対応機種:全機種
コマンド引数:1個
応答バイト数:7バイト
また、現在の受信状態(電波強度や音質)をリアルタイムに取得する目的でも頻繁に使用されます。
AM_TUNE_FREQまたはAM_SEEK_STARTコマンドのステータスを返します。
これらのコマンドは、現在の周波数、RSSI、SNR、およびアンテナ同調容量値(0~6143)を返します。
ARG1のINTACKビットがセットされている場合、このコマンドはSTCINT割り込みビットをクリアします。
次のコマンドを安全に送信できる場合、CTSビット(およびオプションの割り込み)がセットされます。
このコマンドは、電源投入モードのときのみ送信できます。
注:AMRXコンポーネント2.1以前のバージョンでは、AFCRLビットは正しく動作しません。
対応機種:全機種
コマンド引数:1個
応答バイト数:7バイト
1.2 コマンド関連の注意事項・実装のポイント
1.2.1 シーク中(動作中)の連続ポーリング時の注意
シークがまだ終わっていない段階(STC=0 の間)に、進捗(周波数やRSSIの変化)を画面にリアルタイム表示したくて 0x42 コマンドを過剰に連打(高速ポーリング)すると、I2C通信の負荷やノイズが原因でIC内部のシーク演算処理が遅延したり、最悪の場合チップがフリーズすることがあります。
シーク中のステータス確認は、最低でも数十ミリ秒(例: 20ms〜40ms程度)の間隔を空けてタイマー等で処理するのが安全です。
シーク中のステータス確認は、最低でも数十ミリ秒(例: 20ms〜40ms程度)の間隔を空けてタイマー等で処理するのが安全です。
1.2.2 INTACK の使いどころ
シーク完了を「マイコンの物理的な外部割込みピン(INT)」で検知する実装にしている場合、0x42 コマンドを投げる際に INTACK = 1 にしておかないと、割込み信号がクリアされず、マイコン側が「ずっと割込みが発生し続けている」と誤認して無限ループに陥ります。
2 コマンドパラメータ
2.1 パラメータリスト
| Bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| CMD | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
| ARG1 | 0 | 0 | 0 | 0 | 0 | 0 | CANCEL | INTACK |
| ARG | Bit | Name | Function |
|---|---|---|---|
| 1 | 1 | CANCEL | CANCEL:シークをキャンセルします 設定されている場合、現在進行中のシークを中止します。 |
| 1 | 0 | INTACK | シーク/チューニング割り込みクリア 設定されている場合、シーク/チューニング完了割り込みステータスインジケータをクリアします。 |
2.2 パラメータ
2.2.1 CANCEL(Seek Cancel Bit)
目的
現在実行中の自動選局(シーク)処理を、途中で強制的に停止させます。
解説
1 を設定してコマンドを送信すると、ICは即座にシーク動作を中止し、その時通過中だった周波数、またはシークを開始する前の元の周波数で停止します。
ユーザーがシーク中に「もう一度ボタンを押した」ときや、「ダイヤルを回して手動選局に切り替えた」ときなど、マイコン側からシークを緊急停止させたい場合に 1 を使用します。通常の状態確認時は 0 にします。
ユーザーがシーク中に「もう一度ボタンを押した」ときや、「ダイヤルを回して手動選局に切り替えた」ときなど、マイコン側からシークを緊急停止させたい場合に 1 を使用します。通常の状態確認時は 0 にします。
2.2.2 INTACK(Interrupt Acknowledge Bit)
目的
シーク完了時にIC内部で発生した「STC(Seek/Tune Complete)」の割込みフラグをクリア(リセット)します。
解説
1 に設定してこのコマンドを送ると、シーク完了の通知を受け取ったことをICに伝えたことになり、ICのステータスレジスタや物理的なIRQピンが初期状態(次のイベントを待てる状態)に戻ります。
わざわざ別の独立したコマンド(0x14 など)を呼ばなくても、ステータス確認と同時に割込みクリアを1発で行えるため、効率的なコードを書くために重宝します。
わざわざ別の独立したコマンド(0x14 など)を呼ばなくても、ステータス確認と同時に割込みクリアを1発で行えるため、効率的なコードを書くために重宝します。
3 応答パラメータ
3.1 パラメータリスト
| Bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| STATUS | CTS | ERR | X | X | RSQINT | X | X | STCINT |
| RESP1 | BLTF | X | X | X | X | X | AFCRL | VALID |
| RESP2 | READFREQH | |||||||
| RESP3 | READFREQL | |||||||
| RESP4 | RSSI | |||||||
| RESP5 | SNR | |||||||
| RESP6 | READANTCAPH | |||||||
| RESP7 | READANTCAPL | |||||||
| RESP | Bit | Name | Function |
|---|---|---|---|
| 1 | 7 | BLTF | バンドリミット。 シークがバンドリミットに達した場合(AM_START_SEEK の WRAP = 0)、または元の周波数に戻った場合(WRAP = 1)を報告します。 |
| 1 | 1 | AFCRL | AFCレールインジケーター。 AFCレールが設定されている場合。 |
| 1 | 0 | VALID | 有効なチャネル。 チャネルが現在有効であり、シーク中に検出された場合に設定されます。 |
| 2,3 | 7:0 | READFREQH,L | 周波数の上位[15:8]、下位[7:0]バイトを読み取ります。 このバイトをREADFREQLコマンドと組み合わせることで、調整中の周波数(kHz)が返されます。 |
| 4 | 7:0 | RSSI | 受信信号強度インジケータ。 このバイトには、チューニング完了時の受信信号強度(dBμV)が格納されます。 |
| 5 | 7:0 | SNR | SNR(信号対雑音比)。 このバイトには、チューニング完了時のSNR値(dB)が格納されています。 |
| 6,7 | 7:0 | READANTCAPH,L | アンテナ同調コンデンサの上位[15:0]、下位[7:0]バイトを読み取ります。 このバイトは、READANTCAPL と組み合わせて、現在のアンテナ同調コンデンサの値を返します。 同調容量は、95 fF × READANTCAP + 7 pF です。 |
3.2 パラメータ
応答の先頭パラメータ
応答(STATUSバイト)に含まれる各ビット(CTS, ERR, RSQINT, STCINT)は、「デバイスの現在の処理状態」や「各種割り込み(通知)の発生」をホストMCUに知らせる目的で設計されています。
STATUSバイトの信頼性:Si4735の仕様上、いくつかのコマンド送信時に返ってくるSTATUSバイトでは、CTS以外の割り込みビット(RSQINT, 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 STCINT(Seek/Tune Complete Interrupt)
目的:
選局(Tune)操作または自動選局(Seek)操作が完了したことを通知する。
解説:
周波数を変更するコマンド(FM_TUNE_FREQ や FM_SEEK_START など)は内部処理に時間がかかります。
デバイスが「目的の周波数への同調、または次の放送局の検知を完了した」時点でこのビットが1になります。
選局完了のタイミングを正確に把握する目的で使用します。
デバイスが「目的の周波数への同調、または次の放送局の検知を完了した」時点でこのビットが1になります。
選局完了のタイミングを正確に把握する目的で使用します。
3.2.5 BLTF(Band Limit Flag)
目的:
シークが終了した際、「放送局が見つからずに、帯域の端(上限/下限)に到達してしまったか」を示します。
解説:
1 の場合:設定されたシーク閾値を満たす放送局が1つも見つからないまま、バンドの端に達した(あるいは WRAP=1 で1周してしまった)ことを意味します。
0 の場合:無事に有効な放送局が見つかって停止したことを意味します。シークが「成功」したか「失敗(局なし)」したかを分ける最重要フラグです。
0 の場合:無事に有効な放送局が見つかって停止したことを意味します。シークが「成功」したか「失敗(局なし)」したかを分ける最重要フラグです。
3.2.6 AFCRL(AFC Rail Indicator)
目的:
内部の自動周波数制御(AFC)回路が、調整の限界(レール)に達しているかどうかを知らせます。
解説:
1 の場合:電波のズレを補正しようとした結果、AFCの補正限界をオーバーしていることを示します(=周波数がズレすぎている、または信号が非常に不安定)。
通常、正常に同調しているときは 0 になります。
通常、正常に同調しているときは 0 になります。
3.2.7 VALID(Station Valid Indicator)
目的:
現在受信中の周波数に、設定した閾値を超える「有効な放送局が存在するか」をICが判定した結果です。
解説:
1 であれば、電波強度が十分で放送局として成立しているとICが太鼓判を押した状態です。
シーク終了時にここが 1 になっていれば、無事に狙い通りの局をキャッチできたことになります。
シーク終了時にここが 1 になっていれば、無事に狙い通りの局をキャッチできたことになります。
3.2.8 READFREQH,L(Read Frequency High Byte / Low Byte)
目的:
シークが終了した(あるいは現在通過している)時点の、実際の受信周波数(kHz単位)を16ビットで返します。
解説:
シークで勝手に動いた結果、最終的に「何kHzの局で止まったのか」をマイコン側が知るために読み出します。
液晶ディスプレイ等に現在の周波数を表示する際は、この値をベースにします。
液晶ディスプレイ等に現在の周波数を表示する際は、この値をベースにします。
3.2.9 RSSI(Received Signal Strength Indicator)
目的:
現在受信している電波の強さを \(\text{dB}\mu\text{V}\) 単位の絶対値で返します。
解説:
値が大きいほど電波が強いことを示します。
画面に「電波メーター(バリコンのSメーター風グラフィック)」を表示させたい場合、この RSSI の値をリアルタイムに読み込んでバーを伸縮させます。
画面に「電波メーター(バリコンのSメーター風グラフィック)」を表示させたい場合、この RSSI の値をリアルタイムに読み込んでバーを伸縮させます。
3.2.10 SNR(Signal-to-Noise Ratio)
目的:
受信信号の「品質(ノイズに対してどれだけクリアか)」を \(\text{dB}\) 単位で返します。
解説:
RSSI(電波の強さ)が高くても、周囲の家電ノイズなどを拾っていると SNR は低い値になります。
真に「クリアな音で聴こえているか」を判断するための重要な指標です。
真に「クリアな音で聴こえているか」を判断するための重要な指標です。
3.2.11 READANTCAPH,L(Read Antenna Tuning Capacitor High Byte / Low Byte)
目的:
IC内部のオートチューニング回路が、最終的にマッチングさせた「現在のアンテナ容量値(1〜4095)」を返します。
解説:
シークコマンド(0x41)で ANTCAP=0x0000(自動)に設定して走らせた後、ICが自力で見つけ出した「最適解のコンデンサ容量」がいくつだったのかを答え合わせとして確認できます。
4 その他
4.1 Google AI (Gemini) の見解
Si4735のステータス取得機能を使いこなし、ワンランク上の高級ラジオを作るためのアドバイスです。
4.1.1 「インテリジェント・電波メーター」の実装(RSSIとSNRのハイブリッド化)
市販の安価なラジオの電波メーターは、単に電波の強さ(RSSI)だけでバーを表示するため、ノイズが激しい場所に行くと「ノイズを電波と勘違いしてメーターが満タンになる」という不自然な挙動をします。
Geminiからの提案: 0x42 で返ってくる RSSI と SNR の両方をファームウェア側で乗算、または条件分岐させて、「RSSIが高く、かつSNRも10dB以上ある場合のみメーターを高く灯す」という『真の信号品質メーター』を実装してみてください。
自作ラジオの信頼性が劇的に向上します。
Geminiからの提案: 0x42 で返ってくる RSSI と SNR の両方をファームウェア側で乗算、または条件分岐させて、「RSSIが高く、かつSNRも10dB以上ある場合のみメーターを高く灯す」という『真の信号品質メーター』を実装してみてください。
自作ラジオの信頼性が劇的に向上します。
4.1.2 自作アンテナの特性を可視化する(READANTCAP の応用)
バーアンテナを自分で巻いたり、特殊な外部ループアンテナを接続したりする場合、そのアンテナが「本当に狙った周波数で同調しているか」を調べるのは本来なら高価な測定器(測定器やネットワークアナライザ)が必要です。
しかし、この 0x42 コマンドで READANTCAP の値を読み出し、周波数ごとにエクセル等でグラフ化(プロット)すれば、「自分の作ったアンテナがどの周波数帯で一番綺麗にマッチングしているか」の特性曲線が浮き彫りになります。
Si4735自体を簡易的なアンテナ・アナライザとして活用できる、自作派にはたまらない隠れた展開方法です。
しかし、この 0x42 コマンドで READANTCAP の値を読み出し、周波数ごとにエクセル等でグラフ化(プロット)すれば、「自分の作ったアンテナがどの周波数帯で一番綺麗にマッチングしているか」の特性曲線が浮き彫りになります。
Si4735自体を簡易的なアンテナ・アナライザとして活用できる、自作派にはたまらない隠れた展開方法です。
4.1.3 まとめ
0x42 コマンドは、単に「シークが終わったか」を調べるだけのものではなく、ICの目(周波数・局の有無)と耳(RSSI・SNR・アンテナ同調状態)のすべてをマイコン側にさらけ出してくれる、最も情報密度の高いコマンドです。
