S29GL01GTのワードプログラミングについて

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
KaSa_2847381
Level 1
Level 1
First question asked First reply posted Welcome!

以下質問です。

S29GL01GT10TFA010を使用し、数十バイトのデータをセクタに書こうとワード単位での書き込みを行いました。

最初の1ワード目は書き込むことができるのですが、2ワード目から書き込むことができません。

たぶんECC機能が働いているためなのではないかと思うのですが、どのようにしたらよいのかご存知でしたら教えて頂きたくよろしくお願いします。

書き込みバッファプログラミングでも書き込みできませんでした。

0 件の賞賛
1 解決策

Single Programで最初1wordがProgram出来て、次がProgram出来ないというのは、次のコマンドが通ってないことが考えられ、

なぜ通らないか ⇒ デバイスBusy状態だから、なぜデバイスBusy状態か ⇒ Poling検出がちゃんと出来てない可能性が考えられますので

試しに、Polingルーチンのところに十分なWait Timeを入れてみて、何か違いが発生するか、を確認してみるのはいかがでしょうか。

Thanks and regards,

元の投稿で解決策を見る

0 件の賞賛
10 返答(返信)
KaKi_1384211
Level 6
Level 6
100 replies posted 50 replies posted 50 questions asked

Hi,

ECCは関係ないと考えています。

対象セクタはEraseされた状態ですか??

Word Programmingの場合、都度、コマンド、書き込むAddressと書き込むデータ(Word) が必要になります。

pastedImage_3.png

また、Write Buffer Programのコマンドは下記になります。

S29GL01GTの場合、Write pageサイズ : 16words、Write bufferサイズ(Max) : 256wordsです。

コマンド、アドレス、データ、Word count、Write buffer to Flashコマンドを確認してみてください。

pastedImage_0.png

Thanks and regards,

0 件の賞賛

返信ありがとうございます。

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が読めない。

0 件の賞賛

Hi,

最初のWord Programの後(③と④の間)、ポーリングやRY/BYで書き込み完了を確認されていますでしょうか?

pastedImage_3.png

Thanks and regards,

0 件の賞賛

返信ありがとうございます。

ポーリングがぬけておりすみません。

以下のようなソースコードでポーリングしております。

(図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;
          }
        }
    }
}

0 件の賞賛

ご確認ありがとうございます。

定石通りですと、波形取得やProgramの問題か、Readの問題かを切り分けるためにクロスチェックを提案させていただいています。

例えば、Programmer等でお客様の期待値をProgramして、お客様のシステムでReadしてみる。正常にRead出来ているか。

もしくは、お客様のシステムでProgramしたデータをProgrammer等でReadしてみる。実際どのようにProgramされているか。

このような対応は可能でしょうか??

データや波形等、機密性が高い情報が含まれている場合は、このCommunityではなく、購入元のCypress代理店に協力して

いただくことも場合によっては可能であると考えます。

Thanks and regards,

0 件の賞賛

返信ありがとうございます。

Flashとしての使用方法ですが、ソフトウェアのロードモジュールを保存するという意味と

CPUで計算した結果をロードモジュールの保存領域と異なるセクタに保存するという使用

をしております。

ロードモジュールの書き込みはFlashWriteEXという市販の書き込みツールを使用しております。

また、計算結果の保存はCPUから当該Flashにバスアクセスで書き込みをしております。

FlashWriteEXを使用しての書き込みは問題なく実施できております。

ソフトウェアも正常に動作しています。なので、当該Flashのハードウェアとしての故障では

ないと考えております。

問題はCPUからコマンドを使用してFlashに書く方ですが、1wordは書けることから接続ミスや

コマンドミスなどではないと思うのですが、

何か、考えられることがございましたら教えて頂きたくよろしくお願い致します。

0 件の賞賛

Single Programで最初1wordがProgram出来て、次がProgram出来ないというのは、次のコマンドが通ってないことが考えられ、

なぜ通らないか ⇒ デバイスBusy状態だから、なぜデバイスBusy状態か ⇒ Poling検出がちゃんと出来てない可能性が考えられますので

試しに、Polingルーチンのところに十分なWait Timeを入れてみて、何か違いが発生するか、を確認してみるのはいかがでしょうか。

Thanks and regards,

0 件の賞賛

返信ありがとうございます。

Wait Timeを入れてみたら書き込みできました。

ありがとうございました。

助かりました。

0 件の賞賛

良かったです。

引き続き、Cypress製品を宜しくお願いいたします。

0 件の賞賛