この解説は、Skyworks (Silicon Labs) Si47XX PROGRAMMING GUIDE AN332 を基に、Google AI (Gemini) の協力を得て作成しています。
1 プロパティ 0x4000. RX_VOLUME 概要
RX_VOLUME
オーディオ出力音量を設定します。
次のコマンドを送信しても安全な状態になると、CTSビット(およびオプションの割り込み)がセットされます。
このプロパティは、パワーアップモードのときにのみ設定または読み取りが可能です。
デフォルト値は63です。
対象: すべて
デフォルト: 0x003F
ステップ: 1
範囲: 0~63
オーディオ出力音量を設定します。
次のコマンドを送信しても安全な状態になると、CTSビット(およびオプションの割り込み)がセットされます。
このプロパティは、パワーアップモードのときにのみ設定または読み取りが可能です。
デフォルト値は63です。
対象: すべて
デフォルト: 0x003F
ステップ: 1
範囲: 0~63
2 プロパティ
2.1 プロパティリスト
| Bit | 上位バイト PROPH | 下位バイト PROPL | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Name | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | VOL | |||||
| Bit | Name | Function |
|---|---|---|
| 5:0 | VOL | 出力音量。 出力音量レベルを設定します(最大63、最小0)。デフォルトは63です。 |
2.2 プロパティ
本プロパティは、Si4735のオーディオ出力(アナログ・デジタル双方)の最終的な音量(ボリューム)をデジタル制御で設定するためのものです。
チップ内部のDSP処理の最終段に位置するデジタルアッテネータ(減衰器)を制御し、受信モード(FM、AM、SW、LW)に関わらず、システム全体の音量を一括して均一にコントロールします。
チップ内部のDSP処理の最終段に位置するデジタルアッテネータ(減衰器)を制御し、受信モード(FM、AM、SW、LW)に関わらず、システム全体の音量を一括して均一にコントロールします。
2.2.1 VOL (Volume)
目的と概要:
オーディオの出力音量を 0〜63 のインデックス(64段階)で設定します。
デフォルト値は最大音量である 63(0x003F)です。
設定値 0 は完全な消音(デジタルミュート)状態となり、値が1増えるごとに 1 dB刻み で音量が大きくなります(63 が 0 dB減衰=最大出力、1 が -62 dB減衰)。
AN332に明記されない目的と解説:
デフォルト値は最大音量である 63(0x003F)です。
設定値 0 は完全な消音(デジタルミュート)状態となり、値が1増えるごとに 1 dB刻み で音量が大きくなります(63 が 0 dB減衰=最大出力、1 が -62 dB減衰)。
公式プログラミングガイド [AN332] には単純なステップ数と1dB刻みの仕様しか書かれていませんが、回路設計および音響工学的な真の目的は、
「後段のアナログアンプ(LM386やNJM2073など)への過大入力による歪み(クリッピング)を防止するための、正確なシステムゲイン・マッチング(出力レベル調整)」にあります。
Si4735のアナログ出力(LOUT/ROUT)は、デジタル最大レベル(0 dBFS)の信号を受信した際、最大で約 500 mVpk(片振幅)〜 1 Vpp 近くのオーディオ信号を出力します。
もし後段のアンプの増幅率(ゲイン)が高すぎる設計になっていると、プロパティを最大の 63 にした瞬間にアンプが飽和し、音が激しくバリバリと歪んでしまいます。
本パラメータは単なるユーザー用ボリュームとしてだけでなく、「自作回路のアンプ特性に合わせて、歪まない最大のマスターボリューム(上限値)をソフトウェア側で固定・制限する」ための、 ゲインキャリブレーションレジスタとしての重要な役割を担っています。
Si4735のアナログ出力(LOUT/ROUT)は、デジタル最大レベル(0 dBFS)の信号を受信した際、最大で約 500 mVpk(片振幅)〜 1 Vpp 近くのオーディオ信号を出力します。
もし後段のアンプの増幅率(ゲイン)が高すぎる設計になっていると、プロパティを最大の 63 にした瞬間にアンプが飽和し、音が激しくバリバリと歪んでしまいます。
本パラメータは単なるユーザー用ボリュームとしてだけでなく、「自作回路のアンプ特性に合わせて、歪まない最大のマスターボリューム(上限値)をソフトウェア側で固定・制限する」ための、 ゲインキャリブレーションレジスタとしての重要な役割を担っています。
3 応答パラメータ
STATUS (Status Byte)
CTS (Clear to Send):
ERR (Error):
1 になると、チップが前のコマンドの処理を完了し、次のコマンドを受け入れられる状態であることを示します。
ERR (Error):
1 の場合、直前に送ったコマンドやプロパティの引数が不正(範囲外など)であったことを示します。
4 その他(Google AI (Gemini) の見解)
4.1 コマンドの重要ステップと注意事項
ビットマスクの厳守と無効ビットの処理
全モード共通(共通レジスタ空間)の特性
VOL パラメータは下位バイトの Bit 5:0(下位6ビット) に割り当てられています。
Bit 7とBit 6は予約領域(Reserved)であり、必ず 0 にしておく必要があります。
マイコン側から送信する際は、予期せぬバグを防ぐために必ず 0x3F(バイナリで 0011 111)でマスク演算を行ってから送信してください。
Bit 7とBit 6は予約領域(Reserved)であり、必ず 0 にしておく必要があります。
マイコン側から送信する際は、予期せぬバグを防ぐために必ず 0x3F(バイナリで 0011 111)でマスク演算を行ってから送信してください。
全モード共通(共通レジスタ空間)の特性
本プロパティ(0x4000)は、FM受信モード(FMRX)だけでなく、AM/SW/LW受信モード(AMRX)でも全く同じIDで共通して機能します。
ただし、モードを切り替える(POWER_DOWN して再度 POWER_UP する)と、チップ内部のRAMがリセットされ、音量はデフォルトの 63(最大)に戻ってしまいます。
モード切り替え直後は、マイコンのメモリに保存してある現在の音量値を再設定するステップを忘れないでください。
ただし、モードを切り替える(POWER_DOWN して再度 POWER_UP する)と、チップ内部のRAMがリセットされ、音量はデフォルトの 63(最大)に戻ってしまいます。
モード切り替え直後は、マイコンのメモリに保存してある現在の音量値を再設定するステップを忘れないでください。
4.2 もう少し踏み込んだ応用展開
「対数カーブ(Aカーブ)」のソフトウェア補間実装
選局(TUNE)時・ミュート時の「ソフト・ミュート(ポップノイズ対策)」
本プロパティは 1ステップ=1 dB の「直線的(線形)なdB減衰」です。
しかし、人間の耳は音量を対数(ログ)で感知するため、インデックスを 1, 2, 3... と等間隔で増減させると、 「音量が小さい領域(0〜20付近)では劇的に音量が変わるのに、音量が大きい領域(40〜63)ではほとんど変化が体感できない」という不自然な挙動になります。
これを解決するため、高級アナログボリュームのように滑らかに音量を変えるには、 マイコン側に 「Aカーブ変換テーブル(配列)」 を用意し、ユーザーの操作(0〜100%)に対して非線形に VOL 値(0〜63)を割り当てるステップ関数を実装するのが、 ワンランク上の自作ラジオにするための強力な応用展開です。
しかし、人間の耳は音量を対数(ログ)で感知するため、インデックスを 1, 2, 3... と等間隔で増減させると、 「音量が小さい領域(0〜20付近)では劇的に音量が変わるのに、音量が大きい領域(40〜63)ではほとんど変化が体感できない」という不自然な挙動になります。
これを解決するため、高級アナログボリュームのように滑らかに音量を変えるには、 マイコン側に 「Aカーブ変換テーブル(配列)」 を用意し、ユーザーの操作(0〜100%)に対して非線形に VOL 値(0〜63)を割り当てるステップ関数を実装するのが、 ワンランク上の自作ラジオにするための強力な応用展開です。
選局(TUNE)時・ミュート時の「ソフト・ミュート(ポップノイズ対策)」
周波数を切り替える際(FM_TUNE_FREQ コマンドなど)、一瞬「ブツッ」というデジタルノイズや、選局中の激しい「ザッ」という不快な局間ノイズが走ることがあります。
これを防ぐため、選局コマンドを送る直前に RX_VOLUME を 0(消音)にし、 選局完了(STCビット確認)から数百ms待ってから元の音量(例:45)へ高速に「10, 20, 30, 45」とスライドさせて戻す 「ソフト・ウェイクアップ(フェードイン)」 を マイコン側で組むと、市販の高級オーディオと全く同じ極上の操作感が手に入ります。
これを防ぐため、選局コマンドを送る直前に RX_VOLUME を 0(消音)にし、 選局完了(STCビット確認)から数百ms待ってから元の音量(例:45)へ高速に「10, 20, 30, 45」とスライドさせて戻す 「ソフト・ウェイクアップ(フェードイン)」 を マイコン側で組むと、市販の高級オーディオと全く同じ極上の操作感が手に入ります。
4.3 デバッグ時のチェックリスト
値の上限ガード:
チャタリングによるCTSオーバーフロー:
アンプ側ゲインとのバランス:
ロータリーエンコーダのインクリメント処理で、値が 63(0x3F)を超えて 64(バイナリで 0100 0000、Bit 6が立つ)になっていないか。
上限を超えると、予約ビットに引っかかり、音が突然消えるかエラーになります。
上限を超えると、予約ビットに引っかかり、音が突然消えるかエラーになります。
チャタリングによるCTSオーバーフロー:
エンディアンやロータリーエンコーダのチャタリング対策が甘いと、一瞬で十数回もの SET_PROPERTY が超高速発行されます。
マイコン側で確実に CTS==1 を待ってから次を発行するか、音量変更のパケット送信に最低でも数ms〜10ms程度のインターバル(タイマー割り込みやディレイ)を設けているか。
マイコン側で確実に CTS==1 を待ってから次を発行するか、音量変更のパケット送信に最低でも数ms〜10ms程度のインターバル(タイマー割り込みやディレイ)を設けているか。
アンプ側ゲインとのバランス:
音量を 63(最大)にしてもスピーカーからの音が極端に小さい、あるいは 10 程度でもう音が割れてしまう場合、Si4735の不具合ではなく、
後段のオペアンプやオーディオアンプICの入力インピーダンス・増幅率(ゲイン設定抵抗)のミスマッチが原因です。
ハードウェア回路側とのキャリブレーションを行ってください。
ハードウェア回路側とのキャリブレーションを行ってください。
4.4 まとめ
0x4000 (RX_VOLUME) は、ユーザーが最も直接的に触れ、ラジオの「操作の心地よさ」を体感する、インターフェースの心臓部です。
デフォルトの1dBステップ(直線)のまま使うのではなく、hobbylab.jp が得意とされる緻密なロジックを活かして「オーディオ用Aカーブ変換」や 「選局時のミュート・フェードイン」をホストマイコン(Arduino/ESP32等)に組み込むことで、このSi4735チップはまるで生きているかのように滑らかで上質な受信機へと生まれ変わります。
自作ラジオ基板のボリュームノブを回した時の「極上の手応え」を目指して、ぜひソフトウェア側でのチューニングを楽しんでみてください!
デフォルトの1dBステップ(直線)のまま使うのではなく、hobbylab.jp が得意とされる緻密なロジックを活かして「オーディオ用Aカーブ変換」や 「選局時のミュート・フェードイン」をホストマイコン(Arduino/ESP32等)に組み込むことで、このSi4735チップはまるで生きているかのように滑らかで上質な受信機へと生まれ変わります。
自作ラジオ基板のボリュームノブを回した時の「極上の手応え」を目指して、ぜひソフトウェア側でのチューニングを楽しんでみてください!
