Hobby Lab 趣味のモノ作り実験のサイトです。
部品 オペアンプ_関係 Si4735 マニュアル 0x01
1 0x01 POWER_UP 概要
2 コマンドパラメータ
2.1 パラメータリスト
2.2 パラメータ
2.2.1 CTSIEN
2.2.2 GPO2OEN
2.2.3 PATCH
2.2.4 XOSCEN
2.2.5 FUNC
2.2.6 OPMODE
3 応答パラメータ
3.1 パラメータリスト
3.1.1 FUNC = 0,1の場合
3.1.2 FUNC = 15の場合
3.2 パラメータ
3.2.1 CTS
3.2.2 ERR
3.2.3 RSQINT
3.2.4 RDSINT
3.2.5 STCINT
3.2.6 PN
3.2.7 FWMAJOR
3.2.8 FWMINOR
3.2.9 CHIPREV
3.2.10 LIBRARYID
3.2.11 制御フロー
4 その他(Gemini)の見解
4.1 コマンドのステップ注意事項
4.1.1 CTSの厳格な極性チェック
4.1.2 クロック設定の不整合
4.1.3 機能切り替え時の原則
4.2 もう少し踏み込んだ応用展開
4.2.1 SSBパッチ適用
4.2.2 オーディオ出力の切り替え
4.3 デバッグ時のチェックリスト
4.4 その他
4.4.1 メモリ消費に対する見解
4.4.2 抽象化ライブラリの推奨
4.5 疑問にお答え
4.5.1 FM->SSB切り替え方法

PrO:Si4735関係  Si4735について
 Si4735ラジオを作って見よう1
 v コマンド & パラメータ辞書 v
 0x01. POWER_UP
 0x10. GET_REV
 0x11. POWER_DOWN
 0x12. SET_PROPERTY
 0x13. GET_PROPERTY
 0x14. GET_INT_STATUS
 0x20. FM_TUNE_FREQ
 0x21. FM_SEEK_START
 0x22. FM_TUNE_STATUS
 0x23. FM_RSQ_STATUS
 0x24. FM_RDS_STATUS
 0x27. FM_AGC_STATUS
 0x28. FM_AGC_OVERRIDE
 0x40. AM_TUNE_FREQ
 0x41. AM_SEEK_START
 0x42. AM_TUNE_STATUS
 0x43. AM_RSQ_STATUS
 0x47. AM_AGC_STATUS
 0x48. AM_AGC_OVERRIDE
 0x80. GPIO_CTL
 0x81. GPIO_SET

Pr:OPAMP オペアンプ関係
PrO:送受信機  Si4735
PrO:オペアンプ  LM324
 LM358
Pr:Prプロセッサ関係
PrP:プロセッサ
動作比較
 STM32F動作比較
 CH32V203&STM32F 動作比較
 arduino動作比較
raspberrypi関係
 RaspberryPiハード
CH32V関係
 -CH32V開始
 -203K8T6(32Pin)開始
 -203C8T6(48P)開始
 -003J4M6(8Pin)開始
 -003F4P6(20Pin)開始
 -Moun River StudioⅡ
 プログラミング!
  203_GPIO関係
  203_TIME関係
  203_TIME Encoder
  203_I2C関係
  203_1-Wire関係
  003_DS18B20テスター
  USART(UART)関係
  DS18B20をModBus制御
 -マニュアル
 203データシート
 203取説
  MBA メモリとバス方式
  PWR 電力制御
  RCC リセット・拡張・クロック
  BKP バックアップレジスタ
  CRC 巡回冗長検査
  RTC リアルタイムクロック
  GPIO GPIOと代替機能
  DMA ダイレクトメモリアクセス制御
  ADTM 高度な制御タイマー
  GPTM 汎用タイマー
  BCTM 基本タイマー
  USART 同期非同期通信
arduino関係
 ESP12関係
 (a)ESP-8266D1mini注意
PrP:その他  RS485ドライバー
 CP2102 BRIDGE
 WCH-LinkEエミュレーター
Pr:Wire 電線関係
Pr:Resistance 抵抗
Pr:Capacitor コンデンサ
Pr:Coil コイル
Pr:PassiveElmt 受動素子
Pr:Diode ダイオード関係
Pr:Tr トランジスタ関係
2SC1815
 リレードライバー設計
 アンプ設計
 発振器
TLP152
 TLP152テスト
TLP2361
 TLP2361テスト
TLP5754
 TLP5754テスト
Pr:Source 電源関係  ツェナーダイオード
 TL431
 LM317
PrS:Downモジュール
 EGS002_IR2110S
 SKU011012
 ACDC02
 XH_M299
 LM2596
 Mini360_MP23070N
 DROK
 WH140
PrS:UPモジュール
 MT3608
PrS:充電モジュール
 TP4056
Pr:Sensor_AD_時計等
PrS:電圧、電流
ADS1115 16bit4CH I2C A/D
 Hardware
 RaspberryPi_コマンド接続
 RaspberryPi_Python
 Arduino
 CH23V203 MounRiverStudioⅡ
INA226 I2C 直流電圧電流
 Hardware
 Arduino
 RaspberryPi_Python
WCS 電流ホール素子
 Hardware
