PR 記事には広告が含まれています
スポンサーリンク
Translate

ドラッグ&ドロップでPadaukマイコンに書き込めるようになりました

スポンサーリンク

今回は、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のUSBメモリにドラッグアンドドロップで書き込む

続いて、mbedマイコンのように、バイナリーファイルをドライブにドラッグ&ドロップしたら、プログラムが書き込まれるようにしたいと思います。

ESP32のマスストレージのサンプルプログラムは、パソコンから何か書き込みがあると、プログラム中のonWrite関数が呼ばれます。そこで、この関数が呼ばれたら、書き込まれたバイナリーファイル名を特定し、書き込みを行うようにします。

ただし、パソコンからファイルが書かれる場合、一度だけでなく何度かonWrite関数が呼ばれる場合があります。このため、何度か呼ばれても良いように、onWrite関数が最後に呼ばれてから100ms経った後に、ファイルの探索を開始し書き込み処理をするようにしました。

手順はこのようにしました。

  • onWrite関数が呼ばれて100ms経過したことを検出する
  • USBを切断する(切断しないとUSBメモリにファイルを書けないため)
  • 拡張子がBINであるファイルを探索する
  • BINファルがあった場合メモリに読み込む
  • フラッシュROMをイレースする
  • メモリからフラッシュROMへ書き込む
  • 書き込まれた内容をダンプして、正しいかチェックする
  • ログファイルをUSBメモリへ書き込む
  • USBを接続する

書き込みが終わるとLOG.TXTが作成される

BINファイルをUSBメモリにドラッグ&ドロップすると、書き込みの処理が行われます。ドライブには、書き込み中に発生したログがログファイルLOG.TXTとして保存されます。

ログファイルの内容

これがログファイルの内容です。イレース、書き込み、ベリファイが処理されていることがわかります。

スポンサーリンク

インテルHEXファイルにも対応させる

Padaukマイコンのコンパイラは、バイナリーファイルの他に、インテルHEXのファイルも出力するようです。また、ネットで公開されているコンパイル結果のファイルは、インテルHEXがほとんどのため、インテルHEXにも対応することとしました。

インテルHEXの文法は上記のwikipediaにある通りです。この文法通りにバイナリーデータに変換しました。

このため、プログラムの流れは、

  • onWrite関数が呼ばれて100ms経過したことを検出する
  • USBを切断する
  • 拡張子がIHXであるファイルを探索する
  • IHXがあった場合BINファイルへ変換する
  • 拡張子がBINであるファイルを探索する
  • BINファルがあった場合メモリに読み込む

という流れになりました。

インテルHEXファイルにも対応

これで、バイナリーファイルでも、インテルHEXファイルでも、ドラッグ&ドロップで書き込めるようになりました。

スポンサーリンク

固有のPIDを設定

PIDを取得する

デフォルトのPIDは0x1001

ESP32マスストレージクラスのサンプルプログラムでは、ベンダーIDが0x303a、プロダクトIDは0x1001となっています。

ベンダーIDの0x303aは、ESP32を作っているEspressif社の値です。

Espressif社ではESP32を使った機器に対して、固有のプロダクトIDを無料で提供しています。

このサービスを使って、Padaukマイコン書き込み機固有のPIDを取得してみます。

上記のgithubのサイトにアクセスして、mainをフォークします。

allocated-pids.txtに自分の機器を追加する

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の他に、製品名、製造社名を追加してみました。

機器名と固有のPIDが設定された

これによって、機器名が「Padauk Programmer」になり、PIDが固有の0x8240となりました。

スポンサーリンク

さて次回は

プログラムが書き込めるようになったので、プログラムが作れる環境を用意したいと思います。