フラッシュROMの指定アドレスにデータを書き込む関数はこんな具合になります。
関数の後半はポーリングにより書換えが完了したかのチェックになっています
関数の後半はポーリングにより書換えが完了したかのチェックになっています
int amd_write(char far *adr,unsigned char data) { char far *p; long chip; unsigned char x; int r; long retry; chip=FP_OFF(adr) & 3; p=lng2ptr(FROM_BASE+(0x5555L<<2)+(long)chip); *p=0xaa; p=lng2ptr(FROM_BASE+(0x2aaaL<<2)+(long)chip); *p=0x55; p=lng2ptr(FROM_BASE+(0x5555L<<2)+(long)chip); *p=0xa0; *adr=data; /* データ書き込み */ retry=0; for(;;){ x=*adr; /* data polling */ if((x&0x80)==(data&0x80)){ r=0; /* normal end */ break; } if(x&0x20){ /* time out */ x=*adr; /* data polling */ if((x&0x80)==(data&0x80)){ r=0; /* normal end */ break; } r=1; /* break; */ } if(retry++ > 60000){ r=0; break; } } if(r) amd_reset(chip); /* エラーリセット */ return r; }このほかにバイナリコードのローダ、ROMのセクタイレーズ、ベリファイのモジュールを
組込み、完成したICSP処理の実行例です
①モニタからROMライタプログラムをロード
②ROMライタプログラムを起動
③新しいモニタ(Ver0.05)のバイナリイメージをロード
④ボードリセット(モニタはまだVer0.04)
⑤再度ROMライタプログラムを起動
⑥セクタイレーズ
⑦イレーズチェック
⑧ROMプログラム
⑨ベリファイチェック
⑩ボードリセット
⑪新しいモニタ(Ver0.05)が起動
②ROMライタプログラムを起動
③新しいモニタ(Ver0.05)のバイナリイメージをロード
④ボードリセット(モニタはまだVer0.04)
⑤再度ROMライタプログラムを起動
⑥セクタイレーズ
⑦イレーズチェック
⑧ROMプログラム
⑨ベリファイチェック
⑩ボードリセット
⑪新しいモニタ(Ver0.05)が起動