PrS:温度、気圧、湿度、照度
BNE280 I2C 気圧,湿度,気温
 Hardware
 Arduino
 RaspberryPi_Python
BH1750 I2C 照度
 Hardware
 Arduino
 RaspberryPi_Python
DS18B20 1-Wire 温度計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:時間、日時
DS3231 I2C 時計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:表示器
MAR3953 320X480 3.95"
 概要と線や点を描く
 フォントを描く
SSD1306 I2C 0.96"OLED
 Hardware
 Arduino
 RaspberryPi_Python
Pr:Old Processor他
Ot:Others その他
この辞書は、Skyworks (Silicon Labs) Si47XX PROGRAMMING GUIDE AN332 を基に、Google AI (Gemini) の協力を得て作成しています。

1 コマンド 0x01. POWER_UP 概要

デバイスをパワーダウンモードからパワーアップモードに移行させるためのブートプロセスを開始します。
ブートは、デバイス内部メモリから、またはシステムコントローラからダウンロードしたパッチから実行できます。
パッチがデバイス内部ライブラリのリビジョンと互換性があることを確認するには、FUNC = 15 (ライブラリID照会) を指定して POWER_UP コマンドを発行し、ライブラリのリビジョンを確認する必要があります。

デバイスはライブラリのリビジョンを含む応答を返し、その後、パワーダウンモードに移行します。
その後、FUNC = 0 (FM受信) を指定して POWER_UP コマンドを発行することで、デバイスをパワーアップモードにすることができ、パッチを適用できます (132 ページの「7.2. コンポーネントパッチからのパワーアップ」を参照)。

POWER_UP コマンドは、アナログオーディオモード用に ROUT (ピン 13、Si4732 ピン 16) と LOUT (ピン 14、Si4732 ピン 1) の状態を、割り込み動作用に GPO2/INT (ピン 18、Si4732 ピン 3) の状態を設定します。

Si4705/31/32/35の場合、POWER_UPコマンドは、デジタルオーディオモード用に
GPO3/DCLK(ピン17、Si4732ピン2)、
DFS(ピン16、Si4732ピン1)、
およびDOUT(ピン15、Si4732ピン16)の状態も設定します。
このコマンドは、GPO2/INT割り込み(GPO2OEN)とCTS割り込み(CTSIEN)を設定します。
両方が有効になっている場合、GPO2/INTは通常動作中はハイレベル、割り込み中は最低1μsの間ローレベルになります。

CTSIENビットはGPO_IENプロパティにも反映されます。
CTSビット(およびオプションの割り込み)が設定されると、コマンドは完了します。

注:機能を変更する場合(例:FM受信からAM受信へ)、POWER_DOWNコマンドを発行して現在の機能を停止し、次にPOWER_UPコマンドを発行して新しい機能を開始します。

注:XOSCENが設定され、水晶発振器がRCLKとして使用されている場合は、電源投入コマンドと最初のチューニングコマンドの間に少なくとも500msの遅延を設けて、発振器が安定するまで待機してください。

対応機種:全機種
コマンド引数:2個
応答バイト数:なし(FUNC = 0)、7バイト(FUNC = 15)




2 コマンドパラメータ

2.1 パラメータリスト

BitD7D6D5D4D3D2D1D0
CMD00000001
ARG1CTSIENGPO2OENPATCHXOSCENFUNC
ARG2OPMODE

ARGBitNameFunction
17CTSIENCTS割り込み有効化
0 = CTS割り込み無効
1 = CTS割り込み有効
16GPO2OENGPO2出力有効化
0 = GPO2出力無効
1 = GPO2出力有効
15PATCHパッチ適用を有効にする。
0 = 通常起動。
1 = NVMをRAMにコピーするが、起動はしない。CTS設定後、RAMにパッチを適用できる。
14XOSCEN水晶発振器の有効化。
0 = 外部RCLKを使用(水晶発振器は無効)。
1 = 水晶発振器を使用(外部32.768kHz水晶発振器によるRCLKおよびGPO3/DCLK、OPMODE=00000101)。
外部部品の詳細については、Si47xxデータシートのアプリケーション回路図を参照してください。
13〜0FUNC機能
0 = FM受信
1 = AM/SW/LW受信
15 = ライブラリID照会
その他 = 予約済み
27〜0OPMODEアプリケーション設定。
00000101 = アナログ音声出力 (LOUT/ROUT)

00001011 = デジタル音声出力 (DCLK、LOUT/DFS、ROUT/DIO)
(Si4704/05/21/31/35/37/39/41/43/45/84/85 FMRXコンポーネント2.0以降、XOSCEN = 0の場合)

10110000 = デジタル音声出力 (DCLK、DFS、DIO)
(Si4704/05/31/35 FMRXコンポーネント2.0以降、XOSCEN = 0の場合)

10110101 = アナログおよびデジタル音声出力 (LOUT/ROUTおよびDCLK、DFS、DIO) (Si4704/05/31 FMRXコンポーネント2.0以降、XOSCEN = 0の場合)

2.2 パラメータ

ここで使用するパラメータは6つです
CTSIEN / GPO2OEN 次のコマンド送信の準備完了を物理ピン(割り込み)で通知するか
PATCH 追加プログラム(SSB用など)を上書きするか
XOSCEN 基準となる時計に水晶振動子(クリスタル)を使うか
FUNC FMかAMか、どのラジオにするか
OPMODE 音声をアナログ(イヤホン等)で出すかデジタルで出すか

