42
© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-1 3232 ビット プログラマブル CRC 60 セクション 60. 32 ビット プログラマブル巡回冗長検査 (CRC) ハイライト 本セクションには以下の主要項目を記載しています。 60.1 はじめに....................................................................................................................... 60-2 60.2 CRC の概要 ................................................................................................................. 60-3 60.3 レジスタ....................................................................................................................... 60-4 60.4 CRC エンジン.............................................................................................................. 60-8 60.5 制御ロジック ............................................................................................................... 60-9 60.6 CRC モジュールのアプリケーション........................................................................ 60-16 60.7 省電力モード時の動作 ............................................................................................... 60-37 60.8 リセットの影響.......................................................................................................... 60-37 60.9 関連アプリケーション ノート ................................................................................... 60-38 60.10 改訂履歴..................................................................................................................... 60-39 注意 : この日本語版文書は参考資料としてご利用ください。 最新情報は必ずオリジナルの英語版をご参照願います。

PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

注意 : この日本語版文書は参考資料としてご利用ください。 最新情報は必ずオリジナルの英語版をご参照願います。

セクション 60. 32 ビット プログラマブル巡回冗長検査 (CRC)

3232ビット

プログラマブル

CRC

60

ハイライト

本セクションには以下の主要項目を記載しています。

60.1 はじめに....................................................................................................................... 60-260.2 CRC の概要 ................................................................................................................. 60-360.3 レジスタ....................................................................................................................... 60-460.4 CRC エンジン .............................................................................................................. 60-860.5 制御ロジック ............................................................................................................... 60-960.6 CRC モジュールのアプリケーション ........................................................................ 60-1660.7 省電力モード時の動作 ............................................................................................... 60-3760.8 リセットの影響.......................................................................................................... 60-3760.9 関連アプリケーション ノート ................................................................................... 60-3860.10 改訂履歴..................................................................................................................... 60-39

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-1

Page 2: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

60.1 はじめに

32 ビット プログラマブル巡回冗長検査 (CRC) モジュールは、ソフトウェアで構成できる CRC ジェネレータです。このモジュールを使うと、各種の通信およびセキュリティ アプリケーショ ン向けにチェックサムを高速に生成するハードウェア実装が可能です。CRC エンジンは、CPUに負荷をかけずに CRC チェックサムを計算し、しかもソフトウェアで実装するよりも大幅に高速です。

プログラマブル CRC ジェネレータには以下の特長があります。

• プログラマブルな最大 32 ビットの CRC 多項式

• 選択可能なシフト方向 ( リトルエンディアン / ビッグエンディアン )• 独立したデータ長と多項式長

• 設定可能な割り込み出力

• データ FIFOプログラマブル CRC ジェネレータ モジュールは 2 つの部分 ( 制御ロジックと CRC エンジン ) に分けられます。制御ロジックはレジスタ インターフェイス、データ FIFO、割り込みジェネ レータ、CRC エンジン インターフェイスを備えます。CRC エンジンは CRC カリキュレータ を備え、これは XOR 機能を備えたシリアルシフタを使って実装されます。概略ブロック図を図 60-1 に示します。

図 60-1: プログラマブルCRCジェネレータの概略ブロック図

Note: ファミリ リファレンス マニュアルの本セクションは、デバイス データシートの補 足を目的としています。本セクションの内容は、PIC32 ファミリの一部のデバイスには対応していません。

本書の内容がお客様のお使いになるデバイスに対応しているかどうかは、最新デバイス データシートの「32 ビット プログラマブル巡回冗長検査 (CRC) ジェネレー タ」の冒頭に記載している注意書きでご確認ください。

