![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
ファーム超初心者です。
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アクセスです。
わけのわからない質問してるなぁ?
と思われるかも知れないですが、何か参考になる意見いただければ
幸いです。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
>#define FROM_BASE 0x200000
アドレスマップが全く分かりませんが、ベースアドレスがおかしいのではないでしょうか?
SA0エリアはベースアドレス0x0000なのでは?
おそらくは64kbyte構成のセクタにアクセスしてるのではないかと思いますので、その辺りを中心に探っていくと良いと思います。
ご回答ありがとうございます。
>アドレスマップが全く分かりませんが、ベースアドレスがおかしいのではないでしょうか?SA0エリアはベースアドレス0x0000なのでは?
CPUはモード5で動かしており、FROMはCS1(0x200000-0x3FFFFF)
に繋がっています。
SA0のベースアドレス間違っていますか?
0x0000にしても同じでした。
>おそらくは64kbyte構成のセクタにアクセスしてるのではないかと・・・
確かにそんな感じです。
8kbyte構成のセクタにアクセスするにはどうしたら良いのでしょうか?
すみません、素人でm(_ _)m
No.5
- 回答日時:
>回路は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になっている可能性もありますが。。。)
まぁ、何が言いたいのかと言いますと・・・ハードウェアの仕様もしくは回路が何か間違っているんじゃないかと思います。
買い物の基板でないのであれば、ハードウェア設計者に横に付いてもらってデバッグするのが解決への近道になるのではないでしょうか?
No.4
- 回答日時:
トラブルの原因は特定できましたので、+αの参考にでも
■バスリリースコントロールレジスタ(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の設定はおそらく合っていると思います。
やはりデコーダ回路が必要なんですね!
手品・・・
種明かしできるよう頑張ります。
No.3
- 回答日時:
コードそのものに直接的な問題は無いようですが、気になる点があります。
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_ …
ご回答ありがとうございます。
A20とA21の波形を確認しました。
確かに"H"になっている期間があります。
(両方同時に)
回路はFROMのA0-A21に対し、CPUのA1-A22が繋がっています。
ご指摘いたただいたように8Mbyte領域を使い切るような形で使用
するようです。こう繋ぐとなぜ8Mbyte領域が使いきれるのかよく
わかりませんが・・・(アホですみません(^ ^;;)
ということでご指摘通りFROMの上位が見えていたようですね。
なぜA20とA21が"H"にドライブされているのかよくわからないですが、
いろいろ触ってみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- 英語 After exporting the planned implant position, a to 2 2022/10/31 17:48
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- 英語 正しく意味がとれない 2 2023/06/12 04:43
- C言語・C++・C# プログラミングの問題です。写真のプログラムの1から10を下のように入力しましたがプログラムが上手くい 3 2022/07/01 23:31
- その他(SNS・コミュニケーションサービス) 自分のpcがハッキングされたようなメールが来たのですがどうすればいいですか? 4 2022/10/02 16:14
- 英語 英語についてです。 write と write it down の違い 教えてくれませんか? 調べた 6 2022/09/10 16:51
- Windows 10 USBにwindows10をいれて起動する方法 5 2022/04/14 14:29
- 哲学 《自性清浄心》と《聖なる甘え》――ブッダとは目が覚めたという意味である―― 0 2023/05/23 04:15
- UNIX・Linux raspberry piを使ったWebサーバー制作をしています、接続するネットワークを変更したときに 1 2023/01/09 15:57
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
光回線とモバイルルーターとSIM...
-
インターネットを利用する方法...
-
マイクロソフトアカウントのメ...
-
AppleVisionは良いと思いますか?
-
win11エクセルで作った表を、他...
-
中華ゲーム機のGame Console R3...
-
マスク氏がアップルが自社製品...
-
ノートパソコンのバッテリー残...
-
HandBrakeのエンコーダ設定
-
BIOSが破損しているかどうかを...
-
シンギュラリティは何年後に起...
-
AIを使いたい。どうすれば良い...
-
エアコンの下に机がありその机...
-
外付けのストレージに直接ファ...
-
文字化けしたらファイルが破損...
-
外付けSSDを直撃雷から守る方法...
-
コマンドプロンプトやPowerShel...
-
「PINコードが分からず開けませ...
-
数日前から急にFBが前に進まず...
-
Windows11の初期設定でMicrosof...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パソコンメモリ(DIMM)を紹介...
-
中華ゲーム機のGame Console R3...
-
PC画面の動画をハードディスク...
-
エンジニアって、今でも社会的...
-
ソフトに致命的なバグがあるか...
-
ストレージ内の全てのファイル...
-
新規のパソコンに設定するMicr...
-
ノートパソコンの充電は延長コ...
-
拡張子が.txtのファイルに将来...
-
2002年製のpcと2008製のpcがあ...
-
授業の内容なのですがほんとに...
-
Shift_JISは日本でしか使われて...
-
SSDを放置していたらファイル名...
-
UTF-8とUTF-16とUTF-32ってどれ...
-
文字コードってコピペの時はど...
-
PowerShellに将来性はあるので...
-
AIを使いたい。どうすれば良い...
-
Microsoftが非推奨にしてるかど...
-
ソフトはVectorでダウンロード...
-
エアコンの下に机がありその机...
おすすめ情報