- ベストアンサー
フラッシュROMのセクタイレーズについて
- H8(HD64F3068F)にS29JL064H(64MFlash)という構成のボードがあります。データライト、チップイレーズはできたのですが、セクタイレーズがうまいこといきません。
- セクタ0(アドレス範囲:00000h - 00FFFh)だけをイレーズするつもりのプログラムなんですが、セクタ1~セクタ8(0FFFFh)までイレーズしてしまいます。
- フラッシュROMのセクタイレーズについてのプログラムに関する意見を募集しています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>#define FROM_BASE 0x200000 アドレスマップが全く分かりませんが、ベースアドレスがおかしいのではないでしょうか? SA0エリアはベースアドレス0x0000なのでは? おそらくは64kbyte構成のセクタにアクセスしてるのではないかと思いますので、その辺りを中心に探っていくと良いと思います。
その他の回答 (4)
- takepon256
- ベストアンサー率41% (391/936)
>回路はFROMのA0-A21に対し、CPUのA1-A22が繋がっています。 これはFLASH-ROMが16ビット幅なのに対して、CPUは1バイトごとにアドレスカウントするためです。 例えば 0x200000番地にアクセスするときはA21=Highになり、 0x200002番地にアクセスするときはA21,A1=Highとなります。 今回ベースアドレスが0x200000とのことですので、もしかするとA21=Highでアクセスされているかもしれません。 そうすると、既に指摘されているようにFlash-ROMとしては上位アドレスにアクセスされていることになりますよね? ディジタルオシロ、もしくはロジアナがあれば/CS2とA21を同時に観測して見てください。 (4バンク構成のROMですので、A22がHighになっている可能性もありますが。。。) まぁ、何が言いたいのかと言いますと・・・ハードウェアの仕様もしくは回路が何か間違っているんじゃないかと思います。 買い物の基板でないのであれば、ハードウェア設計者に横に付いてもらってデバッグするのが解決への近道になるのではないでしょうか?
- bug_bug
- ベストアンサー率78% (36/46)
トラブルの原因は特定できましたので、+αの参考にでも ■バスリリースコントロールレジスタ(BRCR)の確認 CPUの初期化時にきちんとバスコントローラが設定できていない場合、CPUのA23-A20は入出力ポートとして起動します。 またI/Oポートとしての初期値はCPU起動時では入力になってますから、A23-20はハイインピーダンス状態となっており、回路上のプルアップによりHを保持している可能性が高いかも。 > 回路はFROMのA0-A21に対し、CPUのA1-A22が繋がっています。 この回路でFlashRomの8MByteを使い切る為には、CPUの「/CS1, /CS2などCPUの割り当てたい領域のチップセレクト信号線と A22, A21の信号線」を入力し、FlashRomデバイスの「/OE端子やA21,A20」に出力する「デコードの為の回路」が必要です。 回路図を凝視し、どのように制御すれば動作するかを自分で検討するか、 回路設計者にどうやったら8MByte利用できるか聞いた方が良いでしょう。 ■アドバイス > こう繋ぐとなぜ8Mbyte領域が使いきれるのかよくわかりませんが・・・ デバイスを駆動する「仕組み」さえ理解してしまえば、小学生でも扱える内容ですが、 仕組みをしらないと、東大生でも解けない問題です。 (例えるなら、手品の種明かしを知ってるか知らないか) 組み込みに興味ある方にとって、このトラブルケースはすごくいい練習問題ですので 「何故Flashに書き込めるのか」という手品の種明かしにトライしてみて下さい。 以後のあらゆるメモリデバイス制御に基礎として役立つ知識です。
お礼
ご回答ありがとうございます。 BRCRの設定はおそらく合っていると思います。 やはりデコーダ回路が必要なんですね! 手品・・・ 種明かしできるよう頑張ります。
- bug_bug
- ベストアンサー率78% (36/46)
コードそのものに直接的な問題は無いようですが、気になる点があります。 3068のCS1空間は0x00200000-0x003FFFFFの2MByte割り当てられていますが、 それに対してFlashRomは8MByte(64Mbit)とサイズがずいぶん大きいですね。 レポートいただいた症状から、デバイス側のA21,A20どちかがが駆動されており、 CPUのCS1空間にはFlashRomの上位ブロックが見えている可能性があります。 CPUからのセクタイレースコマンドが発行されている間、デバイスのA21,A20信号線が それぞれLにきちんと引かれているか調べる必要があります。 FlashRomの8MByte領域を使い切る為にCPUのI/OポートからデバイスのA21,A20信号線を 駆動しているかもしれません。(回路図の確認が必要) スパンシオンのデバイスでは最下位ブロックのみ4Kword単位で細かくセクタ割りしてあり、 その他のブロックでは32Kword単位でしか割ってません。(1word = 16bit = 2Byte) この場合、A21,A20どちらかがHにドライブされているとすると、CPUのCS1エリアには上位のブロックが 見えており、セクタイレースコマンド発行後、A21,A20を変更しないままターゲットのCPUからデバイスの中を覗けば 提示された症状が発生するでしょう。 以下、駄文 その他、気になる点として、写し間違いだとは思いますが × #define CMD_WRITE(a,v) (*volatile unsigned char*)(a)) = (v) ○ #define CMD_WRITE(a,v) *((volatile unsigned char*)(a)) = (v) (charアクセスでもshortアクセスでもどちらでもFlashRomデバイスの駆動に問題はありません) 他にはスパンシオンのデバイスでは既定時間以内での連続セクタイレースの指示ができますから データポーリングのロジック内でライトアクセスが発行されていると誤動作する可能性があるくらいかな。 以下、対象データシートから抜粋 10.7 セクタ イレーズ コマンド シーケンス コマンド シーケンスをライトすると、80 μs のセクタ イレーズ タイムアウトがスタートします。このタイ ムアウト時間内であれば、別のセクタ アドレスに対してセクタ イレーズ コマンドをライトすることができ ます 引用元 http://www.spansion.com/jp/datasheets/S29JL064H_00_A6_J.pdf
お礼
ご回答ありがとうございます。 A20とA21の波形を確認しました。 確かに"H"になっている期間があります。 (両方同時に) 回路はFROMのA0-A21に対し、CPUのA1-A22が繋がっています。 ご指摘いたただいたように8Mbyte領域を使い切るような形で使用 するようです。こう繋ぐとなぜ8Mbyte領域が使いきれるのかよく わかりませんが・・・(アホですみません(^ ^;;) ということでご指摘通りFROMの上位が見えていたようですね。 なぜA20とA21が"H"にドライブされているのかよくわからないですが、 いろいろ触ってみます。
- koyaduka
- ベストアンサー率33% (1/3)
16ビットアクセスなのであれば、CMD_WRITEの#defineはunsigned charではなく、unsigned shortではないでしょうか?
お礼
ご回答ありがとうございます。 unsigned shortにしても同じ結果でした。 セクタアドレス8以降(セクタサイズ64kbyte)は狙ったとおりに イレーズできているような感じです・・・ が、ワードモードで動作させているのになぜかイレーズされてる範囲が 8bitのアドレス範囲です。 なにか根本的に間違えてますかね(^ ^;;
お礼
ご回答ありがとうございます。 >アドレスマップが全く分かりませんが、ベースアドレスがおかしいのではないでしょうか?SA0エリアはベースアドレス0x0000なのでは? CPUはモード5で動かしており、FROMはCS1(0x200000-0x3FFFFF) に繋がっています。 SA0のベースアドレス間違っていますか? 0x0000にしても同じでした。 >おそらくは64kbyte構成のセクタにアクセスしてるのではないかと・・・ 確かにそんな感じです。 8kbyte構成のセクタにアクセスするにはどうしたら良いのでしょうか? すみません、素人でm(_ _)m