重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

マイコンとフラッシュメモリの接続について
2点質問があります。
質問1
マイコンH8S、フラッシュはスパンションの
http://www.spansion.com/Support/Datasheets/S29AL …
を使用しています。
ワードモードでマイコン側A0-A18、rom側A0-A18で接続したのですが、
どうもワードモードだとマイコン側A1-A19、rom側A0-A18とアドレスを1つ
ずらして接続するのが普通のようなのですが、マイコン側A0-A18、rom側A0-A18では
アクセスできないのでしょうか?必ず1つずらして接続しないとだめなのでしょうか?
実際デバイスIDのコマンドを実行してみたのですが、リードできませんでした。
(*(volatile short *)0x400555) = 0xAA;
(*(volatile short *)0x4002aa) = 0x55;
(*(volatile short *)0x400555) = 0x90;
a = (*(volatile short *)0x400002);
a=0xFFFFとなりました。

質問2
マイコン側A0-A18、rom側A0-A18ではデバイスIDがリードできなかったので、改造して
マイコン側A1-A19、rom側A0-A18としたところ、
(*(volatile short *)0x400aaa) = 0xAA;
(*(volatile short *)0x400554) = 0x55;
(*(volatile short *)0x400aaa) = 0x90;
a = (*(volatile short *)0x400002);
でデバイスID0x22DAを読むことができました。
ここで質問ですが、フラッシュのマニュアル26PだとデバイスIDの4回目のコマンドは、
ワードモードだとX01となっています。
しかし
(*(volatile short *)0x400aaa) = 0xAA;
(*(volatile short *)0x400554) = 0x55;
(*(volatile short *)0x400aaa) = 0x90;
a = (*(volatile short *)0x400001);
としたところ0x400000の製造メーカIDの0x0001がよめるだけでした。
そもそも0x400001だと奇数アドレスなのでH8Sはアクセスできないので
当然な気がするのですが、マニュアルのX01とはどういう意味なのでしょうか?
コンパイラに起因する問題でしょうか?

A 回答 (3件)

No.1,2 です。



>ワードモード、バイトモードの使い分けというか、

ワードモードは16bitマイコン向け、バイトモードは8bitマイコン向けです。
8bitマイコンはバイトモードしか素直に使えません。
16bitマイコンはバイトモードもワードモードも使う事はできます。
16bitマイコンだけどボード内データは8本しか使わないようにしてる、なら
バイトモードにすればいいです。

>それぞれのメリット、デメリットって
ワードモードに関して言えば、
詳細な動作を知らないので多分、ですが
書き込み後の待ち時間、というと少し事情が違って半分とはならないと思いますが、
単純に読み出しで考えればバイトモードは2サイクル要るところがワードモードは
1サイクルで済むのですから所要時間は半分で済むのがメリットです。
が、例えば製品コストを押さえる為に片面基板で配線する必要がある場合、
データが16本もあると配線しにくい(場合によってはできない)とか
ノイズが増えるなどデメリットとして考えられます。
バイトモードのメリット・デメリットはこの逆です。
    • good
    • 1
この回答へのお礼

ありがとうございます。
よくわかりました。

お礼日時:2010/09/16 09:51

No.1 です。



>ワードモードだと必ず1つずらして接続しないとだめなのでしょうか?

ずらさず接続すると、ROMの1番地(2バイト)アクセスに不都合を生じます。
例えばマイコンから0番地バイトアクセスすると、ROMは0番地2バイトアクセスされた事になり、
上位バイト値が不定です。
読み出しなら行き場がないだけで大きな不都合はありませんが、書き込みでは
不定データを書き込む事になります。
(マイコンの種類によっては、上位バイトに下位バイトと同じ値が出てくるものもあり、
この場合は不定ではない。ただし任意の値を与えられないので、
よほど限定された用途でないと無意味)

また、ROMの1番地2バイトアクセスを、マイコンが行う方法がありません。
奇数番地からの2バイトアクセスはバイトアクセス2回に分割されたり、
(そもそも16bitマイコンで奇数番地からの2バイトアクセスは1サイクルでは済まない)
マイコンの種類によっては許されていなかったりします。


または、上位バイトは別の経路で与え、マイコンからは常に1バイトアクセスで
ROM に達する時は2バイトアクセスに見せる、というような工夫でも使用可能です。
が有効な効果があるとも思えず、あまり凝っても解りにくくトラブルの元でもあるので、
アドレスをずらす方がシンプルでいいと思います。
    • good
    • 1
この回答へのお礼

ありがとうございます。
難しく考えず、ずらして接続した方がよさそうですね。
最後にもうひとつ疑問なのですが、ワードモード、バイトモードの
使い分けというか、それぞれのメリット、デメリットってなんなんでしょうか?
バイトモードで使っていても、
a = (*(volatile unsigned short *)0x200000);
としたらshort型でよめるわけですし。
ワードモードだとアクセス時間が短くてすむとかということでしょうか?

お礼日時:2010/09/15 11:04

マイコンの1アドレスは1バイト、メモリデバイスの1アドレスは1ワード


(16bitデバイスなら2バイト)なのが普通で、質問もこれに該当します。
これが理由で接続するアドレスラインは1本ずらします。

>マニュアル26PだとデバイスIDの4回目のコマンドは、
>ワードモードだとX01となっています。

これは ROM のアドレスなので、マイコンから見たアドレスは2倍の値です。

ROM の0番地2バイト←→マイコンの0、1番地の2バイト
ROM の1番地2バイト←→マイコンの2、3番地の2バイト
ROM の2番地2バイト←→マイコンの4、5番地の2バイト


現に、デバイスIDを読めた時のアドレスはそのように指定しています。
>マイコン側A1-A19、rom側A0-A18としたところ、
>(*(volatile short *)0x400aaa) = 0xAA;
>(*(volatile short *)0x400554) = 0x55;
>(*(volatile short *)0x400aaa) = 0x90;

「WORDモードでアドレスX01」と書かれてるなら、
同様にアドレス値2倍の x02 に読み替えればいいだけの事です。


>必ず1つずらして接続しないとだめなのでしょうか

そうでもありません。

8bitデータ幅で使う場合を考慮し、BYTE# という端子を Low に固定し
「バイトモード」にするとアドレスもROM1番地は1バイトとなり、
アドレスラインの接続もずらさずに素直につなげばOKです。
    • good
    • 0
この回答へのお礼

X01はROMから見た番地なのですね。納得しました。
>>必ず1つずらして接続しないとだめなのでしょうか

>そうでもありません。
とのことですが、ワードモードだと必ず1つずらして接続しないとだめなのでしょうか?

お礼日時:2010/09/14 10:29

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