デバイス データシートとファミリ リファレンス マニュアルの各セクションは、 Microchip社のウェブサイト(http://www.microchip.com)からダウンロードできます。

Shift Buffer

CRC Shift Engine

CRCWDAT

LENDIAN1

CRCISEL

10

FIFO Empty Event

Shift Complete

Set CRCIFPeripheral Clock

0

Event

Variable FIFO(4x32, 8x16 or 16x8)

CRCDAT

DS60001336C_JP- p.60-2 © 2015-2016 Microchip Technology Inc.

Page 3: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

60.2 CRCの概要

チェックサムとは、複数バイトを格納した個々のメッセージまたはデータブロックに関連付けられる固有の数値です。通信用のデータパケットにせよメモリに保存したデータブロックにせよ、チェックサム等の情報は、それらのデータを処理する前の検証に役立ちます。最も単純な方法として、メッセージ内のデータバイトを全て加算する事によってチェックサムを計算できます。しかし、バイト単位で反転したり並び順を入れ換えたりしてメッセージが改変された場合、このような方法では誤りを検出できません。また、メッセージの NULL バイトが追加された場合も検出できません。 巡回冗長検査(CRC)はこのような単純な方法に比べると複雑ですが、信頼性の高い誤り検出アルゴリズムです。CRC アルゴリズムはメッセージをバイナリビット ストリームとして扱い、 これを決められたバイナリ値で除算した時の余りをチェックサムとみなします。通常の除算と同様に、CRC 計算も反復処理です。ただし、これらの演算は mod2 によるモジュロ演算で実行されるという点が異なります。例えば、除算は XOR 演算 ( すなわちキャリーなしの減算 ) に置き換えられます。CRC アルゴリズムは、全ての計算に多項式の項を使います。除数、被除数、余りのバイナリ値の各桁は、多項式の各項の係数に割り当てられます。例えば、値 25h (11001) を下式のように表現します。

式 60-1:

CRC 計算では、まず適当な除数を選択します。この除数は生成多項式と呼ばれます。生成多項式の選択によって CRC の誤り検出能力が異なるため、アプリケーションに合わせて適切な長さの生成多項式を選択する必要があります。多くのアプリケーションで広く一般的に用いられる生成多項式もいくつか存在しますが、本書ではそのような特定の多項式の誤り検出能力については取り上げません。 CRC アルゴリズムは簡単にソフトウェアに組み込めます。しかしシフト、ビット検査、XOR演算等の基本要件を実装するには、かなりの CPU 処理能力が必要です。さらに、CRC 計算は対話型処理であるため、データ転送命令による追加のソフトウェア オーバーヘッドがマイクロ コントローラの MIPS 要件にとって著しい重荷となります。しかし、ソフトウェアで構成できる CRC ハードウェア モジュールでは、最小限のソフトウェア オーバーヘッドで高速に CRC チェックサムを計算できます。

(1 * x4) + (1 * x3) + (0 * x2) + (0 * x1) + (1 * x0) or x4 + x3 + x0

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-3

Page 4: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32

ファ

ミリ

リフ

ァレ

ンス

マニ

ュア

DS60001336C

_JP- p.60-4

© 2015-2016 M

icrochip Technology Inc.

り込み生成を含むモジュールの全ての機能を

5 Bit 20/4 Bit 19/3 Bit 118/2 Bit 17/1 Bit 16/0

PLEN<4:0>

L CRCGO LENDIAN MOD — —

トオフセットしています。対応するレジスタを使って、そ

れクリア、セット、反転されます。これらのレジスタからの

60.3 レジスタ

CRC モジュールは以下の特殊機能レジスタ (SFR) を使います。

• CRCCON: CRC 制御レジスタ

このレジスタは、データと多項式サイズ、アキュムレータとエンディアンモード、割制御します。

• CRCXOR: CRC XOR レジスタ

このレジスタはCRC多項式を設定します。

• CRCDAT: CRC FIFO データレジスタ ( 書き込み専用 )このレジスタは計算用の初期データを読み込みます。

• CRCWDAT: CRC データシフト レジスタ

このレジスタは初期CRC値を読み込み、計算終了時に最終結果を保持します。

表 60-1 とレジスタ 60-1 ~レジスタ 60-4 は CRC モジュール レジスタの内容です。

表 60-1: CRC 関連 SFR のまとめ (1)

レジスタ名ビット

レンジBit 31/15 Bit 30/14 Bit 29/13 Bit 28/12 Bit 27/11 Bit 26/10 Bit 25/9 Bit 24/8 Bit 23/7 Bit 22/6 Bit 21/

CRCCON 31:16 — — — DWIDTH<4:0> — — —15:0 ON — SIDL VWORD<4:0> CRCFUL CRCMPT CRCISE

CRCXOR 31:16 X<31:16>

15:0 X<15:0>

CRCDAT 31:16 DATA<31:16>

15:0 DATA<15:0>

CRCWDAT 31:16 SDATA<31:16>

15:0 SDATA<15:0>

Note 1:全てのレジスタには対応するクリア / セット / 反転レジスタがあり、接尾辞はそれぞれ -CLR/-SET/-INV、アドレスはそれぞれ 0x4/0x8/0xC バイ

のメインレジスタを編集します。対応するレジスタのビット位置に「1」を書き込むと、メインレジスタ内の対応する有効なビットがそれぞ

読み出しは無視されます。

Page 5: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

レジスタ 60-1: CRCCON: CRC制御レジスタ

ビットレンジ

Bit31/23/15/7

Bit30/22/14/6

Bit29/21/13/5

Bit28/20/12/4

Bit27/19/11/3

Bit26/18/10/2

Bit25/17/9/1

Bit24/16/8/0

31:24U-0 U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

— — — DWIDTH<4:0>

23:16U-0 U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

— — — PLEN<4:0>

15:8R/W-0 U-0 R/W-0 R-0 R-0 R-0 R-0 R-0

ON — SIDL VWORD<4:0>

7:0R-0 R-1 R/W-0 R/W-0 R/W-0 R/W-0 U-0 U-0

CRCFUL CRCMPT CRCISEL CRCGO LENDIAN MOD — —

凡例 :R = 読み出し可能ビット W = 書き込み可能ビット U = 未実装ビット、「0」として読み出し

-n = POR 時の値 1 = ビットはセット 0 = ビットはクリア x = ビットは未知

bit 31-29 未実装: 「0」として読み出し

bit 28-24 DWIDTH<4:0>: データワード幅コンフィグレーション ビット

データワードの幅を設定します(実際のデータ幅より1つ小さい値を設定)。bit 23-21 未実装: 「0」として読み出し

bit 20-16 PLEN<4:0>: 多項式長コンフィグレーション ビット

CRC多項式の長さを設定します(実際の長さより1つ小さい値を設定)。bit 15 ON: CRCイネーブルビット

1 = モジュールを有効にする0 = モジュールを無効にする

bit 14 未実装: 「0」として読み出し

bit 13 SIDL: アイドル中CRC停止ビット

1 = デバイスがアイドルに移行するとモジュールは動作を停止する0 = アイドル中でもモジュールは動作を継続する

bit 12-8 VWORD<4:0>: カウンタ値ビット

FIFOバッファ内の未処理ワード数を示します。バッファ深さはデータワードサイズによって決まります。

bit 7 CRCFUL: CRC FIFOフルビット

1 = FIFOはフルである0 = FIFOはフルではない

bit 6 CRCMPT: CRC FIFOエンプティビット

1 = FIFOはエンプティである0 = FIFOはエンプティではない

bit 5 CRCISEL: CRC割り込み選択ビット

1 = FIFOがエンプティになると(データの最終ワードがCRCでまだシフト中)に割り込みを生成する0 = シフトの完了時に割り込みを生成する(FIFOはエンプティであり、かつシフトバッファからシフトされ

るデータはない)bit 4 CRCGO: CRCシフト開始ビット

1 = CRCシリアルシフタの動作を開始する。このビットがクリアされるとシフトを中止する0 = CRCシリアルシフトを停止する

bit 3 LENDIAN: リトルエンディアン データワード コンフィグレーション ビット

1 = LSb (リトルエンディアン)を先頭にデータワードをCRCへシフトする(入力データの順番を反転する)0 = MSb (ビッグエンディアン)を先頭にデータワードをCRCへシフトする(入力データの順番を反転しない)

bit 2 MOD: CRC動作モード選択ビット

1 = オルタネート モード: ビットn後にシフトバッファ データとCRCシフトエンジンのXORを求める0 = レガシーモードビット0前にシフトバッファ データとCRCシフトエンジンのXORを求める

bit 1-0 未実装: 「0」として読み出し

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-5

Page 6: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

レジスタ 60-2: CRCXOR: CRC XORレジスタ

ビットレンジ

Bit31/23/15/7

Bit30/22/14/6

Bit29/21/13/5

Bit28/20/12/4

Bit27/19/11/3

Bit26/18/10/2

Bit25/17/9/1

Bit24/16/8/0

31:24R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

X<31:24>

23:16R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

X<23:16>

15:8R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

X<15:8>

7:0R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

X<7:0>

凡例 :R = 読み出し可能ビット W = 書き込み可能ビット U = 未実装ビット、「0」として読み出し

-n = POR 時の値 1 = ビットはセット 0 = ビットはクリア x = ビットは未知

bit 31-0 X<31:0>: 多項式項xnのXORイネーブルビット

1 = 多項式項xnをCRC多項式で使う 0 = 多項式項を使わない

レジスタ 60-3: CRCDAT: CRC FIFOデータレジスタ(書き込み専用)

ビットレンジ

Bit31/23/15/7

Bit30/22/14/6

Bit29/21/13/5

Bit28/20/12/4

Bit27/19/11/3

Bit26/18/10/2

Bit25/17/9/1

Bit24/16/8/0

31:24W-0 W-0 W-0 W-0 W-0 W-0 W-0 W-0

DATA<31:24>

23:16W-0 W-0 W-0 W-0 W-0 W-0 W-0 W-0

DATA<23:16>

15:8W-0 R/W-0 W-0 W-0 W-0 W-0 W-0 W-0

DATA<15:8>

7:0W-0 R/W-0 W-0 W-0 W-0 W-0 W-0 W-0

DATA<7:0>

凡例 :R = 読み出し可能ビット W = 書き込み可能ビット U = 未実装ビット、「0」として読み出し

-n = POR 時の値 1 = ビットはセット 0 = ビットはクリア x = ビットは未知

bit 31-0 DATA<31:0>: FIFOデータビット

このレジスタに書き込まれたデータは、CRC FIFOバッファ内の次の空きバッファに書き込まれます。このレジスタを読み出すと値「0」が返されます。

DS60001336C_JP- p.60-6 © 2015-2016 Microchip Technology Inc.

Page 7: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

レジスタ 60-4: CRCWDAT: CRCデータシフト レジスタ

ビットレンジ

Bit31/23/15/7

Bit30/22/14/6

Bit29/21/13/5

Bit28/20/12/4

Bit27/19/11/3

Bit26/18/10/2

Bit25/17/9/1

Bit24/16/8/0

31:24R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

SDATA<31:24>

23:16R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

SDATA<23:16>

15:8R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

SDATA<15:8>

7:0R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

SDATA<7:0>

凡例 :R = 読み出し可能ビット W = 書き込み可能ビット U = 未実装ビット、「0」として読み出し

-n = POR 時の値 1 = ビットはセット 0 = ビットはクリア x = ビットは未知

bit 31-0 SDATA<31:0>: シフトレジスタ データビット

このレジスタに書き込むと、CRCエンジン シフトレジスタに直接書き込まれて現在値を上書きします。このレジスタを読み出すと、CRCエンジン シフトレジスタの現在値が返されます。

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-7

Page 8: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

60.4 CRCエンジン

60.4.1 汎用 CRC エンジン CRC エンジンはシリアルシフト式 CRC カリキュレータで、マルチプレクサの設定によって設定変更できます。このエンジンは、MOD ビット (CRCCON<2>) でシフトバッファ データの導 入位置を設定する事もできます。CRC シフトエンジンの簡略化したブロック図を図 60-2 に示 します。

CRC アルゴリズムは、 バイナリ除算の代わりに XOR 演算を使って計算処理を単純にします。 生成多項式の係数の設定には CRCXOR<31:1> ビットを使用します。 どちらかのビットに 「1」 を書き込むと、 多項式の対応する項の XOR 演算が有効になります。 多項式の長さは、CRCCON レジスタ (CRCCON<20:16>) の PLEN<4:0> で設定します。PLEN<4:0>の値が示す多項式の長さに基づいてマルチプレクサを切り換え、 フィードバックを始めるタップ位置を指定します。

CRC 計算の結果は CRCWDAT レジスタから読み出せます。

図 60-2: CRCシフトエンジンの詳細

CRCWDAT

Bit 0

X(0)(1) X(1)(1)

Read/Write Bus

X(2)(1) X(n)(1)

Bit 1 Bit 2 Bit n(2)Shift BufferData

CRCWDAT

Bit 0

X(0) X(1)(1)

Read/Write Bus

X(2)(1) X(n)(1)

Bit 1 Bit 2 Bit n(2)

Shift BufferData

Legacy Mode (MOD bit = 0)

Alternate Mode (MOD bit = 1)

Note 1:シフトエンジンの各 XOR 段はプログラマブルです。詳細は本文を参照してください。

2: 多項式の長さ n は (PLEN<4:0> + 1) です。

DS60001336C_JP- p.60-8 © 2015-2016 Microchip Technology Inc.

Page 9: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

60.5 制御ロジック

60.5.1 多項式インターフェイス

CRC モジュールには、32 ビットを使って最大で 32 次の CRC 多項式をプログラミングできます。多項式の次数 ( 最高指数 ) を表す多項式の長さは、PLEN<4:0> ビット (CRCCON<20:16>)で選択します。CRCXOR レジスタは、どの指数項を計算式に含めるのかを設定します。特定のビットをセットすると、そのビットに対応する指数項が多項式に含められます。これにより、CRC エンジンは対応するビットで XOR 演算を実行します。ビットをクリアすると、その項のXOR 演算は無効になります。 以下に、16 ビットと 32 ビットの CRC 多項式の例を示します ( 式 60-2)。これらの多項式を CRC ジェネレータにプログラミングするには、レジスタの各ビットを表 60-2 のように設定し ます。

式 60-2:

表 60-2: CRC の構成例 : 16 ビットと 32 ビットの多項式

多項式で使う項に対応するビットを「1」にセットしている事に注目してください ( 例 : X26 と X23)。多項式の最上位ビット (MSb) は計算に影響を与えないため任意の値に設定してかまいません。

60.5.2 データのシフト方向

シフト方向の設定には LENDIAN ビット (CRCCON<3>) を使います。既定値 (LENDIAN = 0) の 場合、CRCモジュールはMSbを先頭にCRCエンジンを通してデータをシフトします。LENDIANを「1」にセットすると、CRC モジュールは LSb を先頭にデータをシフトします。この設定により、ソフトウェアでのビット順序の反転によるオーバーヘッドなしで、各種通信方式に対応できます。この動作はデータをエンジンにシフトインする方向だけを変更する事に注意してください。CRC 計算の結果は通常のままであり、反転されません。 PIC32 はリトル エンディアンのデバイスです。CRC モジュールをビッグ エンディアンに設定 する場合 (LENDIAN = 0)、入力データのバイトとワードをアプリケーション コード内でスワッ プしてからデータ FIFO (CRCDAT レジスタ ) に書き込む必要があります。

CRC 制御ビットビット値

16 ビット多項式 32 ビット多項式

PLEN<4:0> 01111 11111

X<31:16> 0000 0000 0000 0000 0000 0100 1100 0001

X<15:1> 0001 0000 0010 0001 0001 1101 1011 0111

x16 + x12 + x5 + 1and

x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-9

Page 10: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

60.5.3 データ FIFOCRC モジュールは可変データ幅の FIFO を備えます。データ幅は、DWIDTH<4:0> ビット(CRCCON<28:24>) で定義します。1 ~ 32 ビットの間で設定できます。FIFO 関連のロジックは、5 ビットカウンタ (VWORD<4:0> ビット (CRCCON<12:8>)) が含まれます。 VWORD<4:0> ビットの値は FIFO 内の未処理データエレメントの数を示します。FIFO は以下のように設定できます。

• 16 ワード段 : DWIDTH<4:0> ≤ 7 ( データワードが 8 ビット幅以下 ) の場合

• 8 ワード段 : DWIDTH<4:0> ≤ 15 ( データワードが 9 ~ 16 ビット幅の場合 )• 4 ワード段 : DWIDTH<4:0> ≤ 31 ( データワードが 17 ~ 32 ビット幅の場合 )CRC の計算に使うデータは CRCDAT レジスタ経由で FIFO に書き込む必要があります。CRCDAT を読み出すと常に 0 が返されます。MSb からシフトインするには (LENDIAN = 0)、 FIFO への格納時にソフトウェアでバイトとワードのスワップを実行する必要があります。

シフトが全て終了 (FIFO がエンプティになり、CRC シフトエンジンがアイドルに移行 ) すれば、データの損失またはCRC結果の破壊なしにFIFO幅(DWIDTH<4:0>ビット)を変更できます。

データ幅が 8 ビット以下の場合、CRCDAT レジスタの下位バイトへ書き込むたびに FIFO がインクリメントします (CRCDAT レジスタへのバイトアクセスだけを使います )。FIFO 書き込みの最小データ単位は 1 バイトです。

例えば、DWIDTH<4:0> が 5 の場合、データサイズは DWIDTH<4:0> + 1 つまり 6 です。この データは 1 バイト (8 ビット ) データとして書き込まれ、未使用の上位 2 ビットは無視されます。CRCDAT レジスタにデータバイトを書き込むと、VWORD<4:0> ビット (CRCCON<12:8>)の値が 1 つインクリメントします。

データ幅が 8 ビット以上、16 ビット以下の場合、CRCDAT レジスタの下位 16 ビットワードへ書き込むたびに FIFO がインクリメントします (CRCDAT レジスタへの 16 ビットワード アク セスだけを使います )。未使用の上位データビットは無視されます。CRCDAT レジスタに書き込むたびに、VWORD<4:0> ビットの値がインクリメントします。

データ幅が 16 ビットよりも大きい場合、CRCDAT レジスタに書き込むたびに VWORD<4:0>ビットが 1 つインクリメントします。未使用の上位データビットは無視されます。

Note: CRCFUL ビットがセットされている時に CRCDAT レジスタに新しいデータを書き込んでも、それらのデータは無視される事に注意してください。

DS60001336C_JP- p.60-10 © 2015-2016 Microchip Technology Inc.

Page 11: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

60.5.4 CRC エンジン インターフェイス

60.5.4.1 FIFOか ら CRCシ フトエンジン

FIFOからCRCシフトバッファへのデータ移動を開始するには、CRCGOビット (CRCCON<4>)をセットする必要があります。シリアルシフタは、CRCGO = 1 かつ VWORD<4:0> の値が 0 より大きい場合、シフトバッファから CRC シフトエンジンへのデータシフトを開始します。LENDIAN = 0の場合は MSb を先頭に、LENDIAN = 1の場合は LSb を先頭に転送します。シフ ト開始前に CRCFUL ビットがセットされていた場合、VWORDx ビットが 1 つデクリメントした時にクリアされます。FIFO 内のデータがシフトバッファに移動されるたびに、VWORD<4:0>ビットが 1 つデクリメントします。シリアルシフタは VWORD<4:0> ビットが 0 に達するまでシフトを続行し、0 になった時点で CRCMPT ビットをセットして FIFO がエンプティである事を示します。CRC 計算中に CRCGO ビットがクリアされると、CRC シフトエンジンは CRCGOビットがセットされるまで計算を停止します。

アプリケーションは、シフト動作の実行中に FIFO に書き込む事ができます。その際、CRCFULビットを監視する必要があります。CRCFUL ビットがセットされていなければ、FIFO にもう1 ワード書き込む事ができます。VWORD<4:0> ビットの読み出し値が有効になるには、CRCDAT レジスタに書き込んだ後、少なくとも 1 命令サイクルが経過する必要があります。

VWORD<4:0> ビットが DWIDTH<4:0> ビットで設定された値に対応する最大値に達すると、CRCFUL ビットがセットされます。VWORD<4:0> ビットが 0 に達すると、CRCMPT ビットがセットされます。ON を「0」にすると FIFO はエンプティになり、VWORD<4:0> ビットが

「00000」にセットされます。

60.5.4.2 データシフトのクロックサイクル数

FIFO からのデータはシフトバッファに移動します。FIFO からシフトバッファにデータワードの移動を開始するには 2 周辺モジュール クロックサイクルが必要です。シフトバッファのデー タは続いて CRC シフトエンジンに移動します。シフトバッファから CRC シフトエンジンにデータを全て移動するには、(DWIDTH<4:0> + 1) のクロックサイクルが必要です。例えば DWIDTH<4:0> = 5の場合、データ長は 6 ビット (DWIDTH<4:0> + 1) であるため、シフトには 6 サイクルが必要です。この場合、1 バイトのうち 6 ビットだけがシフトアウトされます。各バイトの上位 2 ビットはドントケアビットです。同様に、12 ビット多項式を選択した場合、各ワードの上位 4 ビットが無視されます。

60.5.4.3 CRCの 初期値

CRC シフトエンジンへは CRCWDAT レジスタを介してアクセスします。このレジスタには、計算の開始前に必要な CRC 初期値を書き込む事ができます。初期値の形式は、MOD ビット(CRCCON<2>) で選択した動作モードによって決まります。

オルタネートモード (MOD = 1) の場合、CRC 初期値は直接形式である必要があります。

レガシーモード (MOD = 0) の場合、CRC 初期値は非直接形式である必要があります。非直接 初期値とは、必要な直接 CRC の初期値を与える CRC 計算の値です。例えば、アプリケーションが CRC-32 多項式 0x04C11DB7 を使い、CRC 直接初期値 0xFFFFFFFF から計算を開始する必要がある場合、CRCWDATL レジスタには非直接値の 0x46AF6449 を書き込む必要があります。この非直接値 0x46AF6449 の CRC は 0xFFFFFFFF です。CRCWDAT レジスタによってシフトエンジンに非直接初期値を書き込むと、(PLEN<4:0> + 1) 周辺モジュールクロックサイ クル後に CRC モジュールがこれを直接初期値に変換します。

通常、CRC 計算は毎回同じ初期値から開始します。その場合、非直接初期値の計算が必要なのは 1 回のみで、その後はアプリケーション コード内で定数として定義できます。

Note: CRCWDAT レジスタへの書き込みはシフトバッファをクリア ( リセット ) します。

Note: 0 に対する CRC 非直接初期値は 0 です。

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-11

Page 12: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-1 に、直接初期値から非直接初期値を得るソフトウェア ルーチンの例を示します。

例 60-1: 非直接初期値を求めるソフトウェア ルーチン

CRC モジュールを使って非直接初期値を得る事ができます。その手順は以下の通りです。

1. CRC モジュールを有効にして (ON = 1)、シフトする (CRCGO = 1)2. 多項式の値を右に 1 つシフトする

3. シフトした多項式の値のビット順序を反転する

4. その結果を CRCXOR レジスタに書き込む

5. データ幅と多項式の長さ (DWIDTH<4:0> および PLEN<4:0> ビット ) を多項式の次数 ( 長さ ) に設定する

6. 対象の直接初期値のビット順序を反転する

7. 反転した初期値を CRCWDAT レジスタに書き込む

8. CRCDAT レジスタにダミーデータを書き込み、2 周辺モジュール クロックサイクル待っ て FIFO からシフトバッファにデータを移動し、(PLEN<4:0> + 1) 周辺モジュール クロッ クサイクル待って結果をシフトアウトする

あるいは、CRC 割り込み選択ビットをクリアして (CRCISEL = 0)、シフトバッファからの シフト完了時に割り込みを受信し、CRC 割り込みフラグをクリアし、CRCDAT レジスタにダミーデータを書き込み、CRC 割り込みフラグがセットされるのを待つ

9. CRCWDAT レジスタから値を読み出す

10. 読み出し結果のビット順序を反転すると最終的な非直接初期値が得られる

unsigned long CalculateNonDirectSeed( unsigned long seed, // direct CRC initial valueunsigned long polynomial, // polynomialunsigned char polynomialOrder) // polynomial order{unsigned char lsb;unsigned char i;unsigned long msbmask;

msbmask = ((unsigned long)1)<<(polynomialOrder-1);for (i=0; i<polynomialOrder; i++) {

lsb = seed & 1;if (lsb) seed ^= polynomial;seed >>= 1;if (lsb) seed |= msbmask;

}return seed; // return the non-direct CRC initial value}

DS60001336C_JP- p.60-12 © 2015-2016 Microchip Technology Inc.

Page 13: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

例 60-2 に、この手順の実装例を示します。

計算途中にCRCの中間合計値を読み出す必要があるアプリケーションで、引き続きデータメッセージ全体に対する計算を実行する場合、非直接値を求めて再度 CRCWDAT レジスタに設定する必要があります。その場合の CRC 直接初期値は、読み出した中間の CRC 結果です。

例 60-2: 非直接初期値の計算(MODビット = 0)unsigned long CalculateNonDirectSeed(unsigned long seed,// direct CRC initial value

unsigned long polynomial, // polynomial unsigned char polynomialOrder) // polynomial order (valid values

// are 8, 16, 32 bits){

CRCCON = 0;CRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are

doneCRCCONbits.DWIDTH = polynomialOrder-1; // data widthCRCCONbits.PLEN = polynomialOrder-1; // polynomial lengthCRCCONbits.CRCGO = 1; // start CRC calculation

polynomial >>= 1; // shift the polynomial rightpolynomial = ReverseBitOrder(polynomial, polynomialOrder);// reverse bits order of the // polynomialCRCXOR = polynomial; // set the reversed polynomialseed = ReverseBitOrder(seed, polynomialOrder); // reverse bits order of seed valueCRCWDAT = seed; // set seed valueIFS0CLR = _IFS0_CRCIF_MASK; // clear interrupt flagswitch(polynomialOrder) // load dummy data to shift out

// seed result{

case 8: *((unsigned char*)&CRCDAT) = 0; // load byte while(!IFS0bits.CRCIF); // wait until shifts are done seed = CRCWDAT&0x0FFFF; // read reversed seed

case 16: *((unsigned short*)&CRCDAT) = 0; // load short while(!IFS0bits.CRCIF); // wait until shifts are done seed = CRCWDAT&0x00FFFF; // read reversed seed break;

case 32: // load long CRCDAT = 0; while(!IFS0bits.CRCIF); // wait for shifts are done seed = CRCWDAT; // read reversed seed break;

default: ;

}seed = ReverseBitOrder(seed, polynomialOrder); // reverse the bit order to get // the non-direct seedreturn seed; // return non-direct CRC initial

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-13

Page 14: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-2: 非直接初期値を求めるルーチン(MODビット = 0) (続き) // WHERE THE FUNCTION TO REVERSE THE BIT ORDER CAN BE

unsigned longReverseBitOrder(unsigned long data, // input dataunsigned char numberOfBits) // width of the input data,

// valid values are 8,16,32 bits{unsigned longmaskint = 0;unsigned longmaskout = 0;unsigned longresult = 0;unsigned chari;

switch(numberOfBits){

case 8: maskin = 0x80; maskout = 0x01; break;

case 16: maskin = 0x8000; maskout = 0x0001; break;

case 32: maskin = 0x80000000; maskout = 0x00000001; break;

default: ;

}for(i=0; i<numberOfBits; i++){

if(data&maskin){ result |= maskout;

} maskint >>= 1; maskout <<= 1;

}return result;

}

DS60001336C_JP- p.60-14 © 2015-2016 Microchip Technology Inc.

Page 15: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

60.5.4.4 CRC結 果 CRC の計算結果の読み出し方は、選択した動作モードで決まります。

オルタネートモード (MOD = 1) では、CRC FIFO バッファ内の全データ完了した時点で結果を CRCWDAT レジスタから読み出せます。ダミーデータを書き込んで追加サイクルを生成する事は必要ありません。

レガシーモード (MOD = 0) では、CRC モジュールは計算を終了するのにさらに (PLEN<4:0> + 1) 周辺モジュール クロックサイクルを必要とします。これらの追加サイクルを生成するため に、多項式の次数 ( 長さ ) に等しい幅のダミーデータを CRCDAT レジスタに書き込む必要があります。シフト完了後、CRC の最終結果は CRCWDAT レジスタから読み出せます (CRCWDATレジスタにより CRC シフトレジスタへ直接アクセスできます )。CRC の結果が得られたら、CRCWDAT レジスタに再度 CRC 非直接初期値を書き込み、シフトバッファ内のダミーデータをクリアして新たに計算を開始します。

60.5.5 割り込み動作

CRC モジュールは、ユーザの設定に従って以下の条件のどちらかで割り込みを生成します。CRCISEL が「1」の場合、VWORD<4:0> ビットが「1」から「0」に変化した時点で割り込みを生成します。CRCISEL が「0」の場合、FIFO がエンプティになってシフトバッファからのシフトが完了すると割り込みを生成します。CRC モジュールによっては永続的割り込み ( またはレベル割り込み ) を使う事ができます。これらのモジュールでは、データ FIFO がエンプティの場合、割り込みフラグをクリアする事はできません。割り込みフラグは、データが FIFO に書き込まれた後にクリアされる必要があります。

割り込みと割り込み優先度の設定に関する詳細は、『PIC32 ファミリ リファレンス マニュア ル』の『セクション 8. 割り込み』(DS60001108) を参照してください。

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-15

Page 16: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

60.6 CRCモジュールのアプリケーション

CRC は、複数のバイトまたはワードを格納したメッセージのデジタル通信における信頼性の高い誤り検査アルゴリズムです。計算後にチェックサムを付加して、受信者にメッセージを送信します。受信者は、受信したメッセージのチェックサムを計算する事でデータの完全性を検証します。

60.6.1 バリエーション

32 ビット プログラマブル CRC モジュールでは、MSb または LSb のどちらを先頭にシフトア ウトするのかを選択できます。MSb 先頭は、XMODEM プロトコルで採用されているため、広く用いられる方式です。通信プロトコルの 1 つである CCITT プロトコルの CRC 計算では、LSbを先頭にシフトアウトします。本書では個々の CRC 計算バリエーションについて説明しませんが、このモジュールを使えば、各種の CRC バリエーションを実装する事ができます。

多項式の長さと多項式そのものの選択はアプリケーションごとに異なります。各種の標準的な実装では、多項式の長さとして通常 5、7、8、10、12、16、32 を使います。以降のセクションでは、CRC 計算の推奨手順をステップごとに説明します。ユーザは、メッセージ ストリー ムに 0 を付加するのか 0 以外の値を付加するのかを選択できます。アプリケーションに応じて、ユーザはどのような値でも自由に付加する事ができます。

60.6.2 代表的な動作

代表的な CRC 計算にこのモジュールを使う場合、以下の手順を実行します。

1. ON ビットを設定してモジュールを有効にする

2. 目的とする動作に合わせて以下の通りモジュールを設定する

a) CRCXORレジスタとPLEN<4:0>ビットで必要な多項式を設定する

b) DWIDTH<4:0>とLENDIANビットでデータ幅とシフト方向を設定する

