Renesas Synergy™

FAQ 1010362 : RXファミリ用C/C++コンパイラの最適化リンケージエディタの機能により算出したCRC-CCITTの結果と、RXマイコンに搭載されたCRC演算器によるCRC-CCITTの結果が一致しません。

回答

リンケージエディタでのCRC-CCITTの演算方法に合わせて、CRC演算器の設定を変更してください。

  リンケージエディタ CRC演算器のデフォルト
初期値 0xFFFF 0x0000
演算方向 MSBファースト LSBファースト
演算結果 反転出力 非反転出力

 

 設定例:
CRC.CRCCR.BYTE = 0x87; // CRC-CCITT, MSB first
CRC.CRCDOR = 0xffff; // set 0xffff as initial value
CRC.CRCDIR = g_data[0];
:
CRC.CRCDIR = g_data[9];
result_hw_crc_ccitt = ~CRC.CRCDOR; // inverts the result

 PDG(Peripheral Drive Generator)使用時の設定例:
R_PG_CRC_Set(); // set to CRC-CCITT, MSB first by PDG GUI
CRC.CRCDOR = 0xffff; // set 0xffff as initial value
R_PG_CRC_InputData( g_data[0] );
:
R_PG_CRC_InputData( g_data[9] );
R_PG_CRC_GetResult( &result );
result = ~result; // inverts the result

* エラー処理および変数宣言は省略しています。

 RPDL(Renesas Peripheral Driver Library)使用時の設定例:
R_CRC_Create(
PDL_CRC_POLY_CRC_CCITT | PDL_CRC_MSB_FIRST
); // set to CRC-CCITT, MSB first by PDG GUI
CRC.CRCDOR = 0xffff; // set 0xffff as initial value
R_CRC_Write( g_data[0] );
:
R_CRC_Write( g_data[0] );
R_CRC_Read( PDL_CRC_RETAIN_RESULT, &result);
result = ~result; // inverts the result

* エラー処理および変数宣言は省略しています。

また、E1またはE20エミュレータを使用している場合、以下に該当していないか確認してください。

  1. プログラム中に全FFh以外のIDコードを記載している場合
    E1またはE20エミュレータでデバッグ中にプログラムをダウンロードした場合、ユーザプログラムに記載されたIDコードは書き込まれません。 常に全FFhが書き込まれます。

    例:
    E1またはE20エミュレータで書き込みを行った場合
    IDコードの値:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFh(全FFhになります)

     

  2. FINE接続でマイコンと接続している場合(JTAG接続の場合は該当しません)
    E1またはE20エミュレータ起動時にエミュレータ制御用のコードとしてオプション機能選択レジスタ1(OFS1:アドレスFFFFFF88h-FFFFFF8Bh)のbit24に0が書き込まれます。

    例:
    E1またはE20エミュレータ起動時
    OFS1の値:FEFFFFFFh(bit24が0になります)

上記に該当する場合、以下のいずれかの方法でCRC演算の評価を行ってください。

  • E1またはE20エミュレータを使用する場合はIDコード領域(アドレスFFFFFFA0h-FFFFFFAFh)およびOFS1レジスタ(アドレスFFFFFF88h-FFFFFF8Bh)を演算対象から外してください。
  • エミュレータを使用せず、マイコン単体で行ってください。

 

適用製品

RX ファミリ
RXファミリ用C/C++コンパイラパッケージ
Peripheral Driver Generator
Renesas Peripheral Driver Library
E1 [R0E000010KCE00]
E20 [R0E000200KCT00]
他にご質問がございましたら、リクエストを送信してください