2.2.1 CTSIEN

Clear To Send Interrupt Enable の略で その中の
CTS とは、Clear To Send(送信許可)の略です。
MCU から Si4735 に対して次のコマンドを送信(書き込み)してよい状態であるかを示す、ステータスフラグおよび割り込み信号を指します。
1. CTSの役割と仕組み
Si4735は、内部の処理(周波数のチューニングやステータス更新など)にわずかな時間を要します。
処理の実行中に次のコマンドを送信してしまうと、正しく動作しません。
CTS = 0 (Busy): Si4735が内部処理を実行中、または前回のコマンドを処理中のため、次のコマンドは送信できません。<
CTS = 1 (Ready): Si4735がコマンドを受け付け可能な待機状態です。
2. CTS割り込み(CTS Interrupt)
CTSが 0 から 1 に切り替わった(コマンド送信が可能になった)タイミングを、マイコンに通知する機能です。
ポーリング(マイコンが繰り返しステータスを確認し続ける手法)を行わずに済むため、マイコン側の処理効率が向上し、省電力化につながります。
割り込みが発生したら、マイコンはSi4735へ新しいコマンドを送信できます。
この割り込み条件は、Si4735の「Interrupt Status」プロパティを構成するビット(CTSIEN)で制御されます。
3. コマンド発行時の確認手順
CTS割り込みを使用しない場合でも、コマンドを発行する際は必ず以下の手順を踏む必要があります。
Si4735へコマンド(引数を含む)を送信する。Si4735から返されるレスポンスの「ステータスバイト」を読み込む。
ステータスバイト内のCTSビット(通常はビット7)が 1 になるまで待機する。
4.機能の有効化(マスターマスタースイッチ)
Si4735の起動時(POWER_UP 時)に、このビットを 1 に設定することで、チップに対して以下のように命令します。
CTSIEN = 1: 「今後、次のコマンドが受付可能(CTS=1)になったら、GPO2/INTピンをLOW(またはHIGH)にしてホストマイコンに物理信号で知らせてください」
CTSIEN = 0(デフォルト): 「次のコマンドが受付可能になっても、外部ピンへの通知(割り込み信号の発信)は不要です(ステータスレジスタのフラグが変わるだけで十分です)」
5. なぜ起動コマンド(0x01)の段階で指定するのか?
Si4735は、POWER_UP コマンドを受け取った直後から内部で複雑な起動・初期化プロセス(ブート処理)を開始します。
この起動処理には数ミリ秒〜数十ミリ秒という、チップにとっては非常に長い時間がかかります。

起動処理が「完了した瞬間」をホストマイコンが最速で検知できるように、最初の起動命令を出すタイミング(0x01)で、あらかじめ割り込み通知のオン/オフを設定しておく必要があるためです。
6. ステータス応答との関係性
関係性を整理すると以下のようになります。
(1)コマンド0x01で送信 [MCU → Si4735]
「起動せよ。あと、準備ができたらGPO2ピンで割り込み通知(CTSIEN=1)をしてね」と設定。
(2)起動処理中 [Si4735の内部]
チップが一生懸命起動処理を動かします。この間、ステータスは CTS=0(まだ次のコマンドは送るな)です。
(3)準備完了 [Si4735 → MCU]
起動が完了すると、チップの内部ステータスが CTS=1 に変化します。
この時、最初に ① で CTSIEN=1 と設定していたため、GPO2ピンの電圧が変化してホストマイコンに物理的な割り込みが入ります。
(4)ステータス読出し [MCU ← Si4735]
割り込みを検知したマイコンがステータスを読み出すと、応答バイトの中に CTS=1(準備完了)、CTSIEN=1(割り込み有効化中)が返ってきます。
もしホストマイコン側でGPO2ピンを割り込み(INT)ピンとして接続しておらず、単に「I2C/SPI通信でステータスバイトをループ(ポーリング)で読みにいく」という制御方法をとる場合は、コマンド0x01の CTSIEN は 0(無効) のままで問題ありません。
GPO2ピンを使ってマイコンの外部割り込みハンドラを動かしたい場合のみ、ここを 1 に設定してください。 詳細なコマンド体系やステータスレジスタの仕様については、SiLabsの公式ドキュメント(AN332:Si47xx Programming Guide)を参照してください。

2.2.2 GPO2OEN

GPO2 Output Enable の略です
コマンド0x01(POWER_UP)の引数にある GPO2OEN(GPO2 Output Enable) の目的は、「GPO2ピンを、単なる汎用入力ピン(Hi-Z状態)から、物理信号を出力できる出力ピンに切り替えること」です。
Si4735のGPO2ピンは、電源投入直後は入力(ハイインピーダンス)状態になっています。
このビットを 1 に設定することで初めて、ピンの出力バッファが有効(Enable)になります。
1.主な目的と役割
この設定を行う最大の目的は、GPO2ピンをホストマイコンへの「割り込み通知ピン(INT)」として機能させることです。
GPO2OEN = 1(出力有効): ピンの出力機能がオンになります。
これにより、先述の CTSIEN(CTS割り込み)や、選局完了(STC)、電波強度変化(RSQ)などの割り込みイベントが発生した際に、Si4735がピンの電圧(LOW/HIGH)を物理的に変化させてマイコンへ通知できるようになります。

