2 Replies Latest reply on Jun 4, 2020 7:01 PM by HiOm_1802421
      • 2. Re: Community Translation - CRC-32 Parameters Used in Cypress S26KL-S/S26KS-S HyperFlash™ Family - KBA223179
        HiOm_1802421

        Hi,

        I tried to translate this KBA223179 into Japanese.

         

        CRC-32 Parameters Used in Cypress S26KL-S/S26KS-S HyperFlash™ Family - KBA223179

        ==========

        タイトル:サイプレスS26KL-S/S26KS-S HyperFlash™ファミリで使用されるCRC-32パラメータ

         

        バージョン:**

         

        質問:

        ソフトウェアベースのCRC-32計算機で、HyperFlashのハードウェアCRC-32計算機と同じ結果を得るには、どの多項式、初期値、および出力XOR値を使用する必要がありますか?

         

        回答:

        HyperFlashファミリーのデバイスに組み込まれたハードウェアCRC-32計算機は、次のパラメーターを使用します。

         

        パラメータ

        多項式

        0x1EDC6F41

        初期値

        0x00000000

        出力XOR値

        0x00000000

        入力反転

        No

        出力反転

        No

         

        多項式 0x1EDC6F41 は、一般的に次のように表されます。

        X 32 + X 28 + X 27 + X 26 + X 25 + X 23 + X 22 + X 20 + X 19 + X 18 + X 14 + X 13 + X 11 + X 10 + X 9 + X 8 + X 6 + 1

         

        CRC-32パラメータに加えて、次の図で示すようにHyperFlashのCRC-32計算機で使用されるデータの順序にも注意する必要があります。

        Untitled.png

         

        たとえば、下位ワードと上位ワードがそれぞれ0xF42Dと0x8CCFであり、ソフトウェア ベースのCRC-32計算機が8ビットのバイト ストリームを取る場合、入力データ バイトは 0xF4 - 0x2D - 0x8C - 0xCF の順序である必要があります。

        次のCソースコードと表に、簡単なソフトウェアCRC-32計算機の例と、参考のためのいくつかの計算結果を示します。

         

        uint32 Calculate_CRC32(const uint8 *byte_data, uint32 byte_count)

        {

               uint32 pos, i;

               uint32 crc = 0; /* Initial Value */

         

               for (pos = 0; pos < byte_count; pos++)

               {

                      crc ^= (uint32)(byte_data[pos] << 24);

         

                      for (i = 0; i < 8; i++)

                      {

                             if ((crc & 0x80000000) != 0)

                                   crc = (uint32)((crc << 1) ^ 0x1EDC6F41); /* Polynomial */

                             else

                                   crc <<= 1;

                      }

               }

         

               return crc;

        }

         

        void Test_CRC32(void)

        {

               uint16 sample_data[4] = {0xF42D, 0x8CCF, 0xF646, 0x3129};

               uint32 crc;

         

               /* Swap byte order for Little Endian systems */

               uint32 i;

               for (i = 0; i < 4; i++)

               {

                      sample_data[i] = ((sample_data[i] >> 8) & 0xFF) | ((sample_data[i] & 0xFF) << 8);

               }

         

               crc = Calculate_CRC32((uint8 *)sample_data, 8);

         

               printf("CRC-32: %08X\n", crc);

        }

         

        サンプル データ

        CRC-32値

        0xF42D, 0x8CCF, 0xF646, 0x3129

        0x22531137

        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF

        0xB29FF223

        0x0123, 0x4567, 0x89AB, 0xCDEF

        0xBAA822E2

         

        ==========

         

        BR,

        Omoi