1 パッチ概要
1-1 概要
いろいろ失敗しましたが、ようやくSSBを聞けるようになりましたので、実際を記載します。
Si4735/32などのカスタムファームウェア(主にSSBパッチ)で使われるパッチファイル(C言語の配列に落とし込んだ形式)における、0x15(PATCH_ARGS)と0x16(PATCH_DATA)について解説します。
結論から言うと、パッチファイルは「最初に数行の0x15(初期化・領域確保)が走り、その後に膨大な0x16(データ本体)の塊が続き、 セクションの節目や最後に再び0x15(インデックス更新や確定)が挟まる」という構成(サンドイッチ構造)を採っています。
以下に、標準的な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
│
[ファイル末尾]
│
├── ① 【導入・初期化領域】 (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に接続
・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の設定は別に記載する。
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週間かかりました。
パッチを書き込む場合は 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)全体
(2)0x01コマンド実行部の詳細
(3)EEPROMから読込、Si4735へパッチを書込
0x01によるPOWER_UPコマンド実行からパッチ書込までの時間は 約 1.95(s)


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

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 が受信できる。
(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
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
