- FLASH ROM について
- 起動するマザーボートがあればAWDFLASHやUNIFLASHなど汎用FLASHソフトで、簡単にかなりの品種のFLASHROMは焼けるのですが、それもままならない状態に陥りました。そうみんなBIOS飛ばしちゃったのです。
今回製作するのは、パラレルポート接続で、2Mbit(256kx8)-FLASH ROM 32pin DIPタイプに対応するもので、手持ちのW29C020-90に書き込むのが第一目標です。4Mbitタイプも持っているので、余裕があればこちらも実験してみます。
まず、winbondでPDFをdownloadしてきました、これによると、A9の12Vを印加するハードウェア方式と、5Vのみで行うソフトウェア方式があって、特定アドレスにコマンドデータを書き込んで、プロテクトやチップ消去などを行うようです。
この方式はJEDEC標準コマンドで統一されているらしいという事がわかりました。
- 設計
- 手持ちの部品でなんとか作る方針です。
部品箱とジャンク箱を漁ると、昔作った基盤が出てきました。40PのTEXTTOOLと74LS373が2個と74LS04が1個載っていました。これは8bitラッチです。部品箱に373がまだあったので、もう1個追加すれば8bitずつ3回に分けて送信し、A0〜23の24bitのアドレスに対応できます。パラレル出力は4bitしか残っていないので、139を使って節約すればなんとかいけそうです。
74LS139(1/2) 入力 出力 A B Y0 Y1 Y2 Y3 L L L H H H L H H L H H H L H H L H H H H H H L
- 回路図
回路図はまだ起してません;^_^
ほとんど配線だけなので、メモに手書きで済ませてしまっています。
回路図を起こしました。クリックすると拡大します。
- 工作
- フルスクラッチなので、うんざりするほど配線です。
電源は5V単一で使用量もたかが知れているので、USBでよかったのですが、古いノートパソコンでも使いたい為、PS/2からもらうことにしました。
TEXTTOOLが40pinだったので、誤挿入防止用にプラ板でカバーを付けました。
右のピンコネクタは40pをそのまま引き出したものです。PLCCなどにアダプタで対応できます。
増築で小汚いですが、とりあえず完成した本機
アドレス制御ができているかチェックする用の基盤です。
- ソフト
- Delphiで作成中です。
Windows2000でI/Oポートを使用するために、giveio.sysを組み込みます。
自己ライブラリで起動時にOS判定してるのですが、警告も何も出さないのであまり意味ないっぽです。
でっち上げハードなので、すんなり動いてくれるとは思いませんでしたが、ROMから読んだデータはとんでもなく化けたものでした。
最初に書いたReadプログラムは以下のようなロジックでした。
100回連続して同じデータが読めれば、正常に読めたとする
1000回読み込んでも正常に読めなければエラーを1カウントし、次のアドレスに進む
まるで磁気メディアなどの信頼性の低いメディアからの読み出しロジックみたいですね。CRCがあるからもっとマシとつっこみが入りそうですが
このロジックで、0x0000〜0xFFFFのたった64kのreadで100個くらいエラーがあがってくるのです;^_^
前途多難を感じました。
とりあえずノイズ対策ですべてのICのVccとGNDの間に104のコンデサを入れて対策を行いました(基本です)
効果は上々でエラーカウントは20個程度に減りました。
エラーの発生するアドレスも毎回同じっぽいです。
どのように化けているのか表示してみると
0004f:7f 58 00 58 7f 00 58 7f 58 ...
0007f:0c ff 0c ff 0c ff ...
一定のサイクルを繰り返しているように思えました。
心配していた、データバスがノイズで乱されているわけではないようです。
エラー発生時にステップ実行になるようにプログラムを書き換えてみると
アドレス0004fが 3004f や 000ff 03ffff などに化けてしまっているようです。
1Byte読み込み部分のロジックは
Step.1 ROMのOutputを禁止 Step.2 パラレルポートを出力に設定 Step.3 パラレルポートにA16-17を出力し、アドレスラッチ Step.4 パラレルポートにA8-15を出力し、アドレスラッチ Step.5 パラレルポートにA0-7を出力し、アドレスラッチ Step.6 パラレルポートを入力に設定 Step.7 ROMのOutputを許可 Step.8 パラレルポートから1Byte読み込む
パソコンからとROMからの出力衝突は起こっていそうにないです。
現象が発生するのは、20/65000だし、ロジックミスならもっとエラー率は高いはず。
7セグ表示器を拡張コネクタに付けて実際のアドレスを見てみると、
Step.6までは正常なアドレスを示し、Step.7でROMの#OEをEnableした瞬間にアドレスが化ける場合があるようです。
74373のHold入力にノイズが乗っているようなので、この入力に0.01μFのパスコンをいれてみました。
かなり大きなコンデンサなので、アドレスラッチの時間を稼ぐためにWaitを入れてみました。
結果はかなり改善され20個のエラーが2〜3個に減少しました。
ここからはカット&トライでパスコンの値を詰めていきました。
バンザイ〜!!
1000pFで安定しました。ROMの読み出し成功です。
当初のロジックで100%読めるようになったので、エラー検出のロジックを変更しました。
10回アドレス指定して読み込み1個でも違うデータがあればエラーとする
もう少し信頼性を稼いでおかないと後で苦労しそうなので、更に調整中…
100pFを試して少し悪くなったようなので、390pFを試しています。
たまにエラーが発生する程度になりましたが、発生頻度が減ったので調整にすごく時間が掛かるようになりました。5回に1回でもアドレス指定のミスがあれば書き込みや消去コマンドのミスが起こりそうですがら。
1/4から作りはじめてもう3日目…
まだまだ時間がかかりそうなのでした;^_^
終端をプルアップしてダンピング抵抗を入れてみたり、試行錯誤続けた結果、やっと10/10 read OKになりました。
No Type メーカー 型番 1 2Mbit Winbond W29C020C-90 2 2Mbit Winbond W29C020C-90B 3 2Mbit SyncMos F29C51002T-90PC 4 4Mbit Macrnix 29F004TPC-12
上記の4種類のFLASH ROMでチェックしたところ、2のROMだけがかなりのWaitを入れないと正常に読み取りできませんでした、OEからData出力まで時間がかかり、その間のデータが0x7fになってるようです。DataSheetには90と90Bの違いは記載されてなく、90Bのみ掲載されていました。単に後継品種のようです。これはかなり悩みましたが、アドレス設定中はCEをHighにしないとこのような状態になってしまうようでした。
Readが安定したので、いよいよWriteです。
Product IDを読み出してコマンドモードのテストを行いました。
なぜかWinbondだけProduct IDモードに入れずROMのデータを返してきましたが、プログラムを整理すると、なんとなく解消したっぽいです。いつのまにか正常に読めるようになりました。CEとWEを同時にon/offしていたのが良くなかった感じです。最初にF0コマンドで初期化するよう変更したのがよかったのかも知れません。
No Type メーカー 型番 Mnufacturer
CodeDevice
Code備考 1 2Mbit Winbond W29C020C-90 0xDA 0x45 正常に読み取れた 2 2Mbit Winbond W29C020C-90B - 保存用に使ってしまったのでテストできず 3 2Mbit SyncMos F29C51002T-90PC 0x40 0x02 Data Sheetが無いので正常かどうか判定できず 4 4Mbit Macrnix 29F004TPC-12 0xC2 0x45 正常に読み取れた 5 1Mbit Winbond W29C011A-15 0xDA 0xC1 正常に読み取れた
Chip EraseをSyncMosで試しました。あっさり通過、全データがFFになりました。
次にWriteコマンドを、pollingでD7見ずに10ms待ちで行ったため、死ぬほど時間が掛かりましたがなんとか焼けているようでです。VERIFYもOK!!
ドキドキしながらマザーに挿すと起動音が〜〜
やっと復活してくれました。これで冷たい作業机ともおさらばです。
正直こんなに時間かかるとは思ってなかったです;^_^いやはや