3. CRCGO ビットをセットして計算を始める

4. セクション 60.5.4.3「CRC の初期値」で説明した方法で CRCWDAT レジスタに必要なCRC 初期値を設定する

5. FIFO に空きができたら、CRCDAT レジスタに書き込む事で、FIFO に全てのデータを書き込む ( 次のデータを書き込むには CRCFUL ビットが 0 である必要がある )

6. データ FIFO がエンプティになる (CRCMPT ビットがセットされる ) のを待つ

7. セクション 60.5.4.4「CRC 結果」で説明した方法で CRC 結果を読み出す

DS60001336C_JP- p.60-16 © 2015-2016 Microchip Technology Inc.

Page 17: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

60.6.3 エッジ割り込みを行う CRC モジュールのアプリケーション例

例 60-3 ~例 60-12 に、エッジ割り込みを行うモジュール向けの、多項式の長さ、データ幅、シ フト方向、CRC エンジンモードの各種組み合わせの標準的なコードを示します。

例 60-3: CRC-SMBus (8ビット多項式、32ビットデータ、ビッグエンディアン、MODビット = 1)// This macro is used to swap bytes for big endian#define Swap(x) __extension__({ \unsigned long __x = (x), __v; \__asm__ ("wsbh %0,%1;\n\t" \"rotr %0,16" \: "=d" (__v) \: "d" (__x)); \__v; \})