GPO2OEN = 0(デフォルト/出力無効): ピンが出力されず、電気的に浮いた状態(Hi-Z)になります。
この状態では、どれだけチップ内部で割り込み(CTSIENなど)を許可しても、外部のピンには何も信号が出てきません。
2.CTSIEN と GPO2OEN の関係性
ハードウェア割り込み(物理ピンを使った通知)を正しく機能させるには、これら2つのスイッチを両方とも 1 にする必要があります。
GPO2OEN = 1:ピンの通路を開く(ハードウェアの準備)
CTSIEN = 1:その通路を使って「CTS(送信可)」のニュースを流す(イベントの許可)
Si4735 プログラミングガイド(公式仕様)によると、両方を 1 に設定した場合、通常時はGPO2ピンがHIGHにドライブされ、割り込みが発生すると最低1μsの間LOWに落とすことでマイコンへエッジ通知を行う仕組みになります。
前のステップで触れた通り、マイコン側でGPO2ピンを接続せず、I2C/SPIの通信ループ(ポーリング)だけで制御する場合は、出力する必要がないため GPO2OEN = 0 のままで構いません。逆に、マイコンのGPIO割り込み機能(attachInterrupt など)を使って、効率的にシームレスな制御を行いたい場合は、必ず GPO2OEN = 1 および CTSIEN = 1 に設定してください。

2.2.3 PATCH

Si4735における「PATCH(パッチ)」とは、チップ内部のDSP(デジタル信号処理プロセッサ)の機能を拡張・修正するために、外部から一時的に書き込む「追加プログラム(バイナリデータ)」のことです。
PCやスマホのアプリでいう「アップデートパッチ」や「修正プログラム」と全く同じ概念ですが、Si4735などのDSPラジオチップ特有のユニークな仕組みを持っています。
もし作ろうとしているラジオが通常の「FM/AM放送」を聴くだけであれば、パッチは一切不要です。単に POWER_UP して選局するだけで動作します。 1. なぜパッチが必要なのか?(最大の目的)
Si4735の内部ROM(最初から焼き付けられているプログラム)には、基本的に「FM」と「通常のAM(中波・短波)」の受信機能しか入っていません。
しかし、自作ラジオの世界で最も有名なSSB(単一側波帯:アマチュア無線などで使われる方式)や、NBFM(ナローバンドFM)を受信したい場合、元々の機能だけでは処理できません。
そこで、Silicon Labs社(または有志)が開発した「SSB受信機能を後付けする追加プログラム(パッチデータ)」をSi4735に流し込むことで、チップをSSB対応レシーバーへと変身させることができます。
2. パッチデータの仕組み
(1)揮発性のRAMに保存される:
パッチデータは、Si4735の内部にある「RAM(一時的なメモリ)」に書き込まれます。そのため、ラジオの電源を切るとパッチは消えてしまいます。
(2)起動するたびに送信する(パッチ当て):
電源を切ると消えるため、ホストマイコン(Arduinoなど)が起動するたびに、毎回 POWER_UP コマンドの後にパッチデータ(数キロバイトの16進数の塊)をI2C/SPIバス経由でSi4735に転送する必要があります。
これを「パッチを当てる」「パッチをダウンロードする」と呼びます。
3. コマンドとの関係
パッチ送信時には、通常の選局コマンドとは異なる専用のコマンド群が使われます。
 0x15 PATCH_ARGS: パッチの引数を設定するコマンド。
 0x16 PATCH_DATA: 実際のパッチデータ(バイナリ)を流し込むコマンド
4. 具体的な活用例
ArduinoでSi4735を制御する場合、世界的によく使われているpu2clr氏の「SI4735 Arduino Library」というライブラリがあります。
このライブラリには最初からSSB用のパッチデータ(patch_ssb_compressed.h など)が含まれており、関数を1行呼び出すだけでマイコンのフラッシュメモリからSi4735へ自動的にパッチを転送してくれる仕組みが整っています。

2.2.4 XOSCEN

コマンド0x01(POWER_UP)の引数(ARG1)に含まれる XOSCEN(Crystal Oscillator Enable) の目的は、「Si4735の内部水晶発振回路(オシレーター)を有効にするか、それとも外部のクロック信号を使用するか」を切り替えることです。
Si4735を正しく動作させるためには、基準となる正確な時計(基準クロック信号)が必要不可欠です。
その信号をどこから得るかを選択するスイッチが XOSCEN になります。 1. 2つの設定値とその意味
XOSCEN = 1(Use Crystal Oscillator / 水晶発振器を使用)
Si4735の RCLKピンとGNDの間に「32.768kHzの水晶振動子(クリスタル)」を接続している場合は、必ず 1 に設定します。
これにより、Si4735の内部にある発振回路が起動し、接続されたクリスタルを自力で発振させて基準クロックを作り出します。
XOSCEN = 0(外部クロック入力を使用)
マイコンや外部の専用発振器(オシレーターモジュールなど)から、RCLKピンへ直接「32.768kHzなどの四角い波形(デジタルクロック信号)」を流し込む場合は、0 に設定します。
この場合はSi4735内部の発振回路が不要になるため、オフにして消費電力を抑えます。
2.どちらに設定すべきかの判断基準
自作回路やモジュール(基板)のハードウェア設計によって決まります。
(1)市販のSi4735モジュール(青い基板など)を使っている場合
ほとんどのモジュールには、あらかじめ黒や銀色の小さな「32.768kHz 水晶振動子」がチップのすぐそばにハンダ付けされています。
この場合は、XOSCEN = 1 に設定する必要があります。
(2)自分で回路を設計し、マイコンのPWMなどでクロックを生成して供給している場合
クリスタルを省略してマイコンからRCLKピンへ信号を送っている場合は、XOSCEN = 0 に設定します。

