- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
以下質問です。
S29GL01GT10TFA010を使用し、数十バイトのデータをセクタに書こうとワード単位での書き込みを行いました。
最初の1ワード目は書き込むことができるのですが、2ワード目から書き込むことができません。
たぶんECC機能が働いているためなのではないかと思うのですが、どのようにしたらよいのかご存知でしたら教えて頂きたくよろしくお願いします。
書き込みバッファプログラミングでも書き込みできませんでした。
解決済! 解決策の投稿を見る。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
Single Programで最初1wordがProgram出来て、次がProgram出来ないというのは、次のコマンドが通ってないことが考えられ、
なぜ通らないか ⇒ デバイスBusy状態だから、なぜデバイスBusy状態か ⇒ Poling検出がちゃんと出来てない可能性が考えられますので
試しに、Polingルーチンのところに十分なWait Timeを入れてみて、何か違いが発生するか、を確認してみるのはいかがでしょうか。
Thanks and regards,
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
Hi,
ECCは関係ないと考えています。
対象セクタはEraseされた状態ですか??
Word Programmingの場合、都度、コマンド、書き込むAddressと書き込むデータ(Word) が必要になります。
また、Write Buffer Programのコマンドは下記になります。
S29GL01GTの場合、Write pageサイズ : 16words、Write bufferサイズ(Max) : 256wordsです。
コマンド、アドレス、データ、Word count、Write buffer to Flashコマンドを確認してみてください。
Thanks and regards,
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
返信ありがとうございます。
Eraseは最初に実施しております。以下書き込み手順を記載します。
(Word Programmingの場合及び、Write Buffer Programの場合の手順を記載します。)
どちらとも正常に書き込むことができず困っております。
(Word Programmingの場合は最初の1ワードは書き込みできますが、2ワード目から書き込みができません。
但し、2ワード目のセクタを変えると書き込みできます。
Write Buffer Programの場合は、正常に書き込みできません。)
よろしくお願いいたします。
■Word Programmingの場合
① 電源ON
② セクタErase(例えば、SA31、アドレス0x001F 0000)
③ アドレス0x001F0400に0x1234を書き込む
FLASH_CMD(0x555, 0x00AA);
FLASH_CMD(0x2AA, 0x0055);
FLASH_CMD(0x555, 0x00A0);
FLASH_WRITE(0x001F0400,0x1234);
④ アドレス0x001F0401に0x5678を書き込む ← セクタを変えると正しく書き込めることは確認済み
FLASH_CMD(0x555, 0x00AA);
FLASH_CMD(0x2AA, 0x0055);
FLASH_CMD(0x555, 0x00A0);
FLASH_WRITE(0x001F0401,0x5678);
⑤ 電源OFF
⑥ 電源ON
⑦ 書けたかアドレス0x001F0400から読込み
Read1 = FLASH_READ(0x001F0400); → 0x1234が読め問題ない。
⑧ 書けたかアドレス0x001F0401から読込み
Read2 = FLASH_READ(0x001F0401); → 0xFFFFとなり0x5678が読めない。
■Write Buffer Programの場合
① 電源ON
② セクタErase(例えば、SA31、アドレス0x001F 0000)
③ FLASH_CMD(0x555, 0x00AA);
FLASH_CMD(0x2AA, 0x0055);
FLASH_CMD(0x001F0400, 0x0025);
FLASH_CMD(0x001F0400, 0x0001);
for(i = 0; i <= 1; i++)
{
FLASH_WRITE(0x001F0400+i, 0x1234+i);
}
FLASH_CMD(0x001F0400, 0x0029);
④ 電源OFF
⑤ 電源ON
⑥ 書けたかアドレス0x001F0400から読込み
Read1 = FLASH_READ(0x001F0400); → 0x0000となり0x1234が読めない。
⑦ 書けたかアドレス0x001F0401から読込み
Read2 = FLASH_READ(0x001F0401); → 0xFFFFとなり0x1235が読めない。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
Hi,
最初のWord Programの後(③と④の間)、ポーリングやRY/BYで書き込み完了を確認されていますでしょうか?
Thanks and regards,
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
返信ありがとうございます。
ポーリングがぬけておりすみません。
以下のようなソースコードでポーリングしております。
(図7のポーリングアルゴリズムと一致すると思うのですが)
bool FlashRom_Polling(unsigned int addr, unsigned short Data)
{
label0:
unsigned short cur = FlashRom_Read(addr);
// #DQ7 Polling
if ((cur & 0x0080) == (Data & 0x0080)) {
return true;
}
else {
// #DQ5 check
if ((cur & 0x0020) != 1) {
for (volatile unsigned int i=0; i<0xffffff; i++) {}; // wait
goto label0;
}
else {
cur = FlashRom_Read(addr);
if ((cur & 0x0080) == (Data & 0x0080)) {
return true;
}
else {
return false;
}
}
}
}
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
ご確認ありがとうございます。
定石通りですと、波形取得やProgramの問題か、Readの問題かを切り分けるためにクロスチェックを提案させていただいています。
例えば、Programmer等でお客様の期待値をProgramして、お客様のシステムでReadしてみる。正常にRead出来ているか。
もしくは、お客様のシステムでProgramしたデータをProgrammer等でReadしてみる。実際どのようにProgramされているか。
このような対応は可能でしょうか??
データや波形等、機密性が高い情報が含まれている場合は、このCommunityではなく、購入元のCypress代理店に協力して
いただくことも場合によっては可能であると考えます。
Thanks and regards,
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
返信ありがとうございます。
Flashとしての使用方法ですが、ソフトウェアのロードモジュールを保存するという意味と
CPUで計算した結果をロードモジュールの保存領域と異なるセクタに保存するという使用
をしております。
ロードモジュールの書き込みはFlashWriteEXという市販の書き込みツールを使用しております。
また、計算結果の保存はCPUから当該Flashにバスアクセスで書き込みをしております。
FlashWriteEXを使用しての書き込みは問題なく実施できております。
ソフトウェアも正常に動作しています。なので、当該Flashのハードウェアとしての故障では
ないと考えております。
問題はCPUからコマンドを使用してFlashに書く方ですが、1wordは書けることから接続ミスや
コマンドミスなどではないと思うのですが、
何か、考えられることがございましたら教えて頂きたくよろしくお願い致します。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
Single Programで最初1wordがProgram出来て、次がProgram出来ないというのは、次のコマンドが通ってないことが考えられ、
なぜ通らないか ⇒ デバイスBusy状態だから、なぜデバイスBusy状態か ⇒ Poling検出がちゃんと出来てない可能性が考えられますので
試しに、Polingルーチンのところに十分なWait Timeを入れてみて、何か違いが発生するか、を確認してみるのはいかがでしょうか。
Thanks and regards,
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
返信ありがとうございます。
Wait Timeを入れてみたら書き込みできました。
ありがとうございました。
助かりました。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
良かったです。
引き続き、Cypress製品を宜しくお願いいたします。