// ASCII bytes "12345678"volatile unsigned char __attribute__((aligned(4))) message[] = {'1','2','3','4','5','6','7','8'};volatile unsigned char crcResultCRCSMBUS = 0;int main (void){unsigned long* pointer;unsigned short length;unsigned long data;

// standard CRC-SMBUS

#define CRCSMBUS_POLYNOMIAL ((unsigned long)0x00000007)#define CRCSMBUS_SEED_VALUE ((unsigned long)0x00000000)// direct initial value

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.LENDIAN = 0; // big endianCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 8-1; // 8-bit polynomial orderCRCXOR = CRCSMBUS_POLYNOMIAL; // set polynomialCRCWDAT = CRCSMBUS_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned long*)message; length = sizeof(message)/sizeof(unsigned long);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load from little endiandata = Swap(data); // swap bytes for big endianlength--;if(length == 0){

break;}CRCDAT = data; // 32-bit word access to FIFO

}CRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagCRCDAT = data; // write last data into FIFOCRCCONbits.CRCGO = 1; // resume CRC calculation

while(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRCSMBUS = (unsigned char)CRCWDAT&0x00ff; // get CRC result (must be 0xC7)

while(1);return 1;

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-17

Page 18: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-4: CRC-SMBus (8ビット多項式、32ビットデータ、リトルエンディアン、MODビット = 0)// This macro is used to swap bytes for big endian#define Swap(x) __extension__({ \unsigned long __x = (x), __v; \__asm__ ("wsbh %0,%1;\n\t" \"rotr %0,16" \: "=d" (__v) \: "d" (__x)); \__v; \})

// ASCII bytes "12345678"volatile unsigned char __attribute__((aligned(4))) message[] = {'1','2','3','4','5','6','7','8'};volatile unsigned char crcResultCRCSMBUS = 0;int main (void){unsigned long* pointer;unsigned short length;unsigned long data;

// standard CRC-SMBUS

#define CRCSMBUS_POLYNOMIAL ((unsigned long)0x00000007)#define CRCSMBUS_SEED_VALUE ((unsigned long)0x00000000) // non-direct initial value of zero

CRCCON = 0;CRCCONbits.MOD = 0; // legacy modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.LENDIAN = 0; // big endianCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 8-1; // 8-bit polynomial orderCRCXOR = CRCSMBUS_POLYNOMIAL; // set polynomialCRCWDAT = CRCSMBUS_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculationpointer = (unsigned long*)message; length = sizeof(message)/sizeof(unsigned long);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load from little endiandata = Swap(data); // swap bytes for big endianlength--;if(length == 0){break;

}CRCDAT = data; // 32-bit word access to FIFO

}

CRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagCRCDAT = data; // write last data into FIFOCRCCONbits.CRCGO = 1; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are doneCRCCONbits.DWIDTH = 8-1; // switch data width to polynomial length 8-bitCRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flag*((unsigned char*)&CRCDAT) = 0; // 8-bit dummy data to shift out the CRC resultCRCCONbits.CRCGO = 1; // resume CRC calculation

while(!IFS0bits.CRCIF); // wait until shifts are done crcResultCRCSMBUS = (unsigned char)CRCWDAT&0x00ff; // get CRC result (must be 0xC7)

while(1);return 1;

}

DS60001336C_JP- p.60-18 © 2015-2016 Microchip Technology Inc.

Page 19: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

例 60-5: CRC-16 (16ビットデータ、32ビット多項式、リトルエンディアン、MODビット = 1)// ASCII bytes "87654321"volatile unsigned short message[] = {0x3738,0x3536,0x3334,0x3132};volatile unsigned short crcResultCRC16 = 0;int main (void){unsigned short* pointer;unsigned short length;unsigned short data;

// standard CRC-16

#define CRC16_POLYNOMIAL ((unsigned long)0x00008005)#define CRC16_SEED_VALUE ((unsigned long)0x00000000)// direct initial value

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 16-1; // 16-bit data widthCRCCONbits.PLEN = 16-1; // 16-bit polynomial orderCRCXOR = CRC16_POLYNOMIAL; // set polynomialCRCWDAT = CRC16_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned short*)message;length = sizeof(message)/sizeof(unsigned short);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load datalength--;if(length == 0){break;

}*((unsigned short*)&CRCDAT) = data; // 16-bit word access to FIFO

}

CRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flag*((unsigned short*)&CRCDAT) = data; // write last data into FIFOCRCCONbits.CRCGO = 1; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC16 = (unsigned short)CRCWDAT; // get CRC result (must be 0xE716)

while(1);return 1;

}

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-19

Page 20: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-6: CRC-16 (16ビットデータ、16ビット多項式、リトルエンディアン、MODビット = 0)// ASCII bytes "87654321"volatile unsigned short message[] = {0x3738,0x3536,0x3334,0x3132};volatile unsigned short crcResultCRC16 = 0;int main (void){unsigned short* pointer;unsigned short length;unsigned short data;

// standard CRC-16

#define CRC16_POLYNOMIAL ((unsigned long)0x00008005)#define CRC16_SEED_VALUE ((unsigned long)0x00000000)// non-direct initial value of zero

CRCCON = 0;CRCCONbits.MOD = 0; // legacy modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 16-1; // 16-bit data widthCRCCONbits.PLEN = 16-1; // 16-bit polynomial orderCRCXOR = CRC16_POLYNOMIAL; // set polynomialCRCWDAT = CRC16_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned short*)message;length = sizeof(message)/sizeof(unsigned short);while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load data*((unsigned short*)&CRCDAT) = data; // 16-bit word access to FIFO

}

while(CRCCONbits.CRCFUL); // wait if FIFO is fullCRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flag*((unsigned short*)&CRCDAT) = 0; // 16-bit dummy data to shift out CRC resultCRCCONbits.CRCGO = 1; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC16 = (unsigned short)CRCWDAT; // get CRC result (must be 0xE716)