2.2.5 FUNC

コマンド0x01(POWER_UP)の引数(ARG2)に含まれる FUNC(Function) の目的は、「Si4735を何のレシーバー(モード)として起動するかを決定すること」です
Si4735は、1つのチップでFMやAM(短波・長波含む)など、複数の異なる電波を処理できるマルチバンドラジオICです。
しかし、内部のDSP(デジタル信号処理プロセッサ)は、FM用のプログラムとAM用のプログラムを同時に動かすことができません。
そのため、起動するタイミング(POWER_UP)で「今からFMラジオとして動かすのか、それともAMラジオとして動かすのか」を明示的に指定する必要があります。
1.設定値(値の目的と割り当て)
FUNC は4ビットのデータ(FUNC[3:0])で構成されており、主に以下の値を指定して目的のモードを選びます。
FUNC = 0(FM Receive)
チップをFMラジオモードで起動します。
日本のFM放送やワイドFM、海外のFM放送を受信したい場合はここを 0 に設定します。
FUNC = 1(AM Receive)
チップをAMラジオモード(中波:MW、短波:SW、長波:LW共通)で起動します。
一般的なAMのニュース放送や、短波(SW)での海外国際放送、そしてSSBパッチを当ててアマチュア無線を聴く場合も、まずはこの 1(AMモード)を選択して起動します。
FUNC = 15(0x0F: Query Library ID)
チップの内部情報を調べるための特殊モードです。
前のステップで解説した「PATCH(パッチ)」を適用する前に、チップの正確なファームウェアのバージョン(リビジョン)を確認する目的で使用されます。
2. モードを切り替えるときの手順
ラジオの操作パネルなどでユーザーが「FM」から「AM」へバンドを切り替えた場合、プログラムは単に設定を変えるだけでは切り替えられません。
(1)動いている現在のモードを一度 POWER_DOWN(コマンド0x11) して完全に終了させる。
(2)再び POWER_UP(コマンド0x01) を発行し、FUNC の値を書き換えて(0 から 1 へ、またはその逆)再起動する。
このように、Si4735の役割を根本から切り替えるための最も重要なマスター設定が FUNC です。

2.2.6 OPMODE

コマンド0x01(POWER_UP)の引数(ARG2)に含まれる OPMODE(Output Mode) の目的は、「Si4735が処理したラジオの音声を、どの電気信号(インターフェース)の形式で外部に出力するかを決定すること」です。
Si4735はデジタル処理(DSP)で電波を音声に戻しますが、その音声を後ろに続くアンプやイヤホン、あるいは別のデジタル機器へどうやって引き渡すかをこの設定で切り替えます。
1. 設定値の種類と具体的な目的
OPMODE は1バイト(8ビット)のデータで、主に以下の値を指定して出力方法を選択します。
(1) OPMODE = 0x05(Analog Audio Output / アナログ音声出力)
目的: チップ内部のDAC(D/Aコンバーター)を有効にし、一般的な「アナログの音声信号(L/R)」を直接ピン(LOUT / ROUT)から出力する設定です。
用途: 最もスタンダードな設定です。出力ピンに直接イヤホンを接続したり、一般的なオーディオアンプIC(LM386やNJM2073など)に繋いでスピーカーを鳴らしたい場合は、必ずこの 0x05 を指定します。
(2) OPMODE = 0x0F(Digital Audio Output / デジタル音声出力)
目的: 音声データをデジタルのまま、I2S(Inter-IC Sound)などのデジタルオーディオ形式で出力する設定です。
用途: 高音質なオーディオシステムを作る場合に使用します。
外部の高性能な高級DAC(D/Aコンバーター)チップへデジタルデータのまま音声を送りたい場合や、Bluetoothオーディオ送信モジュールへデジタルで直接音声を入力したい場合などに選択します。
2. なぜ指定が必要なのか?
Si4735の内部では、アナログ出力用とデジタル出力用で、それぞれ異なる回路やピンの機能が割り当てられています。
そのため、OPMODE を使ってあらかじめ出力ルートを指定しておかないと、チップはどのピンに音声信号を流せばよいか判断できず、音が鳴らない原因になってしまいます。
自作ラジオや市販のモジュールで「アンプとスピーカーを繋いで音を鳴らす」という一般的な設計であれば、基本的には 0x05(アナログ出力) を指定しておけば間違いありません。




3 応答パラメータ

(FUNC = 1 [AM]の場合 ※は有りません)

3.1 パラメータリスト

