Hobby Lab 趣味のモノ作り実験のサイトです。
部品 オペアンプ_関係 Si4735 マニュアル CmdNote_patch
1 パッチ概要
1-1 概要
1-1 ファイル構造概要
2 パッチの使用方法
2-1 Si4735の回路
2-2 外付けEEPROMへ書込
2-3 EEPROMからSi4735へ書込
2-3-1 0x01. POWER_UPについて
2-3-2 書き込み
2-3-3 書込タイムチャート
2-4 私が勘違いしていた事項

PrO:Si4735関係  Si4735について
 Si4735ラジオを作って見よう1
 Si4735ラジオを作って見よう2
 Si4735テスト中に判ったこと1
 v コマンド & パラメータ解説 v
 コマンド・プロパティー一覧
 0x01. POWER_UP
 0x10. GET_REV
 0x11. POWER_DOWN
 0x12. SET_PROPERTY
 0x13. GET_PROPERTY
 0x14. GET_INT_STATUS
 0x15. PATCH_ARGS
 0x16. PATCH_DATA
 PATCH の構造
 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. SSB.AM_TUNE_FREQ
 0x41. AM_SEEK_START
 0x42. SSB.AM_TUNE_STATUS
 0x43. SSB.AM_RSQ_STATUS
 0x47. SSB.AM_AGC_STATUS
 0x48. SSB.AM_AGC_OVERRIDE
 0x80. GPIO_CTL
 0x81. GPIO_SET
 v プロパティ解説 v
 0x0001.GPO_IEN
 0x0100. SSB_BFO
 0x0101. SSB_MODE
 0x0102. DIGITAL_OUTPUT・・
 0x0104. DIGITAL_OUTPUT・・
 0x0201. REFCLK_FREQ
 0x0202. REFCLK_PRESCALE
 0x1100. FM_DEEMPHASIS
 0x1102. FM_CHANNEL_FILTER
 0x1105. FM_BLEND_STEREO..
 0x1106. FM_BLEND_MONO_..
 0x1107. FM_ANTENNA_INPUT
 0x1108. FM_MAX_TUNE_ERR・・
 0x1200. FM_RSQ_INT_SOURCE
 0x1201. FM_RSQ_SNR_HI_T・・
 0x1202. FM_RSQ_SNR_LO_T・・
 0x1203. FM_RSQ_RSSI_HI・・
 0x1204. FM_RSQ_RSSI_LO・・
 0x1205. FM_RSQ_MULTIPA・・
 0x1206. FM_RSQ_MULTIPA・・
 0x1207. FM_RSQ_BLEND_TH・・
 0x1300. FM_SOFT_MUTE_RATE
 0x1301. FM_SOFT_MUTE_SL・・
 0x1302. FM_SOFT_MUTE_M・・
 0x1303. FM_SOFT_MUTE_S・・
 0x1304. FM_SOFT_MUTE_R・・
 0x1305. FM_SOFT_MUTE_A・・
 0x1400. FM_SEEK_BAND_B・・
 0x1401. FM_SEEK_BAND_TOP
 0x1402. FM_SEEK_FREQ_S・・
 0x1403. FM_SEEK_TUNE_S・・
 0x1404. FM_SEEK_TUNE_R・・
 0x1500. FM_RDS_INT_SOU・・
 0x1501. FM_RDS_INT_FIF・・
 0x1502. FM_RDS_CONFIG
 0x1503. FM_RDS_CONFIDE・・
 0x1800. FM_BLEND_RSSI_S・・
 0x1801. FM_BLEND_RSSI_M・・
 0x1802. FM_BLEND_RSSI_A・・
 0x1803. FM_BLEND_RSSI_R・・
 0x1804. FM_BLEND_SNR_ST・・
 0x1805. FM_BLEND_SNR_M・・
 0x1806. FM_BLEND_SNR_A・・
 0x1807. FM_BLEND_SNR_R・・
 0x1808. FM_BLEND_MULTI・・
 0x1809. FM_BLEND_MULTI・・
 0x180A. FM_BLEND_MULTI・・
 0x180B. FM_BLEND_MULTI・・
 0x1A00. FM_HICUT_SNR_H・・
 0x1A01. FM_HICUT_SNR_L・・
 0x1A02. FM_HICUT_ATTAC・・
 0x1A03. FM_HICUT_RELEA・・
 0x1A04. FM_HICUT_MULTI・・
 0x1A05. FM_HICUT_MULTI・・
 0x1A06. FM_HICUT_CUTOF・・
 0x3100. AM_DEEMPHASIS
 0x3102. AM_CHANNEL_FIL・・
 0x3103. AM_AUTOMATIC_V・・
 0x3104. AM_MODE_AFC_SW・・
 0x3105. AM_MODE_AFC_SW・・
 0x3200. SSB.AM_RSQ_INT・・
 0x3201. SSB.AM_RSQ_SNR・・
 0x3202. SSB.AM_RSQ_SNR・・
 0x3203. SSB.AM_RSQ_RSS・・
 0x3204. SSB.AM_RSQ_RSS・・
 0x3300. SSB.AM_SOFT_MU・・
 0x3301. AM_SOFT_MUTE_S・・
 0x3302. SSB.AM_SOFT_MU・・
 0x3303. SSB.AM_SOFT_MU・・
 0x3400. AM_SEEK_BAND_B・・
 0x3401. AM_SEEK_BAND_TOP
 0x3402. AM_SEEK_FREQ_S・・
 0x3403. AM_SEEK_TUNE_S・・
 0x3404. AM_SEEK_TUNE_R・・
 0x3700. SSB_RF_AGC_ATT・・
 0x3701. SSB_RF_AGC_REL・・
 0x3702. SSB_IF_AGC_ATT・・
 0x3703. SSB_IF_AGC_REL・・
 0x4000. RX_VOLUME
 0x4001. RX_HARD_MUTE