while(1);return 1;

}

DS60001336C_JP- p.60-20 © 2015-2016 Microchip Technology Inc.

Page 21: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

例 60-7: CRC-CCITT (16ビット多項式、16ビットデータ、ビッグエンディアン、MODビット = 1) // This macro is used to swap bytes for big endian#define Swap(x) __extension__({ \unsigned long __x = (x), __v; \__asm__ ("wsbh %0,%1;\n\t" \: "=d" (__v) \: "d" (__x)); \__v; \})// ASCII bytes "87654321"volatile unsigned short message[] = {0x3738,0x3536,0x3334,0x3132};volatile unsigned short crcResultCRCCCITT = 0;int main (void){unsigned short* pointer;unsigned short length;unsigned short data;

// standard CRC-CCITT

#define CRCCCITT_POLYNOMIAL ((unsigned long)0x00001021)#define CRCCCITT_SEED_VALUE ((unsigned long)0x0000FFFF)// direct initial value

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 0; // big endianCRCCONbits.DWIDTH = 16-1; // 16-bit data widthCRCCONbits.PLEN = 16-1; // 16-bit polynomial orderCRCXOR = CRCCCITT_POLYNOMIAL; // set polynomialCRCWDAT = CRCCCITT_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned short*)message;length = sizeof(message)/sizeof(unsigned short);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load datadata = Swap(data); // swap bytes for big endianlength--;if(length == 0){break;

}*((unsigned short*)&CRCDAT) = data; // 16-bit word access to FIFO

}

CRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flag*((unsigned short*)&CRCDAT) = data; // write last data into FIFOCRCCONbits.CRCGO = 1; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRCCCITT = (unsigned short)CRCWDAT; // get CRC result (must be 0x9B4D)

while(1);return 1;

}

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-21

Page 22: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-8: CRC-CCITT (16ビット多項式、16ビットデータ、ビッグエンディアン、MODビット = 0) // This macro is used to swap bytes for big endian#define Swap(x) __extension__({ \unsigned long __x = (x), __v; \__asm__ ("wsbh %0,%1;\n\t" \: "=d" (__v) \: "d" (__x)); \__v; \})// ASCII bytes "87654321"volatile unsigned short message[] = {0x3738,0x3536,0x3334,0x3132};volatile unsigned short crcResultCRCCCITT = 0;int main (void){unsigned short* pointer;unsigned short length;unsigned short data;

// standard CRC-CCITT

#define CRCCCITT_POLYNOMIAL ((unsigned long)0x00001021)#define CRCCCITT_SEED_VALUE ((unsigned long)0x000084CF)// non-direct initial value of 0xFFFF

CRCCON = 0;CRCCONbits.MOD = 0; // legacy modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 0; // big endianCRCCONbits.DWIDTH = 16-1; // 16-bit data widthCRCCONbits.PLEN = 16-1; // 16-bit polynomial orderCRCXOR = CRCCCITT_POLYNOMIAL; // set polynomialCRCWDAT = CRCCCITT_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned short*)message;length = sizeof(message)/sizeof(unsigned short);while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load datadata = Swap(data); // swap bytes for big endian*((unsigned short*)&CRCDAT) = data; // 16-bit word access to FIFO

}

while(CRCCONbits.CRCFUL); // wait if FIFO is fullCRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flag*((unsigned short*)&CRCDAT) = 0; // 16-bit dummy data to shift out CRC resultCRCCONbits.CRCGO = 0; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRCCCITT = (unsigned short)CRCWDAT; // get CRC result (must be 0x9B4D)

while(1);return 1;

}

DS60001336C_JP- p.60-22 © 2015-2016 Microchip Technology Inc.

Page 23: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

例 60-9: CRC-32 (32ビット多項式、32ビットデータ、リトルエンディアン、MODビット = 1)// ASCII bytes "12345678"volatile unsigned char __attribute__((aligned(4))) message[] = {'1','2','3','4','5','6','7','8'};// function to reverse the bit order (OPTIONAL)unsigned long ReverseBitOrder(unsigned long data);volatile unsigned int crcResultCRC32 = 0;int main(void){unsigned long* pointer;unsigned short length;

// standard CRC-32

#define CRC32_POLYNOMIAL ((unsigned long)0x04C11DB7)#define CRC32_SEED_VALUE ((unsigned long)0xFFFFFFFF)// direct initial value

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 32-1; // 32-bit polynomial orderCRCXOR = CRC32_POLYNOMIAL; // set polynomialCRCWDAT = CRC32_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculationpointer = (unsigned long*)message;length = sizeof(message)/sizeof(unsigned long);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulllength--;if(length == 0){break;

}CRCDAT = *pointer++; // 32-bit word access to FIFO

}CRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagCRCDAT = *pointer; // write last data into FIFOCRCCONbits.CRCGO = 1; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC32 = CRCWDAT; // get the final CRC result// OPTIONAL reverse CRC value bit order and invert (must be 0x9AE0DAAF)crcResultCRC32 = ~ReverseBitOrder(crcResultCRC32); while(1);return 1;

}unsigned long ReverseBitOrder(unsigned long data){unsigned long maskin;unsigned long maskout;unsigned long result = 0;unsigned char i;maskin = 0x80000000;maskout = 0x00000001;

for(i=0; i<32; i++){

if(data&maskin){result |= maskout;

}maskin >>= 1;maskout <<= 1;

}return result;

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-23

Page 24: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-10:CRC-32 (32ビット多項式、32ビットデータ、リトルエンディアン、MODビット = 0)// ASCII bytes "12345678"volatile unsigned char __attribute__((aligned(4))) message[] = {'1','2','3','4','5','6','7','8'};// function to reverse the bit order (OPTIONAL)unsigned long ReverseBitOrder(unsigned long data);volatile unsigned int crcResultCRC32 = 0;int main(void){unsigned long* pointer;unsigned short length;

// standard CRC-32

#define CRC32_POLYNOMIAL ((unsigned long)0x04C11DB7)#define CRC32_SEED_VALUE ((unsigned long)0x46AF6449)// non-direct initial value of 0xFFFFFFFF

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 32-1; // 32-bit polynomial orderCRCXOR = CRC32_POLYNOMIAL; // set polynomialCRCWDAT = CRC32_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned long*)message;length = sizeof(message)/sizeof(unsigned long);while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is fullCRCDAT = *pointer++; // 32-bit word access to FIFO

}while(CRCCONbits.CRCFUL); // wait if FIFO is fullCRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagCRCDAT = 0; // 32-bit dummy data to shift out the CRC resultCRCCONbits.CRCGO = 1; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC32 = CRCWDAT; // get the final CRC result// OPTIONAL reverse CRC value bit order and invert (must be 0x9AE0DAAF)crcResultCRC32 = ~ReverseBitOrder(crcResultCRC32); while(1);return 1;

}

unsigned long ReverseBitOrder(unsigned long data){unsigned long maskin;unsigned long maskout;unsigned long result = 0;unsigned char i;maskin = 0x80000000;maskout = 0x00000001;

for(i=0; i<32; i++){

if(data&maskin){result |= maskout;

}maskin >>= 1;maskout <<= 1;

}return result;}

DS60001336C_JP- p.60-24 © 2015-2016 Microchip Technology Inc.

Page 25: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

例 60-11:データ幅切り換え(32ビット多項式、リトルエンディアン、MODビット = 1)// ASCII bytes "12345678"volatile unsigned long message1[] = {0x34333231,0x38373635};// ASCII bytes "123"volatile unsigned char message2[] = {'1','2','3'};volatile unsigned long crcResultCRC32 = 0;int main(void){unsigned char* pointer8;unsigned long* pointer32;unsigned short length;#define CRC32_POLYNOMIAL ((unsigned long)0x04C11DB7)#define CRC32_SEED_VALUE ((unsigned long)0xFFFFFFFF)// direct initial value

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 32-1; // 32-bit polynomial orderCRCXOR = CRC32_POLYNOMIAL; // set polynomialCRCWDAT = CRC32_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer32 = (unsigned long*)message1;length = sizeof(message1)/sizeof(unsigned long);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulllength--;if(length == 0){break;

}CRCDAT = *pointer32++; // 32-bit word access to FIFO

}CRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagCRCDAT = *pointer32; // write last 32-bit data into FIFOCRCCONbits.CRCGO = 1; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are doneCRCCONbits.DWIDTH = 8-1; // switch the data width to 8-bit

pointer8 = (unsigned char*)message2; // calculate CRClength = sizeof(message2)/sizeof(unsigned char);while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulllength--;if(length == 0){break;

}*((unsigned char*)&CRCDAT) = *pointer8++; // byte access to FIFO

}CRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flag*((unsigned char*)&CRCDAT) = *pointer8; // write last 8-bit data into FIFOCRCCONbits.CRCGO = 1; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC32 = CRCWDAT; // get the final CRC result (must be 0xE092727E)

while(1);return 1;

}

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-25

Page 26: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-12:データ幅切り換え(32ビット多項式、リトルエンディアン、MODビット = 0)// ASCII bytes "12345678"volatile unsigned long message1[] = {0x34333231,0x38373635};// ASCII bytes "123"volatile unsigned char message2[] = {'1','2','3'};volatile unsigned long crcResultCRC32 = 0;int main(void){unsigned char* pointer8;unsigned long* pointer32;unsigned short length;#define CRC32_POLYNOMIAL ((unsigned long)0x04C11DB7)#define CRC32_SEED_VALUE ((unsigned long)0x46AF6449)// non-direct initial value of 0xFFFFFFFF

CRCCON = 0;CRCCONbits.MOD = 0; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 32-1; // 32-bit polynomial orderCRCXOR = CRC32_POLYNOMIAL; // set polynomialCRCWDAT = CRC32_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer32 = (unsigned long*)message1;length = sizeof(message1)/sizeof(unsigned long)-1;while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is fullCRCDAT = *pointer32++; // 32-bit word access to FIFO

}while(CRCCONbits.CRCFUL); // wait if FIFO is fullCRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear interrupt flagCRCDAT = *pointer32; // write last 32-bit data into FIFOCRCCONbits.CRCGO = 1; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are done

CRCCONbits.DWIDTH = 8-1; // switch the data width to 8-bitpointer8 = (unsigned char*)message2; // calculate CRClength = sizeof(message2)/sizeof(unsigned char)-1;while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is full*((unsigned char*)&CRCDAT) = *pointer8++; // byte access to FIFO

}while(CRCCONbits.CRCFUL); // wait if FIFO is fullCRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear interrupt flag*((unsigned char*)&CRCDAT) = *pointer8; // write last 8-bit data into FIFOCRCCONbits.CRCGO = 1; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are doneCRCCONbits.DWIDTH = 32-1; // switch data width to polynomial length 32-bit

