忍者ブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2025/05/22

dsPIC33CH Curiosity Development Board(CRCモジュールの使い方):

CRCとは巡回冗長検査といい誤り検出符号の一種で主にデータ転送に伴うエラーの検出に使われています。よく使われるパリティチェック(データ内のビットが1の個数が偶数か奇数かでエラー判定する手法)や合計値チェック(すべてのバイトの合計値を使いエラーを判定する手法)よりも検出精度が高いのが特徴です。 dsPIC33CHには32bit幅まで扱えるCRCモジュールが1ch搭載されており、各種アルゴリズムに対応可能となっております。
今回はCRC-8-ATM 「x^8+x^2+x+1」という多項式を用い、4バイト長のデータから1バイトのCRCデータを算出します。

ハードウェア構成

下図のようにCRCモジュールにデータを転送し、結果を出力する単純な構成になっています。 


  ソースコード

コンフィグレーション設定やクロック設定の関数に関して記述を省略していますが「dsPIC33CH Curiosity Development Board(準備編)」と同じです。
message[]という変数を3回CRC計算して、出力結果が同一で有る事を確認します。

/*----------------------------------------------------------------------------------*/
/*【INC】インクルードファイル*/
/*----------------------------------------------------------------------------------*/
#include 
#include 
#include 
/*----------------------------------------------------------------------------------*/
/*【CONST】定数定義*/
/*----------------------------------------------------------------------------------*/
#define CRC_8           0
#define CRC_8_DVB_S2    1

#define CRC_ALGORITHM   CRC_8_ATM

#if (CRC_ALGORITHM == CRC_8_ATM)
    #define CRC_POLYNOMIAL ((unsigned int)0x0007)
    #define CRC_SEED_VALUE ((unsigned short)0x0000)// non-direct of 0x0000
#elif (CRC_ALGORITHM == CRC_8_DVB_S2)
    #define CRC_POLYNOMIAL ((unsigned int)0x00D5)
    #define CRC_SEED_VALUE ((unsigned short)0x0000)// non-direct of 0x0000
#endif
/*-------------------------------------------------------------------*/
/*【VARI】変数定義*/
/*-------------------------------------------------------------------*/
volatile unsigned char message[] = {0x44,0x43,0x42,0x41};   //送信メッセージ
volatile unsigned short crcResultCRC16 = 0;
/*-------------------------------------------------------------------*/
/*【PROTO】プロトタイプ宣言*/
/*-------------------------------------------------------------------*/
static unsigned short CRC_Calc(unsigned char *u1pa_Data,unsigned int u1a_Length);
/*-------------------------------------------------------------------*/
/* Main関数 */
/*-------------------------------------------------------------------*/
int main(void)
{
 	uint32_t u4l_Result[4];
    /*------------------------------------------------------------------------------*/
    /* クロック初期化*/
    /*------------------------------------------------------------------------------*/
        vds_Main_Init_Clock_Register();     /* クロック初期化 */
    /*------------------------------------------------------------------------------*/
    /* メインルーチン*/
    /*------------------------------------------------------------------------------*/
        while (1)
        {
            u4l_Result[0] = CRC_Calc(message , 4); //1回目
            u4l_Result[1] = CRC_Calc(message , 4); //2回目
            u4l_Result[2] = CRC_Calc(message , 4); //3回目
            while (1)
            {
               Nop() ;
            }
        }
        return 1; 
}


CRC_Calc(unsigned char *u1pa_Data,unsigned int u1a_Length) { /*-------------------------------------------------------------------*/ /* CRCレジスタ設定*/ /*-------------------------------------------------------------------*/ CRCCONL = 0x00u; CRCCONH = 0x707u; CRCCONLbits.CRCEN = 1u; CRCXORL = CRC_POLYNOMIAL; CRCXORH = 0x00u; CRCWDATL = 0x00u; CRCWDATH = 0x00u; CRCCONLbits.CRCGO = 1; /*-------------------------------------------------------------------*/ /* CRCデータレジスタにデータ転送*/ /*-------------------------------------------------------------------*/ while(u1a_Length > 0) { *((uint8_t *)&CRCDATL) = *u1pa_Data++; u1a_Length --; } CRCCONLbits.CRCGO = 1; /*-------------------------------------------------------------------*/ /* データフラッシュ*/ /*-------------------------------------------------------------------*/ while(IFS3bits.CRCIF == 0u){;} CRCCONLbits.CRCGO = 0u; IFS3bits.CRCIF = 0u; *((uint8_t *)&CRCDATL) = 0x00u; CRCCONLbits.CRCGO = 1u; /*-------------------------------------------------------------------*/ /* データクリーンナップ*/ /*-------------------------------------------------------------------*/ while(IFS3bits.CRCIF == 0u){;} CRCCONHbits.DWIDTH = 8 - 1; CRCCONLbits.CRCGO = 0u; IFS3bits.CRCIF = 0u; return((uint32_t)CRCWDATL & 0xFF); }

結果

3回とも同一の結果が戻ってくると思います。
    

PR

2020/08/23 dsPIC33C Comment(0)

COMMENT

COMMENT FORM

NAME
MAIL
WEB
TITLE
COMMENT
PASSWORD

プロフィール
 
HN:
ぴくお
性別:
非公開
 
 
カテゴリー
 
 
 
最新記事
 
(10/03)
(09/05)
(08/23)
(08/17)
(08/16)
 
 
RSS
 
 
 
リンク
 
 
 
免責事項
当サイトに掲載の回路図やプログラム等は動作する事を期待して掲載しておりますが、その動作の保証、性能の保証は致しません。 また掲載されているソフトウェアの使用により生じたいかなる損害に関しまして作者は一切責任を負いません。