3.1.1 FUNC = 0,1の場合

BitD7D6D5D4D3D2D1D0
STATUSCTSERRXXRSQINT※ RDSINTXSTCINT

3.1.2 FUNC = 15 の場合

BitD7D6D5D4D3D2D1D0
STATUSCTSERRXXRSQINT※ RDSINTXSTCINT
RESP1PN
RESP2FWMAJOR
RESP3FWMINOR
RESP4RESERVED
RESP5RESERVED
RESP6CHIPREV
RESP7LIBRARYID

RESPBitNameFunction
17:0PN部品番号の末尾2桁(16進数)。
27:0FWMAJORファームウェアのメジャーリビジョン(ASCII)。
37:0FWMINORファームウェアのマイナーリビジョン(ASCII)。
47:0RESERVED予約済み、様々な値。
57:0RESERVED予約済み、様々な値。
67:0CHIPREVチップリビジョン(ASCII)。
77:0LIBRARYIDライブラリのリビジョン(HEX)。

3.2 パラメータ

2種類の応答パラメータがあります。 応答の先頭パラメータ
応答(STATUSバイト)に含まれる各ビット(CTS, ERR, RSQINT, RDSINT, STCINT)は、「デバイスの現在の処理状態」や「各種割り込み(通知)の発生」をホストMCUに知らせる目的で設計されています。 STATUSバイトの信頼性:Si4735の仕様上、いくつかのコマンド送信時に返ってくるSTATUSバイトでは、CTS以外の割り込みビット(RSQINT, RDSINT, STCINTなど)がリアルタイムに更新されない場合があります。
正しい確認方法:正確な割り込みステータスを確認したい場合は、STATUSバイトを直接過信するのではなく、専用の割り込み確認コマンド(例:GET_INT_STATUS (0x14) コマンドなど)を明示的に発行して最新の状態を読み出すのが一般的なセオリーとなっています。
FUNC = 15 の RESP1〜7までのパラメータは5つ
Si4735において、0x01 (POWER_UP) コマンドを FUNC = 15(Function 15 = Query Library ID) に設定して実行した際に返される各パラメータ(PN, FWMAJOR, FWMINOR, CHIPREV, LIBRARYID)は、「ICの正確なハードウェア世代、ファームウェア(内部プログラム)のバージョン、および適用されているライブラリのID」を識別する目的で設計されています。
この特別なモードは、主にSSB(単一側波帯)対応パッチや不具合修正パッチ(ファームウェアパッチ)をIC内部のRAMに流し込む前に、そのパッチが目の前のICと互換性があるかをホストMCU側で自動判定するために利用されます。
PN : 製品の型番(0x35 = Si4735)
FWMAJOR : 内部ソフトの主バージョン('4' = ASCII文字)
FWMINOR : 内部ソフトの副バージョン('0' = ASCII文字)
CHIPREV : 物理的な回路(ダイ)の世代(0x03 など)
LIBRARYID : 内部プログラム群の統合バージョン(0x06 などの数値)
これらを正しく受信・判別できれば、チップの初期認識フェーズのプログラミングは完璧です。

3.2.1 CTS(Clear to Send)

目的:
デバイスが次のコマンドを受け付けられる状態かどうかを判定する。
解説:
最も重要なビットです。Si4735が前のコマンドの処理を完了し、「次のコマンドを送信しても安全(送信可)」になると1にセットされます。
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 コマンドを発行する)ことで、無駄な空読みを防ぎ効率的にテキストデータを取得できます。

3.2.5 STCINT(Seek/Tune Complete Interrupt)

目的:
選局(Tune)操作または自動選局(Seek)操作が完了したことを通知する。
解説:
周波数を変更するコマンド(FM_TUNE_FREQ や FM_SEEK_START など)は内部処理に時間がかかります。
デバイスが「目的の周波数への同調、または次の放送局の検知を完了した」時点でこのビットが1になります。
選局完了のタイミングを正確に把握する目的で使用します。

3.2.6 PN(Part Number)

目的:
デバイスの製品ファミリー(型番)を識別する。
解説:
チップがSi473xシリーズやその他のどの製品ファミリーに属しているかを示します。
ホストMCUが「今から制御しようとしている対象が本当に意図した製品(Si4735など)であるか」を誤認防止のためにチェックする目的で使用されます。

3.2.7 FWMAJOR(Firmware Major Revision)

目的:
チップに内蔵(ROM焼き)されているメインファームウェアの「メジャーバージョン」を識別する。
解説:
アーキテクチャの変更や機能の大幅な追加を伴う世代を表します。
パッチファイルを適用する際、「このパッチはメジャーバージョン『X』専用」といった条件分岐をホストMCU側で行うために不可欠な情報です。

3.2.8 FWMINOR(Firmware Minor Revision)

目的:
内蔵ファームウェアの「マイナーバージョン(細かな修正版)」を識別する。
解説:
メジャーバージョンの枠内における、マイナーなバグ修正や最適化の段階を示します。
特定のマイナーリビジョンでのみ発生する挙動への対策(ワークアラウンド)をプログラムに組み込む際などに参照されます。

3.2.9 CHIPREV(Chip Revision)