Pr:OPAMP オペアンプ関係
PrO:送受信機  Si4735について
 Si4735ラジオを作って見よう1
 Si4735ラジオを作って見よう2
 Si4735テスト中に判ったこと1
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制御
  可変型フィルター 周辺
  可変型フィルター MCU
 -マニュアル
 CH32V003 Manual
 QingKeV2 Microprocessor Man
 CH32F/V20x,V30x,V31x Manual
 203日本語データシート
 203日本語取説
  MBA メモリとバス方式
  PWR 電力制御
  RCC リセット・拡張・クロック
  BKP バックアップレジスタ
  CRC 巡回冗長検査
  RTC リアルタイムクロック
  GPIO GPIOと代替機能
  DMA ダイレクトメモリアクセス制御
  ADTM 高度な制御タイマー
  GPTM 汎用タイマー
  BCTM 基本タイマー
  USART 同期非同期通信
arduino関係
 ESP12関係
 (a)ESP-8266D1mini注意
PrP:Memory  24C128(16kB)
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 その他

1 パッチ概要

1-1 概要

いろいろ失敗しましたが、ようやくSSBを聞けるようになりましたので、実際を記載します。
Si4735/32などのカスタムファームウェア(主にSSBパッチ)で使われるパッチファイル(C言語の配列に落とし込んだ形式)における、0x15(PATCH_ARGS)と0x16(PATCH_DATA)について解説します。
結論から言うと、パッチファイルは「最初に数行の0x15(初期化・領域確保)が走り、その後に膨大な0x16(データ本体)の塊が続き、 セクションの節目や最後に再び0x15(インデックス更新や確定)が挟まる」という構成(サンドイッチ構造)を採っています。
以下に、標準的なSSBパッチファイル領域構成のパターンを解説します。

1-2 ファイル構造概要

1行=8バイト(コマンド1バイト + 引数7バイト)のデータが並ぶ中、領域は大きく分けて4つのフェーズに分かれています。 下記は patch_full.h に記載されているものを記載します。(パッチNoは 9D_29です。)
[ファイル先頭]
│
├── ① 【導入・初期化領域】 (0x15 が1行)
│   └─ デバイスへのパッチ適用宣言、書き込み開始アドレスの指定など
│      0x15, 0x00, 0x0F, 0xE0, 0xF2, 0x73, 0x76, 0x2F
│
├── ② 【データ転送メイン領域】 (0x16 が連続、数百〜1000行以上)
│   └─ ファームウェアバイナリの本体。ひたすら0x16が続く
│
├── ③ 【セクション切り替え領域】 (0x15 が挟まる)
│   └─ 次のメモリブロックへのポインタ移動(ページ切り替え)
│
├── ④ 【データ転送再開領域】 (再び 0x16 が連続)
│
├── ⑤ 【確定・実行領域】 (最後に 0x15 が1行)
│   └─ 転送完了通知、チェックサム検証のトリガー、パッチの有効化
│      0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x29
│
[ファイル末尾]




