今回は、PadaukマイコンPFS145のフラッシュROMに、プログラムを書き込めるようにしたいと思います。
Flash書き込みシーケンス
setVppVoltage(5.5); //Power ON delay(5); setVddVoltage(2.5); delay(5); sendData(0xA5A5A5A7,32); //send write command setVppVoltage(8.5); //chenge voltage to write setVddVoltage(5.8); delay(5); char data[4]={0x0001,0x0002,0x0003,0x0004}; char address = 0; for( int i=0 ; i<4 ; i++ ) sendData(data[i], 14); //send data sendData(address, 13); //send write address delayMicroseconds(4); for( int i=0 ; i<8 ; i++ ) //PCK 8 paluses { PCK_UP(); delayMicroseconds(25); PCK_DOWN(); delayMicroseconds(25); } PCK_CLOCK(); //1 clock
データの書き込み手順はリードよりも複雑です。
ライトコマンドとして0xA5A5A5A7を送信した後に、VPPとVDDを8.5Vと5.8Vへ引き上げます。
PFS154は4ワードを一度に書き込みます。4ワード連続して送信した後に、書き込むアドレスを送信します。
その後、PCKを25usの周期でON,OFFし、これを8回繰り返します。最後に1us周期でPCKをON,OFFすれば書き込み完了です。
0番地から0x0001,0x0002,0x0003,0x0004が書き込まれました。
書き込みは4の倍数のアドレスからしかできません。そのため、4の倍数のアドレス以外に書き込む場合、例えば2番地から書き込む場合には
data[4]={0x3FFF,0x3FFF,0x0001,0x0002}; を0番地から書き込み、data[4]={0x0003,0x0004,0x3FFF,0x3FFF}; を4番地から書き込む必要があります。
ドラッグ&ドロップで書き込めるようにする
続いて、mbedマイコンのように、バイナリーファイルをドライブにドラッグ&ドロップしたら、プログラムが書き込まれるようにしたいと思います。
ESP32のマスストレージのサンプルプログラムは、パソコンから何か書き込みがあると、プログラム中のonWrite関数が呼ばれます。そこで、この関数が呼ばれたら、書き込まれたバイナリーファイル名を特定し、書き込みを行うようにします。
ただし、パソコンからファイルが書かれる場合、一度だけでなく何度かonWrite関数が呼ばれる場合があります。このため、何度か呼ばれても良いように、onWrite関数が最後に呼ばれてから100ms経った後に、ファイルの探索を開始し書き込み処理をするようにしました。
手順はこのようにしました。
- onWrite関数が呼ばれて100ms経過したことを検出する
- USBを切断する(切断しないとUSBメモリにファイルを書けないため)
- 拡張子がBINであるファイルを探索する
- BINファルがあった場合メモリに読み込む
- フラッシュROMをイレースする
- メモリからフラッシュROMへ書き込む
- 書き込まれた内容をダンプして、正しいかチェックする
- ログファイルをUSBメモリへ書き込む
- USBを接続する
BINファイルをUSBメモリにドラッグ&ドロップすると、書き込みの処理が行われます。ドライブには、書き込み中に発生したログがログファイルLOG.TXTとして保存されます。
これがログファイルの内容です。イレース、書き込み、ベリファイが処理されていることがわかります。
インテルHEXファイルにも対応させる
Padaukマイコンのコンパイラは、バイナリーファイルの他に、インテルHEXのファイルも出力するようです。また、ネットで公開されているコンパイル結果のファイルは、インテルHEXがほとんどのため、インテルHEXにも対応することとしました。
インテルHEXの文法は上記のwikipediaにある通りです。この文法通りにバイナリーデータに変換しました。
このため、プログラムの流れは、
- onWrite関数が呼ばれて100ms経過したことを検出する
- USBを切断する
- 拡張子がIHXであるファイルを探索する
- IHXがあった場合BINファイルへ変換する
- 拡張子がBINであるファイルを探索する
- BINファルがあった場合メモリに読み込む
という流れになりました。
これで、バイナリーファイルでも、インテルHEXファイルでも、ドラッグ&ドロップで書き込めるようになりました。
固有のPIDを設定
PIDを取得する
ESP32マスストレージクラスのサンプルプログラムでは、ベンダーIDが0x303a、プロダクトIDは0x1001となっています。
ベンダーIDの0x303aは、ESP32を作っているEspressif社の値です。
Espressif社ではESP32を使った機器に対して、固有のプロダクトIDを無料で提供しています。
このサービスを使って、Padaukマイコン書き込み機固有のPIDを取得してみます。
上記のgithubのサイトにアクセスして、mainをフォークします。
allocated-pids.txtの最後の行に、次の値のPIDと自分の機器の名前を追加します。
この変更をマージしてもらうためのプルリクエストします。機器名、使用しているマイコンなどを記入します。他の人のを例として見てみたのですが、ここはシンプルでいいようです。
私の場合、数時間でマージされました。
無事にPIDの情報が本体にマージされ、Padauk書き込み機固有のPIDとして0x8240が使えるようになりました。
PIDを設定
USB.PID(0x8240); USB.productName("Padauk Programmer"); USB.manufacturerName("kohacraft.com"); USB.begin();
プログラムのUSB.begin()の前に、USBの設定を追加します。PIDの他に、製品名、製造社名を追加してみました。
これによって、機器名が「Padauk Programmer」になり、PIDが固有の0x8240となりました。
さて次回は
プログラムが書き込めるようになったので、プログラムが作れる環境を用意したいと思います。
コメント