目的:
シリコンダイ(半導体チップそのもの)の物理的なハードウェアリビジョンを識別する。
解説:
いわゆる「チップの世代(例:B20、C40、D60など)」を特定するための値です。
同じSi4735でも、世代によってSSBパッチの対応可否や必要なパッチファイル自体が全く異なるため、どの物理チップが基板に実装されているかを正確に把握する目的で使用されます。

3.2.10 LIBRARYID(Library ID)

目的:
チップ内部に実装されている機能コンポーネント(ライブラリ)の固有IDを識別する。
解説:
FUNC = 15 を実行する最大の目的がこれです。Si4735の内部ROMには、ラジオの基本処理を行う「ライブラリ」が格納されています。
ホストMCUから送信するパッチファイルが、この内部ライブラリID(およびリビジョン)と完全に適合しているかを突き合わせ、安全にパッチを適用(パッチパワーアップ)するために利用されます。

3.2.11 制御フローにおける実際の使われ方

一般的に、Si4735でSSB受信などを有効化する(パッチを当てる)際は、以下のようなシーケンスを組みます。
1.まず POWER_UP を FUNC = 15 で呼び出す。
2.返ってきた CHIPREV や LIBRARYID を読み取る。
3.ホストMCU内のプログラムで、「このチップはD60リビジョンだから、D60用のSSBパッチを適用できる」と判断する。
4.一度デバイスをパワーダウン(またはリセット)させる。
5.改めて通常の FUNC = 1 (AM) などのモードで POWER_UP し、適合するパッチデータを順次送信する。
このように、「適合しないパッチを誤って書き込んでICがフリーズしたり、異常な動作をしたりするのを防ぐためのガード(事前確認)」として、これら5つのパラメータが重要な役割を果たしています。




4 その他

4.1 コマンドの重要ステップと注意事項(Google AI (Gemini) の見解)

POWER_UP コマンドは単に電源をONにするだけでなく、ブートプロセスの初期化やパッチの適用状態を決定します。実装時に必ず守るべき制約は以下の通りです。

4.1.1 CTS (Clear to Send) の厳格な極性チェック

コマンド発行後、ステータスバイトのCTSビットがHigh(1)になるまで、後続の引数(ARG)やコマンドを送信してはいけません。
応答を待たずに次のデータを送ると、内部マイコンがフリーズするか、設定が無視されます。

4.1.2 クロック設定(RCLK / Crystal)の不整合

ARG1 で外部参照クロック(RCLK)か、32.768kHzのクリスタル(XOSCEN)かを選択します。
基板上のハードウェア構成(水晶振動子の有無)と ARG1 のビット設定が一致していない場合、内部PLLがロックせず、POWER_UP が完了(CTSが復帰)しません。

4.1.3 機能切り替え(AM/FM/SSB)時の「必ずパワーダウン」原則

FMモードからAMモード、あるいはAMからSSBパッチモードへ機能を切り替える際、0x01コマンドを上書き発行することはできません。
一度必ず 0x11 (POWER_DOWN) を実行してデバイスを初期状態に戻してから、再度新しいモード用の引数を載せて 0x01 (POWER_UP) を実行する必要があります。

4.2 もう少し踏み込んだ応用展開(Google AI (Gemini) の見解)

0x01 コマンドの特性を理解すると、以下のような高度なレシーバー制御や機能拡張が可能になります。

4.2.1 2段階POWER_UPによるSSB(シングルサイドバンド)パッチ適用

Si4735-D60などでアマチュア無線や短波のSSB(USB/LSB)を受信する場合、ホストマイコン(Arduinoなど)からパッチRAMデータを転送する必要があります。
この際、0x01 コマンドを2回に分けて利用する特殊なシーケンスを踏みます。
1回目のPOWER_UP: PATCH ビットを「0」にして起動し、0x10 (GET_REV) コマンド等を用いてデバイスのライブラリリビジョン(内部ROMの世代)を読み取り、パッチファイルとの互換性を確認します。
パワーダウン: 一度 0x11 で落とします。
2回目のPOWER_UP: 今度は ARG1 の PATCH ビットを「1」にセットして 0x01 を送ります。これによりデバイスが「パッチ書き込み待機状態」になり、以降のパッチデータ転送(0x02 コマンドなど)を受け付けるようになります。

4.2.2 アナログ/デジタルオーディオ出力の柔軟な切り替え

ARG2 の設定により、音声出力をアナログ(LINEOUT)にするか、デジタル(I2S / 左詰 / 右詰)にするかを指定できます。
展開例: POWER_UP 時にデジタル出力を選択し、後段のBluetoothオーディオトランスミッターICや高性能な外部DACに直接I2S結合することで、ノイズのないフルデジタル・ポータブルラジオへの展開が可能です。

4.3 デバッグ時のチェックリスト(Google AI (Gemini) の見解)

万が一 0x01 コマンド後にICが応答しない(I2Cバスハング、またはCTSがLowのまま)場合の確認手順です。
チェック項目原因と対策
I2Cアドレス違いSENピンの処理(GND接続=0x11、VCC接続=0x63)がファームウェアの指定アドレスと合致しているか確認します。
リセットタイミング0x01 を送る前に、RSTピンを一定時間Lowにして完全にハードウェアリセットを完了させているか確認します。
電圧レベルSi4735は3.3V駆動です。5V系のマイコン(Arduino Unoなど)と直結している場合、レベルシフタを挟まないと起動エラーや破損の原因になります。

