サイプレスS26KL-S/S26KS-S HyperFlash™ファミリで使用されるCRC-32パラメータ - KBA223179 - Community Translated (JA)

Version 1

    Community Translated by  HiOm_1802421           Version: **

     

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

     

    質問:

    ソフトウェアベースの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