10 Replies Latest reply on Aug 28, 2020 2:03 AM by KaKi_1384211

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

    KaSa_2847381

      以下質問です。

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

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

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

       

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

        • 1. Re: S29GL01GTのワードプログラミングについて
          KaKi_1384211

          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,

          • 2. Re: S29GL01GTのワードプログラミングについて
            KaSa_2847381

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

             

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

            • 3. Re: S29GL01GTのワードプログラミングについて
              KaKi_1384211

              Hi,

               

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

               

              Thanks and regards,

               

              • 5. Re: S29GL01GTのワードプログラミングについて
                KaSa_2847381

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

                 

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

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

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

                • 6. Re: S29GL01GTのワードプログラミングについて
                  KaKi_1384211

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

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

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

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

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

                   

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

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

                   

                  Thanks and regards,

                   

                   

                   

                  • 7. Re: S29GL01GTのワードプログラミングについて
                    KaSa_2847381

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

                     

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

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

                    をしております。

                     

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

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

                     

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

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

                    ないと考えております。

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

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

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

                    • 8. Re: S29GL01GTのワードプログラミングについて
                      KaKi_1384211

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

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

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

                       

                      Thanks and regards,

                       

                       

                      • 9. Re: S29GL01GTのワードプログラミングについて
                        KaSa_2847381

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

                         

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

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

                        助かりました。

                        • 10. Re: S29GL01GTのワードプログラミングについて
                          KaKi_1384211

                          良かったです。

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