CRCCONbits.CRCGO = 0; // suspend CRC calculationIFS0CLR = _IFS0_CRCIF_MASK; // clear interrupt flagCRCDAT = 0; // write dummy data to shift out the CRC resultCRCCONbits.CRCGO = 1; // resume CRC calculationwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC32 = CRCWDAT; // get the final CRC result (must be 0xE092727E)

while(1);return 1;

}

DS60001336C_JP- p.60-26 © 2015-2016 Microchip Technology Inc.

Page 27: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

60.6.4 永続的割り込みを行う CRC モジュールのアプリケーション例

例 60-13 ~例 60-22 に、永続的割り込みを行うモジュール向けの、多項式の長さ、データ幅、 シフト方向、CRC エンジンモードの各種組み合わせの標準的なコードを示します。

例 60-13:CRC-SMBus (8ビット多項式、32ビットデータ、ビッグエンディアン、MODビット = 1)// This macro is used to swap bytes for big endian#define Swap(x) __extension__({ \unsigned long __x = (x), __v; \__asm__ ("wsbh %0,%1;\n\t" \"rotr %0,16" \: "=d" (__v) \: "d" (__x)); \__v; \})

// ASCII bytes "12345678"volatile unsigned char __attribute__((aligned(4))) message[] = {'1','2','3','4','5','6','7','8'};volatile unsigned char crcResultCRCSMBUS = 0;int main (void){unsigned long* pointer;unsigned short length;unsigned long data;

// standard CRC-SMBUS

#define CRCSMBUS_POLYNOMIAL ((unsigned long)0x00000007)#define CRCSMBUS_SEED_VALUE ((unsigned long)0x00000000) // direct initial value

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.LENDIAN = 0; // big endianCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 8-1; // 8-bit polynomial orderCRCXOR = CRCSMBUS_POLYNOMIAL; // set polynomialCRCWDAT = CRCSMBUS_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned long*)message; length = sizeof(message)/sizeof(unsigned long);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load from little endiandata = Swap(data); // swap bytes for big endianlength--;if(length == 0){break;

}CRCDAT = data; // 32-bit word access to FIFO

}CRCDAT = data; // write last data into FIFOIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flag

while(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRCSMBUS = (unsigned char)CRCWDAT&0x00ff; // get CRC result (must be 0xC7)

while(1);return 1;

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-27

Page 28: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-14:CRC-SMBus (8ビット多項式、32ビットデータ、リトルエンディアン、MODビット = 0)// This macro is used to swap bytes for big endian#define Swap(x) __extension__({ \unsigned long __x = (x), __v; \__asm__ ("wsbh %0,%1;\n\t" \"rotr %0,16" \: "=d" (__v) \: "d" (__x)); \__v; \})

// ASCII bytes "12345678"volatile unsigned char __attribute__((aligned(4))) message[] = {'1','2','3','4','5','6','7','8'};volatile unsigned char crcResultCRCSMBUS = 0;int main (void){unsigned long* pointer;unsigned short length;unsigned long data;

// standard CRC-SMBUS

#define CRCSMBUS_POLYNOMIAL ((unsigned long)0x00000007)#define CRCSMBUS_SEED_VALUE ((unsigned long)0x00000000)// non-direct initial value of zero

CRCCON = 0;CRCCONbits.MOD = 0; // legacy modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.LENDIAN = 0; // big endianCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 8-1; // 8-bit polynomial orderCRCXOR = CRCSMBUS_POLYNOMIAL; // set polynomialCRCWDAT = CRCSMBUS_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculationpointer = (unsigned long*)message; length = sizeof(message)/sizeof(unsigned long);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load from little endiandata = Swap(data); // swap bytes for big endianlength--;if(length == 0){break;

}CRCDAT = data; // 32-bit word access to FIFO

}

CRCDAT = data; // write last data into FIFOIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are doneCRCCONbits.DWIDTH = 8-1; // switch data width to polynomial length 8-bit*((unsigned char*)&CRCDAT) = 0; // 8-bit dummy data to shift out the CRC resultIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flag

while(!IFS0bits.CRCIF); // wait until shifts are done crcResultCRCSMBUS = (unsigned char)CRCWDAT&0x00ff;// get CRC result (must be 0xC7)

while(1);return 1;

}

DS60001336C_JP- p.60-28 © 2015-2016 Microchip Technology Inc.

Page 29: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

例 60-15:CRC-16 (16ビットデータ、32ビット多項式、リトルエンディアン、MODビット = 1)// ASCII bytes "87654321"volatile unsigned short message[] = {0x3738,0x3536,0x3334,0x3132};volatile unsigned short crcResultCRC16 = 0;int main (void){unsigned short* pointer;unsigned short length;unsigned short data;

// standard CRC-16

#define CRC16_POLYNOMIAL ((unsigned long)0x00008005)#define CRC16_SEED_VALUE ((unsigned long)0x00000000)// direct initial value

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 16-1; // 16-bit data widthCRCCONbits.PLEN = 16-1; // 16-bit polynomial orderCRCXOR = CRC16_POLYNOMIAL; // set polynomialCRCWDAT = CRC16_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned short*)message;length = sizeof(message)/sizeof(unsigned short);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load datalength--;if(length == 0){break;

}*((unsigned short*)&CRCDAT) = data; // 16-bit word access to FIFO

}

*((unsigned short*)&CRCDAT) = data; // write last data into FIFOIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC16 = (unsigned short)CRCWDAT; // get CRC result (must be 0xE716)

while(1);return 1;

}

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-29

Page 30: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-16:CRC-16 (16ビットデータ、16ビット多項式、リトルエンディアン、MODビット = 0)// ASCII bytes "87654321"volatile unsigned short message[] = {0x3738,0x3536,0x3334,0x3132};volatile unsigned short crcResultCRC16 = 0;int main (void){unsigned short* pointer;unsigned short length;unsigned short data;

// standard CRC-16

#define CRC16_POLYNOMIAL ((unsigned long)0x00008005)#define CRC16_SEED_VALUE ((unsigned long)0x00000000) // non-direct initial value of zero

CRCCON = 0;CRCCONbits.MOD = 0; // legacy modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 16-1; // 16-bit data widthCRCCONbits.PLEN = 16-1; // 16-bit polynomial orderCRCXOR = CRC16_POLYNOMIAL; // set polynomialCRCWDAT = CRC16_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned short*)message;length = sizeof(message)/sizeof(unsigned short);while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load data*((unsigned short*)&CRCDAT) = data; // 16-bit word access to FIFO

}

while(CRCCONbits.CRCFUL); // wait if FIFO is full*((unsigned short*)&CRCDAT) = 0; // 16-bit dummy data to shift out CRC resultIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC16 = (unsigned short)CRCWDAT; // get CRC result (must be 0xE716)

while(1);return 1;

}

DS60001336C_JP- p.60-30 © 2015-2016 Microchip Technology Inc.

Page 31: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

例 60-17:CRC-CCITT (16ビット多項式、16ビットデータ、ビッグエンディアン、MODビット = 1) // This macro is used to swap bytes for big endian#define Swap(x) __extension__({ \unsigned long __x = (x), __v; \__asm__ ("wsbh %0,%1;\n\t" \: "=d" (__v) \: "d" (__x)); \__v; \})// ASCII bytes "87654321"volatile unsigned short message[] = {0x3738,0x3536,0x3334,0x3132};volatile unsigned short crcResultCRCCCITT = 0;int main (void){unsigned short* pointer;unsigned short length;unsigned short data;

// standard CRC-CCITT

#define CRCCCITT_POLYNOMIAL ((unsigned long)0x00001021)#define CRCCCITT_SEED_VALUE ((unsigned long)0x0000FFFF)// direct initial value

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 0; // big endianCRCCONbits.DWIDTH = 16-1; // 16-bit data widthCRCCONbits.PLEN = 16-1; // 16-bit polynomial orderCRCXOR = CRCCCITT_POLYNOMIAL; // set polynomialCRCWDAT = CRCCCITT_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned short*)message;length = sizeof(message)/sizeof(unsigned short);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load datadata = Swap(data); // swap bytes for big endianlength--;if(length == 0){break;

}*((unsigned short*)&CRCDAT) = data; // 16-bit word access to FIFO

}

*((unsigned short*)&CRCDAT) = data; // write last data into FIFOIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRCCCITT = (unsigned short)CRCWDAT; // get CRC result (must be 0x9B4D)

while(1);return 1;

}

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-31

Page 32: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-18:CRC-CCITT (16ビット多項式、16ビットデータ、ビッグエンディアン、MODビット = 0) // This macro is used to swap bytes for big endian#define Swap(x) __extension__({ \unsigned long __x = (x), __v; \__asm__ ("wsbh %0,%1;\n\t" \: "=d" (__v) \: "d" (__x)); \__v; \})// ASCII bytes "87654321"volatile unsigned short message[] = {0x3738,0x3536,0x3334,0x3132};volatile unsigned short crcResultCRCCCITT = 0;int main (void){unsigned short* pointer;unsigned short length;unsigned short data;

// standard CRC-CCITT

#define CRCCCITT_POLYNOMIAL ((unsigned long)0x00001021)#define CRCCCITT_SEED_VALUE ((unsigned long)0x000084CF)// non-direct initial value of 0xFFFF

CRCCON = 0;CRCCONbits.MOD = 0; // legacy modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 0; // big endianCRCCONbits.DWIDTH = 16-1; // 16-bit data widthCRCCONbits.PLEN = 16-1; // 16-bit polynomial orderCRCXOR = CRCCCITT_POLYNOMIAL; // set polynomialCRCWDAT = CRCCCITT_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned short*)message;length = sizeof(message)/sizeof(unsigned short);while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulldata = *pointer++; // load datadata = Swap(data); // swap bytes for big endian*((unsigned short*)&CRCDAT) = data; // 16-bit word access to FIFO

}

while(CRCCONbits.CRCFUL); // wait if FIFO is full*((unsigned short*)&CRCDAT) = 0; // 16-bit dummy data to shift out CRC resultIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRCCCITT = (unsigned short)CRCWDAT; // get CRC result (must be 0x9B4D)

while(1);return 1;

}

DS60001336C_JP- p.60-32 © 2015-2016 Microchip Technology Inc.

Page 33: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