4.4 その他Google AI (Gemini) の見解

Si4735の制御設計において、Google AI (Gemini) は「リソース制約の激しいマイコン環境でのメモリ管理」と「PU2CLRライブラリの積極的活用」の2点を強く推奨します。

4.4.1 メモリ消費に対する見解

SSBパッチを適用する場合、数キロバイト(約8KB〜16KB)のパッチデータをホストマイコンのフラッシュメモリ(PROGMEM)に保持する必要があります。
Arduino Nano (ATmega328P) などの環境では、このパッチデータだけでメモリの大部分を圧迫します。
Geminiとしては、パッチ運用を前提とするなら、初期設計段階からESP32やRaspberry Pi Picoなどのメモリに余裕がある3.3V系マイコンへのリプレイス、あるいは外部EEPROM/SDカードからのパッチ読み込み手法を選択することを推奨します。

4.4.2 抽象化ライブラリの推奨

0x01 コマンドのビット操作(ARG の論理和合成など)をスクラッチで書くと、ビットシフトのミスによるバグが多発します。
すでに世界中で実績のある pu2clr/SI4735 GitHubリポジトリ などのオープンソースライブラリを使用することで、 POWER_UP に伴う煩雑なシーケンスやCTSフラグのポーリング処理が内部関数に隠蔽(抽象化)され、開発効率と堅牢性が劇的に向上するというのがAIの合理的な見解です。

4.5 疑問にお答え(Google AI (Gemini) の見解)

4.5.1 FM->SSB切り替え方法

質問
FMからSSBへ変更する場合は、2.1項の内容 0x11,0x01, その後を教えて下さい
見解
FMモードからSSBモードへ変更(パッチ適用)する場合の、0x11(パワーダウン)および 0x01(パワーアップ)以降の具体的な制御シーケンスは以下の通りです。
SSBへの切り替えは、パッチデータを正しく内部RAMに転送するための厳格な手順(ハンドシェイク)が必要です。 FMからSSBへの切り替え全シーケンス
FMが動作している状態から、以下の手順を順番に実行します。【FM動作中】

1. [0x11] POWER_DOWN コマンド送信

2. RST(リセット)ピンをLow→High(ハードウェア再起動)
│ 3. [0x01] POWER_UP コマンド送信(※ARG1のPATCHビットを「1」にする)

4. CTSフラグのクリアを待つ(0x01の処理完了待ち)

5. SSBパッチデータ(数キロバイト)を分割送信

6. [0x00] ステータス確認(パッチが正常適用されたかチェック)

7. [0x12] SET_PROPERTY コマンドでSSB用パラメータ設定(BFOなど)

【SSB受信開始】

各ステップの詳細と送信データ
ステップ1 現在のモードを終了コマンド:
0x11 (POWER_DOWN) を送信します。注意点: これによりデバイスは待機状態に戻ります。
ステップ2 ハードウェアリセット(推奨)処理:
Si4735の RST ピンを数ミリ秒間 Low に落とした後、再び High に戻します。
理由: 内部状態を完全にクリアし、パッチ書き込みエラーを防ぐために実務上非常に重要です。
ステップ3 パッチ書き込みモードで起動コマンド:
0x01 (POWER_UP) を送信します。引数の指定:ARG1 の PATCH ビット(Bit 7)を必ず「1」 に設定します。
ARG1 の FUNC ビット(Bit 3-0)は「1」(AM/SW/SSBコンポーネント)に設定します。
※この設定により、ICは「パッチデータを受け付ける特別な待機状態」になります。
ステップ4 CTSの確認処理:
0x01 を送った後、ステータスバイトを読み取り CTS ビット(Bit 7)が「1」 になるまでループで待ちます。
ステップ5 パッチデータの転送(最重要)処理:
用意したSSBパッチデータ(通常は多数のブロックに分割されたバイナリ配列)を順番に送信します。
送信方法:各ブロックの先頭には、パッチ転送コマンドである 0x02 (SET_PROPERTY、またはパッチ専用書き込み形式) が含まれます。
1ブロック(例:8〜32バイト程度)を送信するごとに、必ずCTS(Clear to Send)が「1」になるのを確認してから 次のブロックを送信してください。これを怠るとデータが溢れてパッチ適用に失敗します。
ステップ6 パッチ適用の成否確認コマンド:
パッチデータをすべて送り終えたら、0x00 コマンド(またはステータス読み込み)を実行します。
確認内容: 応答のステータスバイトを確認し、エラーフラグ(ERR)が立っておらず、正しくパッチが起動しているかを確認します。
ステップ7 SSB用のプロパティ設定コマンド:
0x12 (SET_PROPERTY) を使用します。
設定内容:プロパティ 0x0101 を使用して、SSBの帯域幅(フィルター幅:1kHz〜4kHzなど)を設定します。
プロパティ 0x0102 を使用して、BFO(うなり発振器)の周波数オフセット(USB/LSBの微調整)を設定します。
これにより、モガモガした声からクリアな音声に同調させることができます。






































更新日 2026/06/21 16:56  管理者 平林 剛Hirabayashi Takeshi