• ベストアンサー

16ビット空間でのフラッシュメモリへの書き込みの仕方

ルネサスのSH2/7145と富士通半導体デバイスのMBM29LV160BEを使っています。 CPUの領域はCS0で200000H~3FFFFFHで取られ16ビットのアクセス空間になっいます。 CPUのアドレスA1~A21がフラッシュのA0~A20に入っています。 MBM29LV160BEのマニュアルに有る様、以下の様にプログラムしました。 #define FLASH_MSK 0x00200000L #define CMD1 0x00000555L #define CMD2 0x000002aaL void flash_write( unsigned long add, unsigned short dat) { unsigned short *pc1, *pc2, *pd; pc1 = (unsigned short *)( FLASH_MSK | CMD1 ); pc2 = (unsigned short *)( FLASH_MSK | CMD2 ); pd = (unsigned short *)( FLASH_MSK + add ); *(pc1) = 0xaa; *(pc2) = 0x55; *(pc1) = 0xa0; *(pd) = dat; while( *(pd) != dat ); } この他にも *(pc1) = 0xaaaa; *(pc2) = 0x5555; *(pc1) = 0xa0a0; や *(pc1) = 0x00aa; *(pc2) = 0x5500; *(pc1) = 0x00a0; など、考えられる事は試してみたのですがダメでした。 書いてませんがwhileは20mSで抜ける様に実際には書いてあります。 何か御存じの方が居ましたら御教授頂ければと思います。 宜しく御願いします。 *:アドレス、データ、信号線は動作しているかオシロで確認してます。   また、16ビットアクセスのS-RAM(400000H)は問題なく読み書きできます。

質問者が選んだベストアンサー

  • ベストアンサー
  • coredump
  • ベストアンサー率46% (12/26)
回答No.3

どもです。 アドレス線のことはチャンと把握しているのに、惜しいですね。 参考までにマクロを書いておきます。 #define flash_write(x,y) *(volatile unsigned short *)(FLASH_BASE_ADDR + ((x)<<1)) = ((y)<<8 | (y)) #define flash_read(x) *(volatile unsigned short *)(FLASH_BASE_ADDR + ((x)<<1)) 使い方は以下のような感じ。 flash_write(0x555, 0xAA); flash_write(0x2AA, 0x55); flash_write(0x555, 0x90); ではでは

naburi
質問者

お礼

ありがとうございます。 書込出来ました。 また、読み込み&消去も出来ました。 CPUからの見かけはビットシフトしている様に見えるけど フラッシュ側ではA0にCPUのA1が入っているから奇数アドレスもって事ですよね?!

その他の回答 (3)

  • saru_1234
  • ベストアンサー率33% (452/1341)
回答No.4

ANo.1,2です。 ズバリの回答を持っていないので小出しですみません。 いくつか気になる点がみつかりました. 確認されてますでしょうか? ANo.1 のリンクにある、データシートの記載と要約です. p.15 > (3) バイト/ワード書込み の13行目後半から >・「書込みは 1→0 には出来るが逆は不可」  0→1 にするには「消去」が必要.ということはバイト/セクタ/チップ消去のいずれかが必要. ひとつ思い出しました。 昔は「消去の前に全bit "0"を書き込む」が必要でした。 消去すると"1"になるのですが、消去操作の前から"1"だと「過消去」のような 状態になるとかで... 当時は合点は行きませんでしたがそんなものか、と 思ってました.しかし P.16 に気になる記述があります。 > (5)セクタ消去 から15行目 > セクタ消去では、消去前にユーザが素子に書込みを行う必要はありません 逆にいえばセクタ消去以外では、やはり消去前に"0"書込みが要るようです。 p.18 > (4) DQ5 > タイミングリミット超過 の6行目 > ユーザが "0"であるbitに"1"を書き込もうとするとDQ5 のフェイル状態が発生し、 > 素子はロックされ,自動アルゴリズムが終了しない.この場合はコマンドによるリセットを行って... もし、書込み直前に全bit "1" になっていないとこれにハマりそうです。

naburi
質問者

お礼

ありがとうございます。 無事に解決しました。 多岐に渡り、ご指導頂き感謝致します。

  • saru_1234
  • ベストアンサー率33% (452/1341)
回答No.2

ANo.1 です。失礼しました。 データは書き込んでるようですね。 Cは素人なもので読み間違えました。 追加の補足をお願いします。 リセットや消去などは行っていますか? コマンド完了のステータスは確認していますか?

naburi
質問者

補足

消去は行ってみましたが同じでした。 >コマンド完了のステータスは確認していますか? レディー/ビジーの事でしょうか? 市販ボードで、CPUには繋がっていません。

  • saru_1234
  • ベストアンサー率33% (452/1341)
回答No.1

どうも書込みコマンドを与えただけで、 データを書き込んでいないようですが、 いったいどうしたいのでしょうか? > 考えられる事は試してみたのですがダメでした。 どうしたいのか、「希望通りでない」ことだけはわかりますが どうなってしまうのか補足願います。 http://www.spansion.com/jp/datasheets/j520883.pdf

naburi
質問者

補足

御回答、有難う御座います。 書込が出来ていないようです。 書込確認のwhileでループしているのですが、20m秒のタイムアップで抜けてしまいます。 以前、他の富士通半導体デバイスICでは読み書きが出来、10m秒タイマでも大丈夫でした。 ただ、その時は16ビットではなく8ビットアクセスでした。