例 60-19:CRC-32 (32ビット多項式、32ビットデータ、リトルエンディアン、MODビット = 1)// ASCII bytes "12345678"volatile unsigned char __attribute__((aligned(4))) message[] = {'1','2','3','4','5','6','7','8'};// function to reverse the bit order (OPTIONAL)unsigned long ReverseBitOrder(unsigned long data);volatile unsigned int crcResultCRC32 = 0;int main(void){unsigned long* pointer;unsigned short length;

// standard CRC-32

#define CRC32_POLYNOMIAL ((unsigned long)0x04C11DB7)#define CRC32_SEED_VALUE ((unsigned long)0xFFFFFFFF)// direct initial value

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 32-1; // 32-bit polynomial orderCRCXOR = CRC32_POLYNOMIAL; // set polynomialCRCWDAT = CRC32_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculationpointer = (unsigned long*)message;length = sizeof(message)/sizeof(unsigned long);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulllength--;if(length == 0){break;

}CRCDAT = *pointer++; // 32-bit word access to FIFO

}CRCDAT = *pointer; // write last data into FIFOIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC32 = CRCWDAT; // get the final CRC result// OPTIONAL reverse CRC value bit order and invert (must be 0x9AE0DAAF)crcResultCRC32 = ~ReverseBitOrder(crcResultCRC32); while(1);return 1;

}unsigned long ReverseBitOrder(unsigned long data){unsigned long maskin;unsigned long maskout;unsigned long result = 0;unsigned char i;maskin = 0x80000000;maskout = 0x00000001;

for(i=0; i<32; i++){

if(data&maskin){result |= maskout;

}maskin >>= 1;maskout <<= 1;

}return result;

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-33

Page 34: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-20:CRC-32 (32ビット多項式、32ビットデータ、リトルエンディアン、MODビット = 0)// ASCII bytes "12345678"volatile unsigned char __attribute__((aligned(4))) message[] = {'1','2','3','4','5','6','7','8'};// function to reverse the bit order (OPTIONAL)unsigned long ReverseBitOrder(unsigned long data);volatile unsigned int crcResultCRC32 = 0;int main(void){unsigned long* pointer;unsigned short length;

// standard CRC-32

#define CRC32_POLYNOMIAL ((unsigned long)0x04C11DB7)#define CRC32_SEED_VALUE ((unsigned long)0x46AF6449) // non-direct initial value of 0xFFFFFFFF

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 32-1; // 32-bit polynomial orderCRCXOR = CRC32_POLYNOMIAL; // set polynomialCRCWDAT = CRC32_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer = (unsigned long*)message;length = sizeof(message)/sizeof(unsigned long);while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is fullCRCDAT = *pointer++; // 32-bit word access to FIFO

}while(CRCCONbits.CRCFUL); // wait if FIFO is fullCRCDAT = 0; // 32-bit dummy data to shift out the CRC resultIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC32 = CRCWDAT; // get the final CRC result// OPTIONAL reverse CRC value bit order and invert (must be 0x9AE0DAAF)crcResultCRC32 = ~ReverseBitOrder(crcResultCRC32); while(1);return 1;

}

unsigned long ReverseBitOrder(unsigned long data){unsigned long maskin;unsigned long maskout;unsigned long result = 0;unsigned char i;maskin = 0x80000000;maskout = 0x00000001;

for(i=0; i<32; i++){

if(data&maskin){result |= maskout;

}maskin >>= 1;maskout <<= 1;

}return result;}

DS60001336C_JP- p.60-34 © 2015-2016 Microchip Technology Inc.

Page 35: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

例 60-21:データ幅切り換え(32ビット多項式、リトルエンディアン、MODビット = 1)// ASCII bytes "12345678"volatile unsigned long message1[] = {0x34333231,0x38373635};// ASCII bytes "123"volatile unsigned char message2[] = {'1','2','3'};volatile unsigned long crcResultCRC32 = 0;int main(void){unsigned char* pointer8;unsigned long* pointer32;unsigned short length;#define CRC32_POLYNOMIAL ((unsigned long)0x04C11DB7)#define CRC32_SEED_VALUE ((unsigned long)0xFFFFFFFF) // direct initial value

CRCCON = 0;CRCCONbits.MOD = 1; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 32-1; // 32-bit polynomial orderCRCXOR = CRC32_POLYNOMIAL; // set polynomialCRCWDAT = CRC32_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer32 = (unsigned long*)message1;length = sizeof(message1)/sizeof(unsigned long);while(1){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulllength--;if(length == 0){break;

}CRCDAT = *pointer32++; // 32-bit word access to FIFO

}CRCDAT = *pointer32; // write last 32-bit data into FIFOIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are doneCRCCONbits.DWIDTH = 8-1; // switch the data width to 8-bit

pointer8 = (unsigned char*)message2; // calculate CRClength = sizeof(message2)/sizeof(unsigned char);while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is fulllength--;if(length == 0){break;

}*((unsigned char*)&CRCDAT) = *pointer8++; // byte access to FIFO

}*((unsigned char*)&CRCDAT) = *pointer8; // write last 8-bit data into FIFOIFS0CLR = _IFS0_CRCIF_MASK; // clear the interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC32 = CRCWDAT; // get the final CRC result (must be 0xE092727E)

while(1);return 1;

}

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-35

Page 36: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

例 60-22:データ幅切り換え(32ビット多項式、リトルエンディアン、MODビット = 0)// ASCII bytes "12345678"volatile unsigned long message1[] = {0x34333231,0x38373635};// ASCII bytes "123"volatile unsigned char message2[] = {'1','2','3'};volatile unsigned long crcResultCRC32 = 0;int main(void){unsigned char* pointer8;unsigned long* pointer32;unsigned short length;#define CRC32_POLYNOMIAL ((unsigned long)0x04C11DB7)#define CRC32_SEED_VALUE ((unsigned long)0x46AF6449) // non-direct initial value of 0xFFFFFFFF

CRCCON = 0;CRCCONbits.MOD = 0; // alternate modeCRCCONbits.ON = 1; // enable CRCCRCCONbits.CRCISEL = 0; // interrupt when all shifts are doneCRCCONbits.LENDIAN = 1; // little endianCRCCONbits.DWIDTH = 32-1; // 32-bit data widthCRCCONbits.PLEN = 32-1; // 32-bit polynomial orderCRCXOR = CRC32_POLYNOMIAL; // set polynomialCRCWDAT = CRC32_SEED_VALUE; // set initial valueCRCCONbits.CRCGO = 1; // start CRC calculation

pointer32 = (unsigned long*)message1;length = sizeof(message1)/sizeof(unsigned long)-1;while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is fullCRCDAT = *pointer32++; // 32-bit word access to FIFO

}while(CRCCONbits.CRCFUL); // wait if FIFO is fullCRCDAT = *pointer32; // write last 32-bit data into FIFOIFS0CLR = _IFS0_CRCIF_MASK; // clear interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are done

CRCCONbits.DWIDTH = 8-1; // switch the data width to 8-bitpointer8 = (unsigned char*)message2; // calculate CRClength = sizeof(message2)/sizeof(unsigned char)-1;while(length--){

while(CRCCONbits.CRCFUL); // wait if FIFO is full*((unsigned char*)&CRCDAT) = *pointer8++; // byte access to FIFO

}while(CRCCONbits.CRCFUL); // wait if FIFO is full*((unsigned char*)&CRCDAT) = *pointer8; // write last 8-bit data into FIFOIFS0CLR = _IFS0_CRCIF_MASK; // clear interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are doneCRCCONbits.DWIDTH = 32-1; // switch data width to polynomial length 32-bit

CRCDAT = 0; // write dummy data to shift out the CRC resultIFS0CLR = _IFS0_CRCIF_MASK; // clear interrupt flagwhile(!IFS0bits.CRCIF); // wait until shifts are donecrcResultCRC32 = CRCWDAT; // get the final CRC result (must be 0xE092727E)

while(1);return 1;

}

DS60001336C_JP- p.60-36 © 2015-2016 Microchip Technology Inc.

Page 37: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

60.7 省電力モード時の動作

60.7.1 スリープ

モジュールが動作中にスリープに移行した場合、モジュールはクロック動作が再開するまで現在の状態で一時停止します。

60.7.2 アイドル

アイドル中もモジュールを動作させるには、アイドル移行前に SIDL ビットをクリアする必要があります。

SIDL = 1 の場合、モジュールはスリープの場合と同じようにふるまいます。モジュールのク ロックが使えなくても、保留中の割り込みイベントは継承されます。

60.8 リセットの影響

デバイスリセット後、全ての CRC 制御レジスタ (CRCCON、CRCXOR、CRCWDAT) は「0x00000000」にリセットされます。これにより CRC モジュールは無効になります。実行中であった計算は全て終了します。

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-37

Page 38: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

60.9 関連アプリケーション ノート

関連アプリケーション ノートの一覧を以下に記載します。一部のアプリケーション ノートは PIC32 デバイスファミリ向けではありません。ただし概念は共通しており、変更が必要であったり制限事項が存在するものの利用が可能です。32ビット プログラマブル巡回冗長検査 (CRC) に関連する最新のアプリケーション ノートは以下の通りです。

タイトル アプリケーション ノート番号

現在、関連するアプリケーション ノートはありません。

Note: PIC32 ファミリ関連のアプリケーション ノートとサンプルコードは、Microchip 社 ウェブサイト (www.microchip.com) でご覧頂けます。

DS60001336C_JP- p.60-38 © 2015-2016 Microchip Technology Inc.

Page 39: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

セクション 60. 32ビット プログラマブル巡回冗長検査 (CRC) 32

ビット

プログラマブル

CRC

60

60.10 改訂履歴

リビジョン A (2015 年 5 月 )本書の初版

リビジョン B (2016 年 3 月 )• 図 :

- 図 60-1 を更新

• 例 :- 例 60-2、例 60-3 ~例 60-12 を更新

リビジョン C (2016 年 6 月 )セクション 60.5.4.4「CRC 結果」とセクション 60.5.5「割り込み動作」を更新

セクション 60.6.4「永続的割り込みを行う CRC モジュールのアプリケーション例」を追加

© 2015-2016 Microchip Technology Inc. DS60001336C_JP- p.60-39

Page 40: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

PIC32 ファミリ リファレンス マニュアル

NOTES:

DS60001336C_JP- p.60-40 © 2015-2016 Microchip Technology Inc.

Page 41: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

Microchip社製デバイスのコード保護機能に関して以下の点にご注意ください。

• Microchip社製品は、該当するMicrochip社データシートに記載の仕様を満たしています。

• Microchip社では、通常の条件ならびに仕様に従って使用した場合、Microchip社製品のセキュリティ レベルは、現在市場に

流通している同種製品の中でも最も高度であると考えています。

