dポイントプレゼントキャンペーン実施中!

ファーム超初心者です。
H8(HD64F3068F)にS29JL064H(64MFlash)という構成のボードがあります。
データライト、チップイレーズはできたのですが、セクタイレーズがうまいこといきません。
思惑と違うセクタアドレスまでイレーズしてしまいます。
セクタ0(アドレス範囲:00000h - 00FFFh)だけをイレーズする
つもりのプログラムなんですが、セクタ1~セクタ8(0FFFFh)
までイレーズしてしまいます。

ヘッダー*****
#define FROM_BASE 0x200000
#define CMD_WRITE(a,v) (*volatile unsigned char*)(a)) = (v)
#define CMD0_ADDR 0x555
#define CMD1_ADDR 0x2AA
#define SA0 0x000000

プログラム*****
void Sector_Erase(void)
{
CMD_WRITE(FROM_BASE + (CMD0_ADDR << 1), 0xaa);
CMD_WRITE(FROM_BASE + (CMD1_ADDR << 1), 0x55);
CMD_WRITE(FROM_BASE + (CMD0_ADDR << 1), 0x80);
CMD_WRITE(FROM_BASE + (CMD0_ADDR << 1), 0xaa);
CMD_WRITE(FROM_BASE + (CMD1_ADDR << 1), 0x55);
CMD_WRITE(FROM_BASE + (SA0 << 1), 0x30);

データポーリングのプログラム
 **********
**********
}

CPU - FROMは16bitアクセスです。
わけのわからない質問してるなぁ?
と思われるかも知れないですが、何か参考になる意見いただければ
幸いです。
よろしくお願いします。

A 回答 (5件)

>#define FROM_BASE 0x200000



アドレスマップが全く分かりませんが、ベースアドレスがおかしいのではないでしょうか?
SA0エリアはベースアドレス0x0000なのでは?

おそらくは64kbyte構成のセクタにアクセスしてるのではないかと思いますので、その辺りを中心に探っていくと良いと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>アドレスマップが全く分かりませんが、ベースアドレスがおかしいのではないでしょうか?SA0エリアはベースアドレス0x0000なのでは?

CPUはモード5で動かしており、FROMはCS1(0x200000-0x3FFFFF)
に繋がっています。
SA0のベースアドレス間違っていますか?
0x0000にしても同じでした。

>おそらくは64kbyte構成のセクタにアクセスしてるのではないかと・・・

確かにそんな感じです。
8kbyte構成のセクタにアクセスするにはどうしたら良いのでしょうか?

すみません、素人でm(_ _)m

お礼日時:2008/01/12 09:52

>回路は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になっている可能性もありますが。。。)

まぁ、何が言いたいのかと言いますと・・・ハードウェアの仕様もしくは回路が何か間違っているんじゃないかと思います。
買い物の基板でないのであれば、ハードウェア設計者に横に付いてもらってデバッグするのが解決への近道になるのではないでしょうか?
    • good
    • 0

トラブルの原因は特定できましたので、+αの参考にでも



■バスリリースコントロールレジスタ(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に書き込めるのか」という手品の種明かしにトライしてみて下さい。
以後のあらゆるメモリデバイス制御に基礎として役立つ知識です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

BRCRの設定はおそらく合っていると思います。
やはりデコーダ回路が必要なんですね!

手品・・・
種明かしできるよう頑張ります。

お礼日時:2008/01/12 13:42

コードそのものに直接的な問題は無いようですが、気になる点があります。



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_ …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

A20とA21の波形を確認しました。
確かに"H"になっている期間があります。
(両方同時に)

回路はFROMのA0-A21に対し、CPUのA1-A22が繋がっています。

ご指摘いたただいたように8Mbyte領域を使い切るような形で使用
するようです。こう繋ぐとなぜ8Mbyte領域が使いきれるのかよく
わかりませんが・・・(アホですみません(^ ^;;)

ということでご指摘通りFROMの上位が見えていたようですね。
なぜA20とA21が"H"にドライブされているのかよくわからないですが、
いろいろ触ってみます。

お礼日時:2008/01/12 11:55

16ビットアクセスなのであれば、CMD_WRITEの#defineはunsigned charではなく、unsigned shor

tではないでしょうか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

unsigned shortにしても同じ結果でした。

セクタアドレス8以降(セクタサイズ64kbyte)は狙ったとおりに
イレーズできているような感じです・・・
が、ワードモードで動作させているのになぜかイレーズされてる範囲が
8bitのアドレス範囲です。

なにか根本的に間違えてますかね(^ ^;;

お礼日時:2008/01/12 10:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!