この辞書は、Skyworks (Silicon Labs) Si47XX PROGRAMMING GUIDE AN332 を基に、Google AI (Gemini) の協力を得て作成しています。
1 コマンド 0x80. GPIO_CTL 概要
1.1 概要
Si4735の0x80コマンド(GPIO_CTL)は、ICが備えている汎用出力ピン(GPO1、GPO2、GPO3)を「出力モード」にするか「ハイ・インピーダンス(Hi-Z:電気的に絶縁された入力待ち状態)」にするかを制御するためのコマンドです。
また、すべてのコマンド実行後に返ってくる「共通ステータスバイト」の中に、音声の品質状態を知らせる ASQINT などの重要な割込み情報が含まれています。
GPO1、GPO2、GPO3の出力を有効にします。GPO1、GPO2、GPO3OENビットを設定することで、GPO1、GPO2、GPO3の出力(ハイインピーダンスまたはアクティブドライブ)を設定できます。
GPO1、GPO2、GPO3の状態(ハイまたはロー)は、GPIO_SETコマンドで設定します。
発振による過電流消費を避けるため、GPOピンをハイインピーダンス状態にしたままにしないでください。
次のコマンドを安全に送信できる状態になると、CTSビット(およびオプションの割り込み)が設定されます。
このコマンドは、電源投入モードのときのみ送信できます。
デフォルトでは、すべてのGPOピンがハイインピーダンスに設定されています。
注記:
1. GPIO_CTLは、AM_SW_LWコンポーネント2.0以降でサポートされています。
2. GPO2を割り込みピンとして使用する場合、および/またはGPO3をDCLKデジタルクロック入力として使用する場合、それぞれGPO2および/またはGPO3のPIO_CTL機能は無効になります。
使用可能環境:全環境
コマンド引数:1つ
応答バイト:なし
また、すべてのコマンド実行後に返ってくる「共通ステータスバイト」の中に、音声の品質状態を知らせる ASQINT などの重要な割込み情報が含まれています。
GPO1、GPO2、GPO3の出力を有効にします。GPO1、GPO2、GPO3OENビットを設定することで、GPO1、GPO2、GPO3の出力(ハイインピーダンスまたはアクティブドライブ)を設定できます。
GPO1、GPO2、GPO3の状態(ハイまたはロー)は、GPIO_SETコマンドで設定します。
発振による過電流消費を避けるため、GPOピンをハイインピーダンス状態にしたままにしないでください。
次のコマンドを安全に送信できる状態になると、CTSビット(およびオプションの割り込み)が設定されます。
このコマンドは、電源投入モードのときのみ送信できます。
デフォルトでは、すべてのGPOピンがハイインピーダンスに設定されています。
注記:
1. GPIO_CTLは、AM_SW_LWコンポーネント2.0以降でサポートされています。
2. GPO2を割り込みピンとして使用する場合、および/またはGPO3をDCLKデジタルクロック入力として使用する場合、それぞれGPO2および/またはGPO3のPIO_CTL機能は無効になります。
使用可能環境:全環境
コマンド引数:1つ
応答バイト:なし
1.2 コマンド関連の注意事項・実装のポイント
1.2.1 ピンの「機能競合(オーバーライド)」に最大級の注意を
GPO2ピンとGPO3ピンは、ラジオシステム全体を制御するための重要な固有機能と物理的にピンを共有(兼用)しています。
GPO2: マイコンへイベントを伝えるための「物理割込みピン(IRQ)」として使われるのが一般的です。
GPO3: 外部から正確な基準クロックを入れるための「デジタルクロック入力ピン(DCLK)」として割り当てられることがあります。
もし回路設計でこれら(IRQやDCLK)としてピンを使用している場合、0x80 コマンドで強引に GPO2OEN = 1 や GPO3OEN = 1 を設定すると、固有の機能が上書き(シャットアウト)されて無効化され、 マイコンが割込みを受け取れなくなったりクロックが途切れたりしてシステムが崩壊します。
使用していないピンだけを 1 にしてください。
注意点として 4.2.3 まとめ(実装時の黄金律) も確認して下さい。
GPO2: マイコンへイベントを伝えるための「物理割込みピン(IRQ)」として使われるのが一般的です。
GPO3: 外部から正確な基準クロックを入れるための「デジタルクロック入力ピン(DCLK)」として割り当てられることがあります。
もし回路設計でこれら(IRQやDCLK)としてピンを使用している場合、0x80 コマンドで強引に GPO2OEN = 1 や GPO3OEN = 1 を設定すると、固有の機能が上書き(シャットアウト)されて無効化され、 マイコンが割込みを受け取れなくなったりクロックが途切れたりしてシステムが崩壊します。
使用していないピンだけを 1 にしてください。
注意点として 4.2.3 まとめ(実装時の黄金律) も確認して下さい。
1.2.2 0x80 のあとは 0x81 がセット
ピンを出力として使う場合は、まずこの 0x80 コマンドで設定を 1(出力許可)にしてから、初めて 0x81(GPIO_SET) コマンドで「HighにするかLowにするか」を命令するという、2ステップの手順を踏む必要があります。
2 コマンドパラメータ
2.1 パラメータリスト
| Bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| CMD | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| ARG1 | 0 | 0 | 0 | 0 | GPO3OEN | GPO2OEN | GPO1OEN | 0 |
| ARG | Bit | Name | Function |
|---|---|---|---|
| 1 | 3 | GPO3OEN | GPO3 出力有効化。 0 = 出力無効(Hi-Z)(デフォルト)。 1 = 出力有効。 |
| 1 | 2 | GPO2OEN | GPO2 出力有効化。 0 = 出力無効(Hi-Z)(デフォルト)。 1 = 出力有効。 |
| 1 | 1 | GPO1OEN | GPO1 出力有効化。 0 = 出力無効(Hi-Z)(デフォルト)。 1 = 出力有効。 |
2.2 パラメータ
2.2.1 GPO3OEN(GPO3 Output Enable)
目的
れぞれ対応するGPOピンの出力バッファを有効化し、デジタル出力(High/Low)として使える状態にするか、あるいは入出力回路を切り離す(Hi-Z化する)かを指定します。
解説
1(有効): 各ピンをデジタル出力モードに設定します。このモードに切り替えた後、0x81(GPIO_SET)コマンド を送ることで、それぞれのピンを物理的に High(電源電圧)または Low(GND)レベルへ直接駆動できるようになります。
0(無効・デフォルト): 各ピンをHi-Z(ハイ・インピーダンス)状態にします。
外部回路から電気的に見えない状態になるため、ピンを他の兼用機能(割込み通知や外部クロック入力など)として安全に使用する、あるいは未使用ピンの無駄な電力消費を抑える目的で使用します。
0(無効・デフォルト): 各ピンをHi-Z(ハイ・インピーダンス)状態にします。
外部回路から電気的に見えない状態になるため、ピンを他の兼用機能(割込み通知や外部クロック入力など)として安全に使用する、あるいは未使用ピンの無駄な電力消費を抑える目的で使用します。
2.2.2 GPO2OEN(GPO2 Output Enable)
目的
れぞれ対応するGPOピンの出力バッファを有効化し、デジタル出力(High/Low)として使える状態にするか、あるいは入出力回路を切り離す(Hi-Z化する)かを指定します。
解説
1(有効): 各ピンをデジタル出力モードに設定します。このモードに切り替えた後、0x81(GPIO_SET)コマンド を送ることで、それぞれのピンを物理的に High(電源電圧)または Low(GND)レベルへ直接駆動できるようになります。
0(無効・デフォルト): 各ピンをHi-Z(ハイ・インピーダンス)状態にします。
外部回路から電気的に見えない状態になるため、ピンを他の兼用機能(割込み通知や外部クロック入力など)として安全に使用する、あるいは未使用ピンの無駄な電力消費を抑える目的で使用します。
0(無効・デフォルト): 各ピンをHi-Z(ハイ・インピーダンス)状態にします。
外部回路から電気的に見えない状態になるため、ピンを他の兼用機能(割込み通知や外部クロック入力など)として安全に使用する、あるいは未使用ピンの無駄な電力消費を抑える目的で使用します。
2.2.3 GPO1OEN(GPO1 Output Enable)
目的
れぞれ対応するGPOピンの出力バッファを有効化し、デジタル出力(High/Low)として使える状態にするか、あるいは入出力回路を切り離す(Hi-Z化する)かを指定します。
解説
1(有効): 各ピンをデジタル出力モードに設定します。このモードに切り替えた後、0x81(GPIO_SET)コマンド を送ることで、それぞれのピンを物理的に High(電源電圧)または Low(GND)レベルへ直接駆動できるようになります。
0(無効・デフォルト): 各ピンをHi-Z(ハイ・インピーダンス)状態にします。
外部回路から電気的に見えない状態になるため、ピンを他の兼用機能(割込み通知や外部クロック入力など)として安全に使用する、あるいは未使用ピンの無駄な電力消費を抑える目的で使用します。
0(無効・デフォルト): 各ピンをHi-Z(ハイ・インピーダンス)状態にします。
外部回路から電気的に見えない状態になるため、ピンを他の兼用機能(割込み通知や外部クロック入力など)として安全に使用する、あるいは未使用ピンの無駄な電力消費を抑える目的で使用します。
3 応答パラメータ
3.1 パラメータリスト
| Bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| STATUS | CTS | ERR | X | X | X | RDSINT | XASQINT | STCINT |
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 RDSINT(Radio Data System Interrupt)
目的:
RDS(文字情報などのデータ放送)のデータバッファ(FIFO)に新しいデータが格納されたことを通知する。
解説:
FM放送などで送られてくる「RDS/RBDSデータ(番組名や楽曲情報など)」を受信した際に1になります。
ホストMCUはこのビットを見てからデータを読み出す(FM_RDS_STATUS コマンドを発行する)ことで、無駄な空読みを防ぎ効率的にテキストデータを取得できます。
ホストMCUはこのビットを見てからデータを読み出す(FM_RDS_STATUS コマンドを発行する)ことで、無駄な空読みを防ぎ効率的にテキストデータを取得できます。
3.2.4 ASQINT(Audio Signal Quality Interrupt Flag)
目的:
受信中の音声信号の品質(過度な無音状態や、デジタル音声のバッファエラーなど)に、あらかじめ設定した変化が起きたことをマイコン側に知らせます。
解説:
1 の場合:音声の品質(Audio Signal Quality)に関連するイベントがIC内部で発生し、割込みがトリガーされたことを意味します。
例えば、放送が始まって無音状態から復帰したとき、逆に無音状態(サイレンス検出)が一定時間続いたときなどにこのフラグが 1 に跳ね上がります。
マイコン側はこれを確認したら、詳細を調べるために 0x65(AUX_ASQ_STATUS) などの確認コマンドを発行します。
例えば、放送が始まって無音状態から復帰したとき、逆に無音状態(サイレンス検出)が一定時間続いたときなどにこのフラグが 1 に跳ね上がります。
マイコン側はこれを確認したら、詳細を調べるために 0x65(AUX_ASQ_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) の見解
Si4735のGPIO制御(0x80)と音声品質監視(ASQINT)の仕様を読み解き、さらに一歩進んだ賢いハードウェア設計を行うためのGeminiからの提案です。
4.1.1 GPOピンを活用した、周辺パーツの省電力・ミュート制御
せっかくIC側に余っているGPOピンがあるなら、これを出力モード(0x80 で 1)にして、ラジオの外側にある周辺回路のコントロールに流用するのがスマートです。
Geminiからの提案: 例えば、GPO1ピンを外部オーディオアンプICの「シャットダウンピン(SD)」や「ミュートピン(MUTE)」に直結します。
マイコンのGPIOが足りない時でも、Si4735の 0x80 と 0x81 コマンドを介して、選局中のポップノイズが発生する瞬間だけ外部アンプを完全にハードウェアミュートさせたり、 スリープ時にアンプの電源を連動して落としたりするエコなシステムが、スマートに最小配線で実現できます。
Geminiからの提案: 例えば、GPO1ピンを外部オーディオアンプICの「シャットダウンピン(SD)」や「ミュートピン(MUTE)」に直結します。
マイコンのGPIOが足りない時でも、Si4735の 0x80 と 0x81 コマンドを介して、選局中のポップノイズが発生する瞬間だけ外部アンプを完全にハードウェアミュートさせたり、 スリープ時にアンプの電源を連動して落としたりするエコなシステムが、スマートに最小配線で実現できます。
4.1.2 「ASQINT」を使ったスマートな自動電源OFF / 放送自動記録
AM/FM/SWなどの電波状態だけでなく、「音そのものが鳴っているか(無音かどうか)」をICが勝手に監視してくれるのが ASQINT の強みです。
応用展開案: 事前に音声品質プロパティで「サイレンス(無音)検出」を設定しておきます。深夜の放送終了(停波によりピーという一報のあと無音になる、または完全な砂嵐ノイズになる)をICが音声レベルで検知すると、ASQINT が 1 になります。
これをトリガーにして、マイコン側が「放送が終了した」と100%正確に判断し、システムの主電源を落とす、あるいはSDカード等への自動録音を停止させる、といった『音声連動型のインテリジェント制御』を組むことができます。
応用展開案: 事前に音声品質プロパティで「サイレンス(無音)検出」を設定しておきます。深夜の放送終了(停波によりピーという一報のあと無音になる、または完全な砂嵐ノイズになる)をICが音声レベルで検知すると、ASQINT が 1 になります。
これをトリガーにして、マイコン側が「放送が終了した」と100%正確に判断し、システムの主電源を落とす、あるいはSDカード等への自動録音を停止させる、といった『音声連動型のインテリジェント制御』を組むことができます。
4.1.3 まとめ
0x80(GPIO_CTL) は、チップ外部のピンの役割を定義するコマンドであり、兼用ピンの競合さえ気をつければ非常に便利なデジタル出力として活用できます。
また、応答に含まれる ASQINT は、音の有無や品質の変化を省電力でマイコンに通知するための優れた窓口です。
また、応答に含まれる ASQINT は、音の有無や品質の変化を省電力でマイコンに通知するための優れた窓口です。
4.2 Google AI (Gemini) の回答
4.2.1 「モード」は何種類あるか
質問
見解
「このコマンドは、電源投入モードのときのみ送信できます。」と記載がありますが、モードは何種類ありますか?
見解
Si4735の内部状態(動作モード)は、大きく分けて4種類あります。
したがって、実用上のモードは「パワーダウン」「パワーアップ(通常動作)」「ブートローダー(パッチ用)」の3つ(+特殊モード1つ)と覚えておくのが最も正確です
| No | モード名 | 概要・チップの状態 |
|---|---|---|
| 1 | パワーダウン・モード (Powerdown Mode) | チップが休止(スリープ)している最小消費電力の状態です。 I2C通信は受け付けますが、基本コマンド(0x01: POWER_UP)以外のほとんどのコマンドは受け付けず、送信しても拒否されるか無視されます。 |
| 2 | パワーアップ・モード (Powerup Mode) | 0x01 コマンドが成功し、チップが「ラジオ受信機」として完全に覚醒したメインの動作状態です。 ご質問の「電源投入モード」とはこの状態を指します。 さらに内部で「FM受信モード」「AM/SW/LW受信モード」などに分岐します。 |
| 3 | ブートローダー・モード (Bootloader Mode) | パッチコード(SSB受信用の拡張ファームウェアなど)をマイコンからSi4735の内部RAMへ流し込むための専用モードです。 POWER_UP コマンドの発行時に特定の引数を指定することでこのモードに入ります。 |
| 4 | アナログ・フラッシュ・モード (Analog Flash Mode) | チップ内部の不揮発性メモリ(NVRAM)に対して、特定のパラメータや校正データを書き込んだり検証したりするための工場出荷・評価用の特殊モードです。 通常の自作・組み込み設計でユーザーが明示的に使うことはほぼありません。 |
4.2.2 このコマンドで設定した場合に影響を受けるもの
質問
見解
このコマンドで設定した場合に影響を受けるもの(例えば I2Cのなにが とか どんな割り込み信号にどんな影響が出るとか)は何ですか?
見解
前述の 0x80(GPIO_CTL) コマンドで、GPO1、GPO2、GPO3の各ピンを出力イネーブル(1)に設定した場合、システム全体(I2Cや割込み信号)にどのような具体的影響が出るかを整理しました。
物理割込み信号(nINT)への致命的な影響(GPO2を 1 にした場合)
外部基準クロック(RCLK/DCLK)への影響(GPO3を 1 にした場合)
I2Cバスへの影響(通信エラーの発生リスク)
物理割込み信号(nINT)への致命的な影響(GPO2を 1 にした場合)
起きる現象: Si4735からマイコンへ「選局が終わった」「電波が変わった」と知らせるための物理割込み信号(IRQ機能)が完全に喪失します。
詳細なメカニズム: GPO2 ピンは、出荷時のデフォルト(および通常の実装)では、IC内部の割込みコントローラに直結された「オープンドレインの割込み出力ピン(nINT)」として機能しています。
しかし、0x80 で GPO2OEN = 1 にすると、このピンが「マイコンから任意のHigh/Lowを出力させるだけの、ただの汎用デジタル出力ピン」に強制上書きされます。
実務への影響: マイコン側が割込みピン(外部割込みエッジトリガなど)を使ったプログラム(非同期処理)で組まれている場合、二度と割込みが発生しなくなるため、マイコン側がフリーズするか、電波状態の変化を検知できなくなります。
詳細なメカニズム: GPO2 ピンは、出荷時のデフォルト(および通常の実装)では、IC内部の割込みコントローラに直結された「オープンドレインの割込み出力ピン(nINT)」として機能しています。
しかし、0x80 で GPO2OEN = 1 にすると、このピンが「マイコンから任意のHigh/Lowを出力させるだけの、ただの汎用デジタル出力ピン」に強制上書きされます。
実務への影響: マイコン側が割込みピン(外部割込みエッジトリガなど)を使ったプログラム(非同期処理)で組まれている場合、二度と割込みが発生しなくなるため、マイコン側がフリーズするか、電波状態の変化を検知できなくなります。
外部基準クロック(RCLK/DCLK)への影響(GPO3を 1 にした場合)
起きる現象: 受信周波数の基準となるクロックの同期が外れ、一切のラジオ受信(同調)ができなくなるか、音が出なくなります。
詳細なメカニズム: GPO3 ピンは、回路設計によっては「外部の正確な水晶発振器(32.768kHzなど)からデジタルクロックを入力するピン(DCLK)」として兼用されます。
これを強引に出力モード(GPO3OEN = 1)に変えると、ピンの内部回路が「入力」から「出力」へ反転します。
実務への影響: 外部の発振器(クロックを出力している部品)と、出力モードになったSi4735のGPO3ピンが物理的に衝突(バックドライブ状態)を起こします。
これにより、異常な大電流が流れてチップが発熱したり、クロック信号の波形が完全に潰れてIC内部のDSPが停止(フリーズ)します。
詳細なメカニズム: GPO3 ピンは、回路設計によっては「外部の正確な水晶発振器(32.768kHzなど)からデジタルクロックを入力するピン(DCLK)」として兼用されます。
これを強引に出力モード(GPO3OEN = 1)に変えると、ピンの内部回路が「入力」から「出力」へ反転します。
実務への影響: 外部の発振器(クロックを出力している部品)と、出力モードになったSi4735のGPO3ピンが物理的に衝突(バックドライブ状態)を起こします。
これにより、異常な大電流が流れてチップが発熱したり、クロック信号の波形が完全に潰れてIC内部のDSPが停止(フリーズ)します。
I2Cバスへの影響(通信エラーの発生リスク)
起きる現象: 0x80 コマンド自体の送信や、その後の 0x81 などの通信中に、I2Cのデータ線(SDA)やクロック線(SCL)にデジタルノイズが回り込み、通信エラー(ACK返答なしやデータ化け)の原因になることがあります。
詳細なメカニズム: GPO1〜GPO3 ピンを 1 にして大きな電流(数mA程度)を外部のLEDやアンプの制御線に対して急激にON/OFF駆動させると、Si4735の内部電源ライン(VDD/GND)に一瞬の電圧ドロップ(ノイズ)が発生します。
I2Cピンは非常にデリケートなため、このノイズを拾って通信ビットがズレることがあります。
対策: GPOピンを出力として駆動させる場合は、基板上でI2Cの配線とGPOの配線を物理的に離すか、GPOピンの直後に小さな抵抗(100Ω程度)を挟んで急激な電流変化を抑える回路設計が必要です。
詳細なメカニズム: GPO1〜GPO3 ピンを 1 にして大きな電流(数mA程度)を外部のLEDやアンプの制御線に対して急激にON/OFF駆動させると、Si4735の内部電源ライン(VDD/GND)に一瞬の電圧ドロップ(ノイズ)が発生します。
I2Cピンは非常にデリケートなため、このノイズを拾って通信ビットがズレることがあります。
対策: GPOピンを出力として駆動させる場合は、基板上でI2Cの配線とGPOの配線を物理的に離すか、GPOピンの直後に小さな抵抗(100Ω程度)を挟んで急激な電流変化を抑える回路設計が必要です。
4.2.3 GPOの読み出しコマンド
質問
見解
GPO3, GPO2, GPO1 の設定状態を読むコマンドはありますか
見解
結論から申し上げますと、Si4735には「GPO3, GPO2, GPO1 の設定状態(出力許可しているか、現在HighかLowか)を直接読み出す専用の独立コマンド」は存在しません。
Si4735の制御設計において、なぜ読み出しコマンドがないのか、そして状態を知りたい場合にファームウェア(マイコン)側でどのように対処すべきかを解説します。
1. なぜ読み出しコマンドがないのか?
2. 現在の設定状態を把握するための「確実な実装方法」
3. Google AI (Gemini) の見解・一歩踏み込んだトラブルの罠
まとめ
Si4735の制御設計において、なぜ読み出しコマンドがないのか、そして状態を知りたい場合にファームウェア(マイコン)側でどのように対処すべきかを解説します。
1. なぜ読み出しコマンドがないのか?
Silicon Labsの公式プログラミングガイド(AN332)において、GPIO(GPO)関連のコマンドは以下の2つしか定義されていません。
(1)0x80 (GPIO_CTL) : 出力かHi-Z(入力待ち)かを「設定する」
(2)0x81 (GPIO_SET) : 出力レベルをHighかLowに「設定する」
これらは完全に「ライトオンリー(書き込み専用)」のコマンドであり、他の受信系ステータスコマンド(0x42 や 0x43)のようにIC内部のレジスタ値を応答(レスポンス)としてマイコン側に送り返してくれる仕組みが用意されていません。
(1)0x80 (GPIO_CTL) : 出力かHi-Z(入力待ち)かを「設定する」
(2)0x81 (GPIO_SET) : 出力レベルをHighかLowに「設定する」
これらは完全に「ライトオンリー(書き込み専用)」のコマンドであり、他の受信系ステータスコマンド(0x42 や 0x43)のようにIC内部のレジスタ値を応答(レスポンス)としてマイコン側に送り返してくれる仕組みが用意されていません。
2. 現在の設定状態を把握するための「確実な実装方法」
コマンドによる読み出しができないため、実際の開発ではマイコン(ホスト)側のファームウェア内で状態を管理(シャドウイング)するのが定石です。
具体的なコード設計(C言語などの例)
マイコン内のグローバル変数や構造体として、現在のGPOの状態を記憶しておく変数を用意します。
このように実装しておけば、プログラムの他の場所で「いまGPOピンはどういう設定だっけ?」と確認したくなった際、Si4735に通信を飛ばさずとも、マイコン内の Si4735_GPO_Status という変数を読み取るだけでいつでも確実に現在の状態を把握できます。
具体的なコード設計(C言語などの例)
マイコン内のグローバル変数や構造体として、現在のGPOの状態を記憶しておく変数を用意します。
このように実装しておけば、プログラムの他の場所で「いまGPOピンはどういう設定だっけ?」と確認したくなった際、Si4735に通信を飛ばさずとも、マイコン内の Si4735_GPO_Status という変数を読み取るだけでいつでも確実に現在の状態を把握できます。
3. Google AI (Gemini) の見解・一歩踏み込んだトラブルの罠
この「読み出しコマンドがない」仕様と、前述の「起動時の罠」が絡み合った、設計時に絶対に注意すべきGeminiからの高度なアドバイスです。
「パワーダウンモード(Powerdown)」へ移行した際のリセットバグに注意マイコン側の変数(シャドウレジスタ)で状態を完全に管理している場合でも、盲点があります。
ラジオを一時的にスリープさせようと 0x11(POWER_DOWN)コマンド を送信すると、Si4735は初期化され、0x80 や 0x81 で設定した内容はすべて消去されて強制的にデフォルト(Hi-Z、割込みピンモード)へと戻ります。
もしマイコン側の変数をリセットし忘れていると、「マイコンはGPO1を出力(1)にしているつもりなのに、IC側はリセットされてHi-Z(0)になっている」という設定の不一致(乖離)が発生します。
パワーダウンコマンドを送る際、またはパワーアップ(0x01)を再度行う際は、必ずマイコン側の状態管理変数も同時に初期化(クリア)するロジックを忘れないでください。
物理的なピンの状態をマイコン側で直接「逆探知」する裏ワザどうしても「本当にGPOピンがHighになっているか(あるいは外部回路のせいでLowに潰されていないか)」をチェックしたい場合、 Si4735のコマンドに頼るのではなく、「マイコン側の余っているデジタル入力ピン(GPIO)を、Si4735のGPOピンに並列で1本繋いでおく」という物理的なアプローチが有効です。
マイコン側からそのピンを digitalRead() すれば、Si4735の外部に出力されている生の電圧レベル(High/Low)を100%確実に確認・デバッグすることができます。
「パワーダウンモード(Powerdown)」へ移行した際のリセットバグに注意マイコン側の変数(シャドウレジスタ)で状態を完全に管理している場合でも、盲点があります。
ラジオを一時的にスリープさせようと 0x11(POWER_DOWN)コマンド を送信すると、Si4735は初期化され、0x80 や 0x81 で設定した内容はすべて消去されて強制的にデフォルト(Hi-Z、割込みピンモード)へと戻ります。
もしマイコン側の変数をリセットし忘れていると、「マイコンはGPO1を出力(1)にしているつもりなのに、IC側はリセットされてHi-Z(0)になっている」という設定の不一致(乖離)が発生します。
パワーダウンコマンドを送る際、またはパワーアップ(0x01)を再度行う際は、必ずマイコン側の状態管理変数も同時に初期化(クリア)するロジックを忘れないでください。
物理的なピンの状態をマイコン側で直接「逆探知」する裏ワザどうしても「本当にGPOピンがHighになっているか(あるいは外部回路のせいでLowに潰されていないか)」をチェックしたい場合、 Si4735のコマンドに頼るのではなく、「マイコン側の余っているデジタル入力ピン(GPIO)を、Si4735のGPOピンに並列で1本繋いでおく」という物理的なアプローチが有効です。
マイコン側からそのピンを digitalRead() すれば、Si4735の外部に出力されている生の電圧レベル(High/Low)を100%確実に確認・デバッグすることができます。
まとめ
Si4735の 0x80 / 0x81 は、ICから状態を教えてもらうことができない「一方通行の設定コマンド」です。
そのため、設計時は必ずマイコン側のソフトウェア(変数)に状態を覚えさせておくアプローチを採用してください。
そのため、設計時は必ずマイコン側のソフトウェア(変数)に状態を覚えさせておくアプローチを採用してください。
4.2.4 まとめ(実装時の黄金律)
見解
0x80 コマンドで設定を変える際は、以下の鉄則を守ってください。
GPO2(割込みピン)は絶対に 0x80 で 1 にしない(マイコンへの通知機能が壊れるため)。
GPO3に外部クロックを入れている場合は、絶対に 1 にしない(チップが故障・停止するため)。
使っていいのは、完全にフリー(どこにも繋がっていない、または独立したLED等に繋がっている)なピンだけにする。
GPO2(割込みピン)は絶対に 0x80 で 1 にしない(マイコンへの通知機能が壊れるため)。
GPO3に外部クロックを入れている場合は、絶対に 1 にしない(チップが故障・停止するため)。
使っていいのは、完全にフリー(どこにも繋がっていない、または独立したLED等に繋がっている)なピンだけにする。
4.3 GPIO_ピンのまとめ一覧
| ピン名 | デフォルトの役割 / 兼用の機能 | 0x80 で 1(出力許可)にした時の挙動と影響 | 安全な使い道(応用例) |
|---|---|---|---|
| GOO3 | DCLK(デジタルクロック入力)※外部から32.768kHzなどの基準クロックを入れるピン。 | 【危険】 外部クロック発振器と信号が衝突(バックドライブ)し、発熱やDSP停止(受信不可)を引き起こします。 | 内部発振(クリスタル接続)を使用しており、GPO3が完全に空きピンの場合のみ、ステータスLED等の駆動に使用可能。 |
| GPO2 | nINT(物理割込み出力)※選局完了(STC)などをマイコンに知らせる(Lowに落ちる)最重要ピン | 【機能喪失】 割込み信号が出なくなり、マイコン側が「割込み検知モード」で組まれている場合はシステムがフリーズします。 | マイコン側が割込みピンを使わず、I2C通信のみで状態を監視する「完全ポーリング方式」の場合のみ、自由な出力ピンとして流用可能。 |
| GPO1 | 空きピン / 汎用出力※起動時のバスモード選択(I2CかSPIか)で使われるが、起動後はフリー。 | 【安全】 システムの基本動作(クロックや割込み)を破壊するリスクが最も低く、一番自由に使えるピンです。 | 外部オーディオアンプのシャットダウン(省電力)制御や、ミュート回路のON/OFFスイッチ。 |
0x80(GPIO_CTL) コマンドのデータ構造(引数バイト)は、ビットの並び順が GPO3 ➔ GPO2 ➔ GPO1 の順になっています。
GPO1 だけを出力にしたい場合(推奨):引数に 0x02(GPO1OENのみ1)を送信します。
GPO2 も出力にしたい場合(ポーリング駆動時のみ):引数に 0x04(GPO2OENのみ1)を送信します。
GPO1 だけを出力にしたい場合(推奨):引数に 0x02(GPO1OENのみ1)を送信します。
GPO2 も出力にしたい場合(ポーリング駆動時のみ):引数に 0x04(GPO2OENのみ1)を送信します。