• しかし、コード保護機能を解除するための不正かつ違法な方法が存在する事もまた事実です。弊社の理解では、こうした手法

はMicrochip社データシートにある動作仕様書以外の方法でMicrochip社製品を使用する事になります。このような行為は知

的所有権の侵害に該当する可能性が非常に高いと言えます。

• Microchip社は、コードの保全性に懸念を抱くお客様と連携し、対応策に取り組んでいきます。

• Microchip社を含む全ての半導体メーカーで、自社のコードのセキュリティを完全に保証できる企業はありません。コード保

護機能とは、Microchip社が製品を「解読不能」として保証するものではありません。

コード保護機能は常に進歩しています。Microchip社では、常に製品のコード保護機能の改善に取り組んでいます。Microchip社の

コード保護機能の侵害は、デジタル ミレニアム著作権法に違反します。そのような行為によってソフトウェアまたはその他の著作

物に不正なアクセスを受けた場合、デジタル ミレニアム著作権法の定めるところにより損害賠償訴訟を起こす権利があります。

本書に記載されているデバイス アプリケーション等に関する

情報は、ユーザの便宜のためにのみ提供されているものであ

り、更新によって無効とされる事があります。お客様のアプ

リケーションが仕様を満たす事を保証する責任は、お客様に

あります。Microchip 社は、明示的、暗黙的、書面、口頭、法

定のいずれであるかを問わず、本書に記載されている情報に

関して、状態、品質、性能、商品性、特定目的への適合性を

はじめとする、いかなる類の表明も保証も行いません。

Microchip 社は、本書の情報およびその使用に起因する一切の

責任を否認します。Microchip 社の明示的な書面による承認な

しに、生命維持装置あるいは生命安全用途に Microchip 社の製

品を使用する事は全て購入者のリスクとし、また購入者はこ

れによって発生したあらゆる損害、クレーム、訴訟、費用に

関して、Microchip 社は擁護され、免責され、損害をうけない

事に同意するものとします。暗黙的あるいは明示的を問わず、

Microchip社が知的財産権を保有しているライセンスは一切譲

渡されません。

2015-2016 Microchip Technology Inc.

Microchip社では、ChandlerおよびTempe (アリゾナ州)、Gresham (オレゴン州)の本部、設計部およびウェハー製造工場そしてカリフォルニア州とインドのデザイン センターがISO/TS-16949:2009認証を取得しています。Microchip社の品質システム プロセスおよび手順は、PIC® MCUおよびdsPIC® DSC、KEELOQ®コードホッピング デバイス、シリアルEEPROM、マイクロペリフェラル、不揮発性メモリ、アナログ製品に採用されています。さらに、開発システムの設計と製造に関するMicrochip社の品質システムはISO 9001:2000認証

QUALITY MANAGEMENT SYSTEM CERTIFIED BY DNV

== ISO/TS 16949 ==

商標

Microchip 社の名称とロゴ、Microchip ロゴ、AnyRate、dsPIC、FlashFlex、flexPWR、Heldo、JukeBlox、KeeLoq、KeeLoq ロゴ、Kleer、LANCheck、LINK MD、MediaLB、MOST、MOST ロゴ、MPLAB、OptoLyzer、PIC、

PICSTART、PIC32 ロゴ、RightTouch、SpyNIC、SST、SSTロゴ、SuperFlash、UNI/O は、米国およびその他の国におけ

る Microchip Technology Incorporated の登録商標です。

ClockWorks、The Embedded Control Solutions Company、ETHERSYNCH、Hyper Speed Control、HyperLight Load、IntelliMOS、mTouch、Precision Edge、QUIET-WIRE は、米

国における Microchip Technology Incorporated 社の登録商標

です。

Analog-for-the-Digital Age、Any Capacitor、AnyIn、AnyOut、BodyCom、chipKIT、chipKIT ロゴ、CodeGuard、dsPICDEM、dsPICDEM.net、Dynamic Average Matching、DAM、ECAN、EtherGREEN、In-Circuit Serial Programming、ICSP、Inter-Chip Connectivity、JitterBlocker、KleerNet、KleerNet ロゴ、MiWi、motorBench、MPASM、MPF、MPLAB Certified ロゴ、MPLIB、MPLINK、MultiTRAK、NetDetach、Omniscient Code Generation、PICDEM、

PICDEM.net、PICkit、PICtail、PureSilicon、RightTouch ロ

ゴ、REAL ICE、Ripple Blocker、Serial Quad I/O、SQI、SuperSwitcher、SuperSwitcher II、Total Endurance、TSHARC、USBCheck、VariSense、ViewSpan、WiperLock、Wireless DNA、ZENA は米国およびその他の国における

Microchip Technology Incorporated の商標です。

SQTP は、米国における Microchip Technology Incorporatedのサービスマークです。

Silicon Storage Technology は、その他の国における

Microchip Technology Inc. の登録商標です。

GestIC と ULPP はその他の国における Microchip Technology Inc. の子会社である Microchip Technology Germany II GmbH & Co. & KG の登録商標です。

その他本書に記載されている商標は各社に帰属します。

© 2015-2016, Microchip Technology Incorporated, Printed in the U.S.A., All Rights Reserved.

ISBN: 978-1-5224-1185-7

DS60001336C_JP- p.60-41

Page 42: PIC32 CRC FRMww1.microchip.com/downloads/jp/DeviceDoc/60001336c_JP.pdfセクション60. 32ビット プログラマブル巡回冗長検査(CRC) 32 ビット プログラマブル

DS60001336C_JP- p. 60-42 2015-2016 Microchip Technology Inc.

南北アメリカ

本社2355 West Chandler Blvd.Chandler, AZ 85224-6199Tel: 480-792-7200 Fax: 480-792-7277技術サポート: http://www.microchip.com/supportURL: www.microchip.com

アトランタDuluth, GA Tel: 678-957-9614 Fax: 678-957-1455

オースティン、TXTel: 512-257-3370

ボストンWestborough, MA Tel: 774-760-0087 Fax: 774-760-0088

シカゴItasca, IL Tel: 630-285-0071 Fax: 630-285-0075

クリーブランドIndependence, OH Tel: 216-447-0464 Fax: 216-447-0643

ダラスAddison, TX Tel: 972-818-7423 Fax: 972-818-2924

デトロイトNovi, MI Tel: 248-848-4000

ヒューストン、TX Tel: 281-894-5983

インディアナポリスNoblesville, IN Tel: 317-773-8323Fax: 317-773-5453

ロサンゼルスMission Viejo, CA Tel: 949-462-9523 Fax: 949-462-9608

ニューヨーク、NY Tel: 631-435-6000

サンノゼ、CA Tel: 408-735-9110

カナダ - トロントTel: 905-673-0699 Fax: 905-673-6509

アジア太平洋

アジア太平洋支社Suites 3707-14, 37th FloorTower 6, The GatewayHarbour City, Kowloon

香港Tel: 852-2943-5100Fax: 852-2401-3431

オーストラリア - シドニーTel: 61-2-9868-6733Fax: 61-2-9868-6755

中国 - 北京Tel: 86-10-8569-7000 Fax: 86-10-8528-2104

中国 - 成都Tel: 86-28-8665-5511Fax: 86-28-8665-7889

中国 - 重慶Tel: 86-23-8980-9588Fax: 86-23-8980-9500

中国 - 東莞Tel: 86-769-8702-9880

中国 - 杭州Tel: 86-571-8792-8115 Fax: 86-571-8792-8116

中国 - 香港SARTel: 852-2943-5100 Fax: 852-2401-3431

中国 - 南京Tel: 86-25-8473-2460Fax: 86-25-8473-2470

中国 - 青島Tel: 86-532-8502-7355Fax: 86-532-8502-7205

中国 - 上海Tel: 86-21-5407-5533 Fax: 86-21-5407-5066

中国 - 瀋陽Tel: 86-24-2334-2829Fax: 86-24-2334-2393

中国 - 深圳Tel: 86-755-8864-2200 Fax: 86-755-8203-1760

中国 - 武漢Tel: 86-27-5980-5300Fax: 86-27-5980-5118

中国 - 西安Tel: 86-29-8833-7252Fax: 86-29-8833-7256

アジア太平洋

中国 - 厦門Tel: 86-592-2388138 Fax: 86-592-2388130

中国 - 珠海Tel: 86-756-3210040 Fax: 86-756-3210049

インド - バンガロールTel: 91-80-3090-4444 Fax: 91-80-3090-4123

インド - ニューデリーTel: 91-11-4160-8631Fax: 91-11-4160-8632

インド - プネTel: 91-20-3019-1500

日本 - 大阪Tel: 81-6-6152-7160 Fax: 81-6-6152-9310

日本 - 東京Tel: 81-3-6880- 3770 Fax: 81-3-6880-3771

韓国 - 大邱Tel: 82-53-744-4301Fax: 82-53-744-4302

韓国 - ソウルTel: 82-2-554-7200Fax: 82-2-558-5932または 82-2-558-5934

マレーシア - クアラルンプールTel: 60-3-6201-9857Fax: 60-3-6201-9859

マレーシア - ペナンTel: 60-4-227-8870Fax: 60-4-227-4068

フィリピン - マニラTel: 63-2-634-9065Fax: 63-2-634-9069

シンガポールTel: 65-6334-8870Fax: 65-6334-8850

台湾 - 新竹Tel: 886-3-5778-366Fax: 886-3-5770-955

台湾 - 高雄Tel: 886-7-213-7828

台湾 - 台北Tel: 886-2-2508-8600 Fax: 886-2-2508-0102

タイ - バンコクTel: 66-2-694-1351Fax: 66-2-694-1350

ヨーロッパ

オーストリア - ヴェルスTel: 43-7242-2244-39Fax: 43-7242-2244-393

デンマーク - コペンハーゲンTel: 45-4450-2828 Fax: 45-4485-2829

フランス - パリTel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79

ドイツ - デュッセルドルフTel: 49-2129-3766400

ドイツ - カールスルーエTel: 49-721-625370

ドイツ - ミュンヘンTel: 49-89-627-144-0 Fax: 49-89-627-144-44

イタリア - ミラノ Tel: 39-0331-742611 Fax: 39-0331-466781

イタリア - ヴェニスTel: 39-049-7625286

オランダ - ドリューネンTel: 31-416-690399 Fax: 31-416-690340

ポーランド - ワルシャワTel: 48-22-3325737

スペイン - マドリッドTel: 34-91-708-08-90Fax: 34-91-708-08-91

スウェーデン - ストックホルムTel: 46-8-5090-4654

イギリス - ウォーキンガムTel: 44-118-921-5800Fax: 44-118-921-5820

各国の営業所とサービス

2015/07/14