2 パッチの使用方法

2-1 Si4735の回路

今回作成した回路の概要は
・MCUはCH30V203C8T6
・I2Cで接続した EEPROM 24C512(容量的には24C256でも良い)
・I2Cで接続した Si4735
・Si4735のRSTは MCUのPB5に接続
・Si4735のGPO2/INTはMCUのPB9に接続

2-2 パッチを外付けEEPROMへ書き込み

プログラムからパッチのデータ配列が記載されている patch_full.h から読み出し EEPROM へ書き込みを行った。
patch_full.h は プログラムが入っている User ディレクトリー内に入れ、プログラムには
#include "patch_full.h"
と記載する
EEPROMの書き込み回数を削減するためページ書込を行った。(1回のページ書込で128バイト書込できるので通常使用しているバイト書込に比べてEEPROMの書き込み寿命を128倍長持ちできる。)
Fast_Write_Patch_To_EEPROM()を実行することでSi4735へ書き込みを行います。
I/Oの設定は別に記載する。

2-3 外付けEEPROMからSi4735へ書き込み

2-3-1 0x01. POWER_UPについて

SSBを受信する場合はその都度 0x01コマンドでSi4725にパッチを書込む必要がある。
パッチを書き込む場合は 0x01 の PATCH(ARG1,5)を 1 にする必要がある。
また FUNC(ARG1,3:0)を 1 にする必要があるので注意すること。( 15 では応答パラメータのSTATUSで ERR がでて書込できない。)
上記三行が判るまで4週間かかりました。

2-3-2 書き込み

書込は外付けのEEPROM 24C512から 8 byte ずつ 読み取り、先頭の 1 Byteをコマンドとし、そのた 7 ByteをデータとしてSi4735へ渡します。

2-3-3 書込タイムチャート

(1)全体
0x01によるPOWER_UPコマンド実行からパッチ書込までの時間は 約 1.95(s)


(2)0x01コマンド実行部の詳細
POWER_UPコマンドで CTSIEN 割込有効、GPO2OEN 出力有効 で実行してから
10.3(ms)でGPO2の電圧が立上り、
51,5(ms)でCTS割込がかかり、応答内容の紹介は記載ないが、STATUS は正常を示す 0x80が帰ってきた。
その後の A 部は(3)で確認する。


(3)EEPROMから読込、Si4735へパッチを書込
・0x50,0x00,0x00でEEPROMのアドレス0x0000からSTOP信号を出す( 8 Byte読み出し)まで読み出し
 (0x15, 0x00, 0x0F, 0xE0, 0xF2, 0x73, 0x76, 0x2Fの信号を得る)
・0x11,0x15,0x00, 0x0F, 0xE0, 0xF2, 0x73, 0x76, 0x2F の信号をSi4735へ描き込む。
・CTS割込信号でたので、応答信号を確認 0x80=OK
パッチのデータをEEPROMから全て読み出すまで上記を繰り返す。

パッチの書込が終わり、周波数設定コマンド 0x40 の
USBLSB(ARG1,7:6)でLSB=b01またはUSB=b10を設定し
FREQH(ARG2,7:0)、FREQL(ARG3:7:0)を設定してSi4735へ送信すれば SSB が受信できる。

2-4 私が勘違いしていた事項

色々な間違いを重ねて、コマンドの使用方法がわかった。
Si4735に書込だパッチは 0x11 POWER_DOWN で消去される。
0x40 TUNE_FREQコマンドの USBLSB(ARG1,7:6)をb00としても復調モードは AM にならない。
SSBを受信する場合に 0x01. POWER_UP コマンドの FUNC(ARG1,3:0)を0xFにして実行した場合, 0x15 又は 0x16 コマンドを使用しても エラーになる。
以上から 0x01. POWER_UP は受信する電波形式により 3種類あることになる。
 FM なら 0x01, 0xD0, 0x05
 AM なら 0x01, 0xD1, 0x05
 SSBなら 0x01, 0xF1, 0x05






































更新日 2026/08/28 21:05  管理者 平林 剛Hirabayashi Takeshi