32 ビット プログラマブル巡回冗長検査...

36
© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.1 32 ビット プログラマブル巡回冗長検査 (CRC) ハイライト 本セクションは以下の主要項目を記載しています。 1.0 はじめに .....................................................................2 2.0 モジュールの概要 .............................................................3 3.0 CRC レジスタ ................................................................4 4.0 CRC エンジン .............................................................. 10 5.0 制御ロジック ................................................................11 6.0 プログラマブル CRC モジュールの利点 ....................................... 20 7.0 CRC モジュールのアプリケーション .......................................... 20 8.0 省電力モードの動作 ......................................................... 31 9.0 レジスタマップ ............................................................. 32 10.0 関連アプリケーション ノート ................................................ 33 11.0 改訂履歴 ................................................................... 34 注意 : この日本語版文書は参考資料としてご利用ください。最新情報は必ずオリジ ナルの英語版をご参照願います。

Upload: others

Post on 03-Jun-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

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

32 ビット プログラマブル巡回冗長検査 (CRC)

ハイライト

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

1.0 はじめに.....................................................................2

2.0 モジュールの概要.............................................................3

3.0 CRC レジスタ ................................................................4

4.0 CRC エンジン .............................................................. 10

5.0 制御ロジック................................................................11

6.0 プログラマブル CRC モジュールの利点 ....................................... 20

7.0 CRC モジュールのアプリケーション .......................................... 20

8.0 省電力モードの動作......................................................... 31

9.0 レジスタマップ............................................................. 32

10.0 関連アプリケーション ノート ................................................ 33

11.0 改訂履歴................................................................... 34

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.1

Page 2: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

1.0 はじめに

dsPIC33/PIC24 の 32 ビット プログラマブル巡回冗長検査 (CRC) モジュールは、ソフトウェアで構成できる CRC チェックサム ジェネレータです。チェックサムとは、複数バイトを格納した個々のメッセージまたはデータブロックに関連付けられる固有の数値です。通信用のデータパケットにせよメモリに保存したデータブロックにせよ、チェックサム等の情報は、それらのデータを処理する前の検証に役立ちます。最も単純な方法として、メッセージ内のデータバイトを全て加算する事でチェックサムを求める事ができます。しかし、バイト単位で反転したり並び順を入れ換えたりしてメッセージが改変された場合、このような方法では誤りを検出できません。また、メッセージの NULL バイトが追加された場合も検出できません。

CRC はこのような単純な方法に比べると複雑ですが、信頼性の高い誤り検出アルゴリズムです。CRC アルゴリズムはメッセージをバイナリビット ストリームとして扱い、これを決められたバイナリ値で除算した時の 余りをチェックサムとみなします。通常の除算と同様に、CRC 計算も反復処理です。ただし、これらの演算は mod2 によるモジュロ演算で実行されるという点が異なります。例えば、除算は XOR 演算 ( すなわちキャリーなしの減算 ) に置き換えられます。CRCアルゴリズムは、全ての計算に多項式の項を使います。除数、被除数、余りのバイナリ値の各桁は、多項式の各項の係数に割り当てられます。例えば、値 25h (11001) を下式のように表現します。

式 1-1:

CRC 計算では、まず適当な除数を選択します。この除数は生成多項式と呼ばれます。生成多項式の選択によって CRC の誤り検出能力が異なるため、アプリケーションに合わせて適切な長さの生成多項式を選択する必要があります。多くのアプリケーションで広く一般的に用いられる生成多項式はいくつか存在しますが、本書ではそのような特定の多項式の誤り検出能力については取り上げません。

CRC 演算は反復処理であるため、ソフトウェアで実装するとかなりの CPU 帯域幅を使います。dsPIC33/PIC24 が内蔵する CRC ハードウェア モジュールは、ソフトウェアによる構成が可能であり、最小限のソフトウェア オーバーヘッドで高速な CRC チェックサム計算が可能です。

プログラマブル CRC ジェネレータを使うと、各種の通信およびセキュリティ アプリケーション向けにチェックサムを高速に生成するハードウェア実装が可能です。この CRC ジェネレータは下記の特長を備えます。

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

• 選択可能なシフト方向 ( リトル エンディアン / ビッグ エンディアン )

• 独立したデータ長と多項式長

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

• データ FIFO

(1 * x4) + (1 * x3) + (0 * x2) + (0 * x1) + (1 * x0) または x4 + x3 + x0

DS30009729B_JP - p.2 © 2011-2014 Microchip Technology Inc.

Page 3: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

2.0 モジュールの概要

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

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

Shift Buffer

CRC Shift Engine

CRCWDATH CRCWDATL

LENDIAN1

CRCISEL

1

0

FIFO Empty Event

Shift Complete

Set CRCIF

2 * FCY Shift Clock

CRCWDATH CRCWDATL

0

Event

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

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.3

Page 4: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

3.0 CRC レジスタ

このセクションでは、CRC モジュール関連のレジスタについて説明します。このモジュールでは 8 つのレジスタを使います。これらは特殊機能レジスタ (SFR) として dsPIC33/PIC24 のデータ RAM 空間に割り当てられています。

• CRCCON1 (CRC 制御レジスタ 1)

• CRCCON2 (CRC 制御レジスタ 2)

• CRCXORL (CRC XOR LOW レジスタ )

• CRCXORH (CRC XOR HIGH レジスタ )

• CRCDATL (CRC データ LOW レジスタ )

• CRCDATH (CRC データ HIGH レジスタ )

• CRCWDATL (CRC シフト LOW レジスタ )

• CRCWDATH (CRC シフト HIGH レジスタ )

CRCCON1 ( レジスタ 3-1) および CRCCON2 ( レジスタ 3-2) レジスタは、モジュール動作の制御と各種設定に使います。CRCXORL/H レジスタ ( レジスタ 3-3 とレジスタ 3-4) は、CRC計算で使う多項式の項を選択します。CRCDATL/H および CRCWDATL/H レジスタは、それぞれ 2 ワード入力データ用および CRC 処理後の出力データ用バッファとして機能するレジスタペアです。

DS30009729B_JP - p.4 © 2011-2014 Microchip Technology Inc.

Page 5: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

レジスタ 3-1: CRCCON1: CRC 制御レジスタ 1

R/W-0 U-0 R/W-0 R-0 R-0 R-0 R-0 R-0

CRCEN - CSIDL VWORD4 VWORD3 VWORD2 VWORD1 VWORD0

bit 15 bit 8

R-0 R-1 R/W-0 R/W-0 R/W-0 U-0 U-0 U-0

CRCFUL CRCMPT CRCISEL CRCGO LENDIAN - - -

bit 7 bit 0

凡例 :

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

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

bit 15 CRCEN: CRC イネーブルビット

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

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

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

bit 13 CSIDL: CRC Stop-in-Idle モードビット

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

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

FIFO 内の有効ワード数を示します。DWIDTH<4:0> 7 (8 ビット幅以下のデータワード ) の場合、最大値は 16 です。DWIDTH<4:0> 15(9 ~ 16 ビット幅のデータワード ) の場合、最大値は 8 です。DWIDTH<4:0> 31(17 ~ 32 ビット幅のデータワード ) の場合、最大値は 4 です。

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-0 未実装 :「0」として読み出し

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.5

Page 6: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

DS30009729B_JP - p.6 © 2011-2014 Microchip Technology Inc.

レジスタ 3-2: CRCCON2: CRC 制御レジスタ 2

U-0 U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

- - - DWIDTH4 DWIDTH3 DWIDTH2 DWIDTH1 DWIDTH0

bit 15 bit 8

U-0 U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

- - - PLEN4 PLEN3 PLEN2 PLEN1 PLEN0

bit 7 bit 0

凡例 :

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

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

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

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

データワードの幅を設定します (「データワード幅 - 1」の値を指定 )。

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

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

多項式の長さを設定します (「多項式の長さ - 1」の値を指定 )。

Page 7: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

レジスタ 3-3: CRCXORL: CRC XOR LOW レジスタ

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

X15 X14 X13 X12 X11 X10 X9 X8

bit 15 bit 8

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0

X7 X6 X5 X4 X3 X2 X1 -

bit 7 bit 0

凡例 :

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

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

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

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

レジスタ 3-4: CRCXORH: CRC XOR HIGH レジスタ

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

X31 X30 X29 X28 X27 X26 X25 X24

bit 15 bit 8

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

X23 X22 X21 X20 X19 X18 X17 X16

bit 7 bit 0

凡例 :

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

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

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

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.7

Page 8: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

レジスタ 3-5: CRCDATL: CRC データ LOW レジスタ

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

DATA15 DATA14 DATA13 DATA12 DATA11 DATA10 DATA9 DATA8

bit 15 bit 8

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

DATA7 DATA6 DATA5 DATA4 DATA3 DATA2 DATA1 DATA0

bit 7 bit 0

凡例 :

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

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

bit 15-0 DATA<15:0>: CRC 入力データビット

このレジスタへの書き込みは FIFO に格納されます。このレジスタを読み出すと「0」が返されます。

レジスタ 3-6: CRCDATH: CRC データ HIGH レジスタ

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

DATA31 DATA30 DATA29 DATA28 DATA27 DATA26 DATA25 DATA24

bit 15 bit 8

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

DATA23 DATA22 DATA21 DATA20 DATA19 DATA18 DATA17 DATA16

bit 7 bit 0

凡例 :

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

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

bit 15-0 DATA<31:16>: CRC 入力データビット

このレジスタへの書き込みは FIFO に格納されます。このレジスタを読み出すと「0」が返されます。

DS30009729B_JP - p.8 © 2011-2014 Microchip Technology Inc.

Page 9: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

レジスタ 3-7: CRCWDATL: CRC シフト LOW レジスタ

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

SDATA15 SDATA14 SDATA13 SDATA12 SDATA11 SDATA10 SDATA9 SDATA8

bit 15 bit 8

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

SDATA7 SDATA6 SDATA5 SDATA4 SDATA3 SDATA2 SDATA1 SDATA0

bit 7 bit 0

凡例 :

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

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

bit 15-0 SDATA<15:0>: CRC シフトレジスタ ビット

このレジスタへの書き込みは、CRC 書き込みバスを介して CRC シフトレジスタに書き込まれます。このレジスタからの読み出しは、CRC 読み出しバスを読み出します。

レジスタ 3-8: CRCWDATH: CRC シフト HIGH レジスタ

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

SDATA31 SDATA30 SDATA29 SDATA28 SDATA27 SDATA26 SDATA25 SDATA24

bit 15 bit 8

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

SDATA23 SDATA22 SDATA21 SDATA20 SDATA19 SDATA18 SDATA17 SDATA16

bit 7 bit 0

凡例 :

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

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

bit 15-0 DATA<31:16>: CRC シフトレジスタ ビット

このレジスタへの書き込みは、CRC 書き込みバスを介して CRC シフトレジスタに書き込まれます。このレジスタからの読み出しは、CRC 読み出しバスを読み出します。

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.9

Page 10: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

4.0 CRC エンジン

4.1 汎用 CRC エンジン

CRC エンジンは、シリアルシフト式 CRC カリキュレータで、マルチプレクサの設定によりフィードフォワードおよびフィードバックする位置を設定変更できます。図 4-1 に、CRC シフトエンジンの簡略図を示します。

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

CRC 計算の結果は、CRC 読み出しバスを介してホールドレジスタを読み出す事で取得できます。CRC 書き込みバスを介する CRC シフトレジスタへの直接書き込み経路も使えます。CPU はCRCWDATL および CRCWDATH レジスタを介してこの経路にアクセスします。

図 4-1: CRC シフトエンジンの詳細

CRCWDATH CRCWDATL

Bit 0

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

Read/Write Bus

Shift BufferData

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

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

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

Bit 1 Bit 2 Bit n(2)

DS30009729B_JP - p.10 © 2011-2014 Microchip Technology Inc.

Page 11: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

5.0 制御ロジック

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

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

式 5-1:

これらの多項式を CRC ジェネレータにプログラミングするには、レジスタの各ビットを表 5-1のように設定します。

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

多項式で使う項に対応するビットを「1」にセットしている事に注目してください ( 例 : X26 とX23)。多項式は bit 0 の XOR 演算を常に必要とします。従って、X0 はドントケアです。多項式の最上位ビット (MSb) は計算に影響を与えないため「0」に設定してかまいません。

5.2 データ インターフェイス

CRC モジュールは、CRC 計算用にユーザが定義した入力データ幅を確保します。入力データ幅は、DWIDTH<4:0> ビット (CRCCON2<12:8>) を使って 1 ~ 32 ビットに設定できます。

入力データはCRCDATLおよびCRCDATHレジスタに格納されます。CRCDATLおよびCRCDATHレジスタの幅は、DWIDTH<4:0> ビットの設定に従って設定されます。

データ幅が 16 ビット以下の場合、CRCDATL レジスタだけを使うため、CRCDATH レジスタへの書き込みは全て無視されます。

データ幅が 16 ビットより大きい場合、CRCDATL と CRCDATH の両方のレジスタを使います。この場合、先に下位 16 ビット ( 下位ワード ) を CRCDATL レジスタに書き込み、後から上位のビットを CRCDATH レジスタに書き込む必要があります。

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 000x 0001 1101 1011 011x

Note: データ幅が 8 ビット以下の場合、バイト操作によって入力データを CRCDATL レジスタに書き込む必要があります。

x16 + x12 + x5 + 1

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

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.11

Page 12: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

5.3 データのシフト方向

シフト方向の設定には LENDIAN ビット (CRCCON1<3>) を使います。既定値 (LENDIAN = 0)の場合、CRC モジュールは MSb を先頭に CRC エンジンを通してデータをシフトします。LENDIAN を「1」にセットすると、CRC モジュールは LSb を先頭にデータをシフトします。この設定により、ソフトウェアでのビット順序の反転によるオーバーヘッドなしで、各種通信方式に対応できます。この動作はデータをエンジンにシフトインする方向だけを変更する事に注意してください。CRC 計算の結果は通常のままであり、反転されません。

PIC24 と dsPIC33 はリトル エンディアンのデバイスです。CRC モジュールをビッグ エンディアンに設定する場合 (LENDIAN = 0)、入力データのバイトとワードをアプリケーション コード内でスワップしてから CRCDAT レジスタに書き込む必要があります。

5.4 FIFO

CRC モジュールは可変データ幅の FIFO を備えます。データ幅は、DWIDTH<4:0> ビット(CRCCON2<12:8>) で定義します。1 ~ 32 ビットの間で設定できます。FIFO 関連のロジックには、VWORD と呼ばれる 5 ビットカウンタ (VWORD<4:0> または CRCCON1<12:8>) が含まれます。VWORD<4:0> ビットの値は FIFO 内の新しいデータエレメントの数を示します。

FIFO は下記のように設定できます。

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

• DWIDTH<4:0> 15 (9 ~ 16 ビット幅のデータワード ) の場合、8 ワード段

• DWIDTH<4:0> 31 (17 ~ 32 ビット幅のデータワード ) の場合、4 ワード段

CRC 計算前に、CPU は CRC の計算に使うデータを CRCDAT レジスタ経由で FIFO に書き込む必要があります。CRCDAT レジスタを読み出すと常に 0 が返されます。

FIFO に 8 ビット以下のデータを格納する場合 :

データワード幅を 8 ビット以下に設定した場合、CRCDATL レジスタの下位または上位バイトのどちらかに書き込むたびに FIFO がインクリメントします。FIFO 書き込みの最小データ単位は1 バイトです。16 ビットワードを 1 つ CRCDATL レジスタに書き込む場合、まず下位バイトがFIFO に書き込まれた後に上位バイトが書き込まれます。

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

FIFO に 9 ~ 16 ビット幅のデータを格納する場合 :

9 ~ 16 ビットのデータワード幅を設定した場合、CRCDATL レジスタへの書き込み時に FIFO に読み込まれます。CRCDATH レジスタへの書き込みは全て無視されます。CRCDATL レジスタに書き込むたびに、VWORD<4:0> ビットの値がインクリメントします。

FIFO に 17 ~ 31 ビット幅のデータを格納する場合 :

データ幅が 16 ビットよりも大きい場合、CRCDATH レジスタに書き込むたびに VWORD<4:0>ビットが 1 つインクリメントします。CRCDATH レジスタに上位ワードを書き込む前に、CRCDATL レジスタに下位ワードを書き込む必要があります。

MSbからシフトインするには (LENDIAN = 0)、FIFO への格納時にソフトウェアでバイトとワードのスワップを実行する必要があります。図 5-1、図 5-2、図 5-3 に、各種データ幅に対するFIFO の図解を示します。

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

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

DS30009729B_JP - p.12 © 2011-2014 Microchip Technology Inc.

Page 13: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

図 5-1: FIFO に 8 ビット幅以下のデータを格納する場合

図 5-2: FIFO に 9 ~ 16 ビット幅のデータを格納する場合

図 5-3: FIFO に 17 ~ 32 ビット幅のデータを格納する場合

MOV.W W1, CRCDATL ; low byte is written first, then high byteMOV.W W2, CRCDATL ; low byte is written first, then high byteMOV.B W3, CRCDATL ; low byte onlyMOV.B W4, CRCDATL ; low byte onlyMOV.B W5, CRCDATL ; low byte onlyMOV.B W6, CRCDATL ; low byte only

W1 = 0x0201W2 = 0x0403W3 = 0x0005W4 = 0x0006W5 = 0x0007W6 = 0x0008

Resulting FIFO:

Initial Conditions: Code Executed to Fill the FIFO:

Write Location Value

W6L 7 0x08

W5L 6 0x07

W4L 5 0x06

W3L 4 0x05

W2H 3 0x04

W2L 2 0x03

W1H 1 0x02

W1L 0 0x01

W1 = 0x0A01W2 = 0x0B02W3 = 0x0C03W4 = 0x0D04

MOV.W W1, CRCDATL ; wordMOV.B W2, CRCDATL ; low byteMOV.W W3, CRCDATL ; wordMOV.W W4, CRCDATL ; word

Initial Conditions: Code Executed to Fill the FIFO:

Note 1: 値の「-」は、FIFO に元々格納されていたデータが変更されなかった事を意味します。

Resulting FIFO:

Write Location Value

W4 3 0x0D04

W3 2 0x0C03

W2L 1 0x-02(1)

W1 0 0x0A01

W1 = 0x0A01W2 = 0x0B02W3 = 0x0C03W4 = 0x0D04

MOV.W W1, CRCDATL ; low wordMOV.W W2, CRCDATH ; high word, write to FIFO occurs hereMOV.W W3, CRCDATL ; low wordMOV.W W4, CRCDATH ; high word, write to FIFO occurs here

Initial Conditions: Code Executed to Fill the FIFO:

Word Width > 16 Bits and 32 Bits:

Write Location Value

W4, W3 1 0x0D040C03

W2, W1 0 0x0B020A01

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.13

Page 14: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

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

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

FIFOからCRCシフトバッファへのデータ移動を開始するには、CRCGOビット(CRCCON1<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 ビットがセットされます。VWORDx ビットが 0 に達すると、CRCMPT ビットがセットされます。CRCEN を「0」にすると FIFO はエンプティになり、VWORD<4:0> ビットが

「00000」に設定されます。

CRC シフトクロック周波数は、CPU 命令クロックサイクル周波数の 2 倍です。従ってこのハードウェア シフト処理はソフトウェア シフタよりも高速です。これは、各ワードの計算がデータ幅の 1/2 の命令サイクル数で完了する事を意味します。例えば、32 ビットデータの 1 ワードの CRC 計算は 16 命令サイクルで完了します。

5.5.2 データシフトの命令サイクル数

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

5.5.3 CRC の初期値

CRC 書き込みバスを介して CRC シフトレジスタに直接書き込む経路があります。CPU は、CRCWDATL および CRCWDATH レジスタを使って、この経路にアクセスします。これらのレジスタには、計算の開始前に必要な CRC 初期値を書き込む事ができます。この CRC 初期値は非直接形式である必要があります。非直接形式とは、CRC と対象の CRC 初期値 ( 直接初期値 )が等しい値です。例えば、アプリケーションが CRC-32 多項式 0x04C11DB7 を使い、CRC 直接初期値 0xFFFFFFFF から計算を開始する必要がある場合、CRCWDATL と CRCWDATH レジスタには非直接値の 0x46AF6449 を書き込む必要があります。この非直接値 0x46AF6449 の CRCは 0xFFFFFFFF です。CRCWDAT レジスタによってシフトエンジンに非直接初期値を書き込むと、(PLEN<4:0> + 1)/2 命令サイクル後に CRC モジュールがこれを直接初期値に変換します。

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

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

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

DS30009729B_JP - p.14 © 2011-2014 Microchip Technology Inc.

Page 15: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

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

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

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

1. CRC モジュールを有効にして (CRCEN = 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)/2 命令サイクル待って結果をシフトアウトする

または

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}

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.15

Page 16: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

例 5-2 に、上記の手順を示します。

例 5-2: CRC モジュールを使って非直接初期値を求めるルーチン

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)

{CRCCON1 = 0;CRCCON2 = 0;

CRCCON1bits.CRCEN = 1; // enable CRCCRCCON1bits.CRCISEL = 0; // interrupt when all shifts are doneCRCCON2bits.DWIDTH = polynomialOrder-1; // data widthCRCCON2bits.PLEN = polynomialOrder-1; // polynomial lengthCRCCON1bits.CRCGO = 1; // start CRC calculation

polynomial >>= 1; // shift the polynomial right

polynomial = ReverseBitOrder(polynomial, polynomialOrder); // reverse bits order of the // polynomialCRCXORL = (unsigned short)(polynomial&0x0000FFFF); // set the reversed polynomialCRCXORH = (unsigned short)(polynomial>>16); seed = ReverseBitOrder(seed, polynomialOrder); // reverse bits order of the seed valueCRCWDATL = (unsigned short)(seed&0x0000FFFF); // set seed valueCRCWDATH = (unsigned short)(seed>>16);

_CRCIF = 0; // clear interrupt flagswitch(polynomialOrder) // load dummy data to shift out the // seed result{

case 8: *((unsigned char*)&CRCDATL) = 0; // load byte while(!_CRCIF); // wait until shifts are done seed = CRCWDATL&0x00ff; // read reversed seed

case 16: CRCDATL = 0; // load short while(!_CRCIF); // wait until shifts are done seed = CRCWDATL; // read reversed seed break;

case 32: // load long CRCDATL = 0; CRCDATH = 0; while(!_CRCIF); // wait for shifts are done seed = ((unsigned long)CRCWDATH<<16)|CRCWDATL; // read reversed seed break;

default: ;

}

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

}

DS30009729B_JP - p.16 © 2011-2014 Microchip Technology Inc.

Page 17: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

例 5-2: CRC モジュールを使って非直接初期値を求めるルーチン ( 続き )

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

// WHERE THE FUNCTION TO REVERSE THE BIT ORDER CAN BE

unsigned long ReverseBitOrder(unsigned long data, // input dataunsigned char numberOfBits) // width of the input data, // valid values are 8,16,32 bits

{unsigned long maskint = 0;unsigned long maskout = 0;unsigned long result = 0;unsigned char i;

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;}

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.17

Page 18: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

5.5.4 CRC 結果

CRC モジュールは、計算を終了するのにさらに (PLEN<4:0> + 1)/2 命令サイクルを必要とします。これらの追加サイクルを生成するために、多項式の次数(長さ)に等しい幅のダミーデータをCRCDATレジスタに書き込む必要があります。シフト完了後、CRC の最終結果は CRCWDAT レジスタから読み出せます (CRCWDATレジスタによりCRCシフトレジスタへ直接アクセスできます )。

全データが CRC モジュールに読み込まれたら、CRC の最終結果を得るために以下の手順を実行する必要があります。データ幅 (DWIDTH<4:0> ビット ) が多項式の長さ (PLEN<4:0> ビット )よりも大きい場合 :

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

2. シフトバッファからのシフトが確実に完了するように (DWIDTH<4:0> + 1)/2命令サイクル待つ

3. データ幅を多項式の長さに変更する (DWIDTH<4:0> = PLEN<4:0>)

4. CRCDAT レジスタにダミーデータ ワードを 1 つ書き込む

5. 2 命令サイクル待って FIFO からシフトバッファにデータを移動し、(PLEN<4:0> + 1)/2 命令サイクル待って結果をシフトアウトするまたはシフトが全て終了した時点で割り込みを受信できるように CRC 割り込み選択ビットをクリアする (CRCISEL = 0) 。CRC 割り込みフラグをクリアする。CRCDAT レジスタにダミーデータを書き込み、CRC 割り込みフラグがセットされるのを待つ

6. CRCWDAT レジスタから CRC の最終結果を読み出す

7. 以降の計算のためにデータ幅 (DWIDTH<4:0> ビット ) の値を元に戻す ( 任意 )

データ幅 (DWIDTH<4:0> ビット ) が多項式の長さ (PLEN<4:0> ビット ) 以下の場合、結果を得る手順は上記と異なります。

1. シフトが全て終了した時点で割り込みを受信できるように CRC 割り込み選択ビットをクリアする (CRCISEL = 0)

2. CRCGO = 0に設定して計算を一時停止する

3. CRC 割り込みフラグをクリアする

4. 全長が多項式の長さに等しいダミーデータを CRCDAT レジスタに書き込む

5. CRCGO = 1にセットして計算を再開する

6. CRC 割り込みフラグがセットされるのを待つ

7. CRCWDAT レジスタから CRC の最終結果を読み出す

CRC の結果が得られたら、CRCWDAT レジスタに再度 CRC 非直接初期値を書き込み、シフトバッファ内のダミーデータをクリアして新たに計算を開始します。

DS30009729B_JP - p.18 © 2011-2014 Microchip Technology Inc.

Page 19: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

例 5-3 に、多項式の次数が 8/16/32 ビットの場合について上記の手順を示します。

例 5-3: CRC 最終結果を得るルーチン

5.6 割り込み動作

CRC モジュールは、ユーザの設定に従って下記の条件のどれかで割り込みを生成します。CRCISEL が「1」の場合、VWORD<4:0> ビットの値が「1」から「0」に遷移すると割り込みを生成します。CRCISEL が「0」の場合、FIFO がエンプティになってシフトバッファからのシフトが完了すると割り込みを生成します。

セクション 9.0「レジスタマップ」の表に、CRC モジュールに関連する割り込みレジスタの詳細を示します。 割り込みと割り込み優先度設定の詳細は『dsPIC33/PIC24 ファミリ リファレンス マニュアル』の「割り込み」セクションを参照してください。

unsigned long GetCRC(unsigned char polynomialOrder, // valid values are 8,16,32unsigned char currentDataWidth) // valid values are 8,16,32{unsigned long crc = 0;

while(!CRCCON1bits.CRCMPT); // wait until data FIFO is empty

asm volatile ("repeat %0\n nop" : : "r"(currentDataWidth>>1)); // wait until previous data // shifts are done

CRCCON2bits.DWIDTH = polynomialOrder-1; // set data width to polynomial // length

CRCCON1bits.CRCISEL = 0; // interrupt when all shifts are done

_CRCIF = 0; // clear interrupt flag

switch(polynomialOrder) {

case 8: // polynomial length is 8 bits *((unsigned char*)&CRCDATL) = 0; // load byte

while(!_CRCIF); // wait until shifts are done crc = CRCWDATL&0x00ff; // get crc break;

case 16: // polynomial length is 16 bits CRCDATL = 0; // load short while(!_CRCIF); // wait until shifts are done crc = CRCWDATL; // get crc break;

case 32: // polynomial length is 32 bits CRCDATL = 0; // load long CRCDATH = 0; while(!_CRCIF); // wait until shifts are done crc = ((unsigned long)CRCWDATH<<16)|CRCWDATL; // get crc break;

default: ;

}CRCCON2bits.DWIDTH = currentDataWidth-1; // restore data width for further // calculations

return crc; // return the final CRC value

}

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.19

Page 20: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

6.0 プログラマブル CRC モジュールの利点

CRC アルゴリズムは簡単にソフトウェアに組み込めます。しかしシフト、ビット検査、XOR演算等の基本要件を実装するには、かなりの CPU 処理能力が必要です。さらに、CRC 計算は対話型処理であるため、データ転送命令による追加のソフトウェア オーバーヘッドがマイクロコントローラの MIPS 要件にとって著しい重荷となります。

dsPIC33/PIC24 の CRC エンジンは、CPU に負荷を掛けずに CRC チェックサムを計算します。しかもソフトウェア実装よりも大幅に高速です。CRC シフトクロックは dsPIC33/PIC24 の命令クロックサイクルの 2 倍であるため、計算には 1 ビットあたり 1/2 命令サイクルしか要しません。例えば、128 ビット (16x8) の長さを持つメッセージの CRC チェックサムを CRC ハードウェア エンジンを使って求めると、約 64 命令サイクルしかかかりません。同じ計算をソフトウェアで実行すると、最適化されたコードを使っても 1000 命令サイクル以上が必要です。

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

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

7.1 CRC 計算のバリエーション

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

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

7.2 代表的な動作

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

1. CRCEN ビットをセットしてモジュールを有効にする

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

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

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

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

4. CRCWDAT レジスタに書き込む事で、CRC 非直接初期値を設定する

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

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

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

DS30009729B_JP - p.20 © 2011-2014 Microchip Technology Inc.

Page 21: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

例 7-1, 例 7-2, 例 7-3, 例 7-4、例 7-5 に、多項式の長さ、データ幅、シフト方向の各種組み合わせの例を示します。

例 7-1: 8 ビット多項式、32 ビットデータ幅、MSb 先頭シフトの場合 (CRC SMBus)// ASCII bytes "12345678"volatile unsigned char __attribute__((aligned(2))) message[] = {'1','2','3','4','5','6','7','8'};

volatile unsigned char crcResultCRCSMBUS = 0;

int main (void){unsigned short* pointer;unsigned short length;unsigned short data_high;unsigned short data_low;////////////////////////////////////////////////////////////////////////////////// standard CRC-SMBUS////////////////////////////////////////////////////////////////////////////////

#define CRCSMBUS_POLYNOMIAL ((unsigned short)0x0007)#define CRCSMBUS_SEED_VALUE ((unsigned short)0x0000) // non-direct of 0x00

CRCCON1 = 0;CRCCON2 = 0;

CRCCON1bits.CRCEN = 1; // enable CRCCRCCON1bits.LENDIAN = 0; // big endianCRCCON1bits.CRCISEL = 0; // interrupt when all shifts are doneCRCCON2bits.DWIDTH = 32-1; // 32-bit data widthCRCCON2bits.PLEN = 8-1; // 8-bit polynomial orderCRCCON1bits.CRCGO = 1; // start CRC calculation

CRCXORL = CRCSMBUS_POLYNOMIAL; // set polynomialCRCXORH = 0;

CRCWDATL = CRCSMBUS_SEED_VALUE; // set initial valueCRCWDATH = 0;

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

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.21

Page 22: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

例 7-1: 8 ビット多項式、32 ビットデータ幅、MSb 先頭シフトの場合 (CRC SMBus) ( 続き )while(CRCCON1bits.CRCFUL); // wait if FIFO is full

data_low = *pointer++; // load from little endiandata_high = *pointer++;

asm volatile ("swap %0" : "+r"(data_low)); // swap bytes for big endianasm volatile ("swap %0" : "+r"(data_high));

CRCDATL = data_high; // 32-bit word access to FIFOCRCDATH = data_low; // swap 16-bit words for big endian

}

while(!CRCCON1bits.CRCMPT); // wait until FIFO is empty

// wait until previous data shifts are doneasm volatile ("repeat #16-#2\n nop"); // 16 cycles maximum for 32-bit data width

CRCCON2bits.DWIDTH = 8-1; // 8-bit// switch data width to polynomial length

_CRCIF = 0; // clear the interrupt flag // dummy data to shift out the CRC result

*((unsigned char*)&CRCDATL) = 0; // byte access to FIFO

while(!_CRCIF); // wait until shifts are donecrcResultCRCSMBUS = CRCWDATL&0x00ff; // get CRC result (must be 0xC7)

while(1);

return 1;}

DS30009729B_JP - p.22 © 2011-2014 Microchip Technology Inc.

Page 23: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

例 7-2: 16 ビット多項式、16 ビットデータ幅、LSb 先頭シフトの場合 (CRC 16)// 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 short)0x8005)#define CRC16_SEED_VALUE ((unsigned short)0x0000) // non-direct of 0x0000

CRCCON1 = 0;CRCCON2 = 0;

CRCCON1bits.CRCEN = 1; // enable CRCCRCCON1bits.CRCISEL = 0; // interrupt when all shifts are doneCRCCON1bits.LENDIAN = 1; // little endianCRCCON2bits.DWIDTH = 16-1; // 16-bit data widthCRCCON2bits.PLEN = 16-1; // 16-bit polynomial orderCRCCON1bits.CRCGO = 1; // start CRC calculation CRCXORL = CRC16_POLYNOMIAL; // set polynomialCRCXORH = 0;

CRCWDATL = CRC16_SEED_VALUE; // set initial valueCRCWDATH = 0; pointer = (unsigned short*)message; // calculate CRClengthr = sizeof(message)/sizeof(unsigned short);

while(length--){

while(CRCCON1bits.CRCFUL); // wait if FIFO is full

data = *pointer++; // load data

CRCDATL = data; // 16-bit word access to FIFO}

while(CRCCON1bits.CRCFUL); // wait if FIFO is full

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.23

Page 24: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

例 7-2: 16 ビット多項式、16 ビットデータ幅、LSb 先頭シフトの場合 (CRC 16) ( 続き )

CRCCON1bits.CRCGO = 0; // suspend CRC calculation to clear interrupt flag

_CRCIFt = 0; // clear interrupt flag

CRCDATL = 0; // load dummy data to shift out the CRC result // data width must be equal to polynomial length

CRCCON1bits.CRCGO = 1; // resume CRC calculation

while(!_CRCIF); // wait until shifts are done

crcResultCRC16 = CRCWDATL; // get CRC result (must be 0xE716)

while(1);

return 1;}

DS30009729B_JP - p.24 © 2011-2014 Microchip Technology Inc.

Page 25: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

例 7-3: 16 ビット多項式、16 ビットデータ幅、MSb 先頭シフトの場合 (CRC CCITT)// 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 short)0x1021)#define CRCCCITT_SEED_VALUE ((unsigned short)0x84CF) // non-direct of 0xffff

CRCCON1 = 0;CRCCON2 = 0;

CRCCON1bits.CRCEN = 1; // enable CRCCRCCON1bits.CRCISEL = 0; // interrupt when all shifts are doneCRCCON1bits.LENDIAN = 0; // big endianCRCCON2bits.DWIDTH = 16-1; // 16-bit data widthCRCCON2bits.PLEN = 16-1; // 16-bit polynomial orderCRCCON1bits.CRCGO = 1; // start CRC calculation

CRCXORL = CRCCCITT_POLYNOMIAL; // set polynomialCRCXORH = 0;

CRCWDATL = CRCCCITT_SEED_VALUE; // set initial valueCRCWDATH = 0;

pointer = (unsigned short*)message; // calculate CRClengthr = sizeof(message)/sizeof(unsigned short);

while(length--){

while(CRCCON1bits.CRCFUL); // wait if FIFO is full

data = *pointer++; // load data

asm volatile ("swap %0" : "+r"(data)); // swap bytes for big endian

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.25

Page 26: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

例 7-3: 16 ビット多項式、16 ビットデータ幅、MSb 先頭シフトの場合 (CRC CCITT) ( 続き )CRCDATL = data; // 16 bit word access to FIFO}

while(CRCCON1bits.CRCFUL); // wait if FIFO is full

CRCCON1bits.CRCGO = 0; // suspend CRC calculation to clear interrupt flag

_CRCIF = 0; // clear interrupt flag

CRCDATL = 0; // load dummy data to shift out the CRC result// data width must be equal to polynomial length

CRCCON1bits.CRCGO = 1; // resume CRC calculation

while(!_CRCIF); // wait until shifts are done

crcResultCRCCCITT = CRCWDATL; // get CRC result (must be 0x9B4D)

while(1);

return 1;}

DS30009729B_JP - p.26 © 2011-2014 Microchip Technology Inc.

Page 27: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

例 7-4: 32 ビット多項式、32 ビットデータ幅、LSb 先頭シフトの場合 (CRC 32)// 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 long crcResultCRC32 = 0;

int main(void){unsigned short* pointer;unsigned short length;////////////////////////////////////////////////////////////////////////////////// standard CRC-32////////////////////////////////////////////////////////////////////////////////#define CRC32_POLYNOMIAL ((unsigned long)0x04C11DB7)#define CRC32_SEED_VALUE ((unsigned long)0x46AF6449) // non-direct of 0xffffffff

CRCCON1 = 0;CRCCON2 = 0;

CRCCON1bits.CRCEN = 1; // enable CRCCRCCON1bits.CRCISEL = 0; // interrupt when all shifts are doneCRCCON1bits.LENDIAN = 1; // little endianCRCCON2bits.DWIDTH = 32-1; // 32-bit data widthCRCCON2bits.PLEN = 32-1; // 32-bit polynomial orderCRCCON1bits.CRCGO = 1; // start CRC calculation

CRCXORL = CRC32_POLYNOMIAL&0x0000ffff; // set polynomialCRCXORH = CRC32_POLYNOMIAL>>16;

CRCWDATL = CRC32_SEED_VALUE&0x0000ffff; // set initial valueCRCWDATH = CRC32_SEED_VALUE>>16;

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

while(CRCCON1bits.CRCFUL); // wait if FIFO is full

// 32-bit word access to FIFOCRCDATL = *pointer++; // must be written firstCRCDATH = *pointer++; // must be written last

}

while(CRCCON1bits.CRCFUL); // wait if FIFO is full

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.27

Page 28: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

例 7-4: 32 ビット多項式、32 ビットデータ幅、LSb 先頭シフトの場合 (CRC 32) ( 続き )CRCCON1bits.CRCGO = 0; // suspend CRC calculation to clear interrupt flag

_CRCIF = 0; // clear interrupt flag

CRCDATL = 0; // dummy data to shift out the CRC resultCRCDATH = 0;

CRCCON1bits.CRCGO = 1; // resume CRC calculation

while(!_CRCIF); // wait until shifts are done

crcResultCRC32 = ((unsigned long)CRCWDATH<<16)|CRCWDATL; // get the final CRC result

crcResultCRC32 = ~ReverseBitOrder(crcResultCRC32); // OPTIONAL// reverse CRC value bit order and// invert (must be 0x9AE0DAAF)

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;

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

}

return result;}

DS30009729B_JP - p.28 © 2011-2014 Microchip Technology Inc.

Page 29: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

例 7-5: 32 ビット多項式、データ幅切り換え、MSb 先頭シフトの場合// 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 short* pointer16;unsigned short length;

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

CRCCON1 = 0;CRCCON2 = 0;

CRCCON1bits.CRCEN = 1; // enable CRCCRCCON1bits.LENDIAN = 1; // little endianCRCCON2bits.DWIDTH = 32-1; // 32-bit data widthCRCCON2bits.PLEN = 32-1; // 32-bit polynomial orderCRCCON1bits.CRCGO = 1; // start CRC calculation

CRCXORL = CRC32_POLYNOMIAL&0x0000ffff; // set polynomialCRCXORH = CRC32_POLYNOMIAL>>16;

CRCWDATL = CRC32_SEED_VALUE&0x0000ffff; // set initial valueCRCWDATH = CRC32_SEED_VALUE>>16;

pointer16 = (unsigned short*)message1; // calculate CRClengthttt = sizeof(message1)/sizeof(unsigned long);while(length--)

{

while(CRCCON1bits.CRCFUL); // wait if FIFO is full

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.29

Page 30: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

例 7-5: 32 ビット多項式、データ幅切り換え、MSb 先頭シフトの場合 ( 続き )// 32-bit word access to FIFO

CRCDATL = *pointer16++; // must be written firstCRCDATH = *pointer16++; // must be written last

}

// wait until previous// data shifts are done

while(!CRCCON1bits.CRCMPT); // wait until FIFO is empty

asm volatile ("repeat #16-#2\n nop"); // 16 cycles maximum for 32-bit data

CRCCON2bits.DWIDTH = 8-1; // switch the data width to 8-bit

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

while(CRCCON1bits.CRCFUL); // wait if FIFO is full

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

while(!CRCCON1bits.CRCMPT); // wait until FIFO is empty

// wait until previous data shifts are doneasm volatile ("repeat #4-#2\n nop"); // 4 cycles maximum for 8-bit data

// switch the data width to polynomial lengthCRCCON2bits.DWIDTH = 32-1; // 32-bit

CRCDATL = 0; // dummy data to shift out the CRC resultCRCDATH = 0;

asm volatile ("repeat #2+#16-#2\n nop"); // delay 2 cycles to move data from FIFO// to shift buffer// and 16 cycles for 32-bit word to shift out// the final result

crcResultCRC32 = ((unsigned long)CRCWDATH<<16)|CRCWDATL; // get the final CRC result// (must be0xE092727E)

while(1);return 1;

}

DS30009729B_JP - p.30 © 2011-2014 Microchip Technology Inc.

Page 31: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

8.0 省電力モードの動作

8.1 スリープ

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

8.2 アイドル

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

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

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.31

Page 32: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsP

IC33/P

IC24

ファ

ミリ

リフ

ァレ

ンス

マニ

ュア

DS

30009729B

_JP - p.32

© 2011-2014 M

icrochip Technolo

gy Inc.

とめます。

Bit 3 Bit 2 Bit 1 Bit 0 全

リセット

LENDIAN - - - 0040

PLEN3 PLEN2 PLEN1 PLEN0 0000

X3 X2 X1 - 0000

X19 X18 X17 X16 0000

DATA3 DATA2 DATA1 DATA0 0000

DATA19 DATA18 DATA17 DATA16 0000

SDATA3 SDATA2 SDATA1 SDATA0 0000

0 SDATA19 SDATA18 SDATA17 SDATA16 0000

CRCIF U2ERIF U1ERIF - 0000

CRCIE U2ERIE U1ERIE - 0000

0 - - - - 4440

9.0 レジスタマップ

表 9-1 に、dsPIC33/PIC24 の 32 ビット プログラマブル巡回冗長検査 (CRC) モジュールに関連する特殊機能レジスタをま

表 9-1: プログラマブル CRC モジュール関連の特殊機能レジスタ (1)

SFR 名 Bit 15 Bit 14 Bit 13 Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4

CRCCON1 CRCEN - CSIDL VWORD4 VWORD3 VWORD2 VWORD1 VWORD0 CRCFUL CRCMPT CRCISEL CRCGO

CRCCON2 - - - DWIDTH4 DWIDTH3 DWIDTH2 DWIDTH1 DWIDTH0 - - - PLEN4

CRCXORL X15 X14 X13 X12 X11 X10 X9 X8 X7 X6 X5 X4

CRCXORH X31 X30 X29 X28 X27 X26 X25 X24 X23 X22 X21 X20

CRCDATL DATA15 DATA14 DATA13 DATA12 DATA11 DATA10 DATA9 DATA8 DATA7 DATA6 DATA5 DATA4

CRCDATH DATA31 DATA30 DATA29 DATA28 DATA27 DATA26 DATA25 DATA24 DATA23 DATA22 DATA21 DATA20

CRCWDATL SDATA15 SDATA14 SDATA13 SDATA12 SDATA11 SDATA10 SDATA9 SDATA8 SDATA7 SDATA6 SDATA5 SDATA4

CRCWDATH SDATA31 SDATA30 SDATA29 SDATA28 SDATA27 SDATA26 SDATA25 SDATA24 SDATA23 SDATA22 SDATA21 SDATA2

IFS4 - - - - - - - - - - - -

IEC4 - - - - - - - - - - - -

IPC16 - CRCIP2 CRCIP1 CRCIP0 - U2ERIP2 U2ERIP1 U2ERIP0 - U1ERIP2 U1ERIP1 U1ERIP

凡例 : - = 未実装、「0」として読み出し、網掛けしたビットは、プログラマブル CRC モジュールの動作には使いません。

Note 1: メモリマップの詳細は各デバイスのデータシートを参照してください。

Page 33: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

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

マニュアルの本セクションに関連するアプリケーション ノートの一覧を以下に記載します。これらのアプリケーション ノートは dsPIC33/PIC24 ファミリ向けに記述されたものではありませんが、基本的な考え方は共通しているため、若干の修正と制約のみでそのまま使えます。32ビット プログラマブル巡回冗長検査 (CRC) に関連する最新のアプリケーション ノートは以下の通りです。

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

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

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

© 2011-2014 Microchip Technology Inc. DS30009729B_JP - p.33

Page 34: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

dsPIC33/PIC24 ファミリ リファレンス マニュアル

11.0 改訂履歴

リビジョン A (2009 年 4 月 )

本書の初版です。

リビジョン B (2013 年 8 月 )

このリビジョンでの変更内容は以下の通りです。

• 文書名を『PIC24F ファミリ リファレンス マニュアル』から『dsPIC33/PIC24 ファミリ リファレンス マニュアル』に変更しました。

• レジスタ 3-1 の CRCISEL の説明を改訂しました。

• セクション 5.3「データのシフト方向」に情報を追加しました。

• セクション 5.4「FIFO」に情報を追加しました。

• 図 5-1、図 5-2、図 5-3 を訂正しました。

• セクション 5.5「CRC エンジン インターフェイス」を改訂しました。

• セクション 5.6「割り込み動作」を改訂し、サンプルコードを追加しました。

• セクション 7.2「代表的な動作」を改訂し、サンプルコードを追加しました。

• 本書全体に文言の若干の訂正を加えました。

DS30009729B_JP - p.34 © 2011-2014 Microchip Technology Inc.

Page 35: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

責任を否認します。生命維持装置あるいは生命安全用途に

Microchip 社の製品を使用する事は全て購入者のリスクとし、

また購入者はこれによって発生したあらゆる損害、クレーム、

訴訟、費用に関して、Microchip 社は擁護され、免責され、損

害を受けない事に同意するものとします。暗黙的あるいは明

示的を問わず、Microchip 社が知的財産権を保有しているライ

センスは一切譲渡されません。

2011-2014 Microchip Technology Inc.

商標

Microchip 社の名称とロゴ、Microchipロゴ、dsPIC、FlashFlex、KEELOQ、KEELOQ ロゴ、MPLAB、PIC、PICmicro、PICSTART、PIC32 ロゴ、rfPIC、SST、SST ロゴ、SuperFlash、UNI/O は、米

国およびその他の国におけるMicrochip Technology Incorporatedの登録商標です。

FilterLab、Hampshire、HI-TECH C、Linear Active Thermistor、MTP、SEEVAL、Embedded Control Solutions Company は、

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

です。

Silicon Storage Technology は、他の国における Microchip Technology Inc. の登録商標です。

Analog-for-the-Digital Age、Application Maestro、BodyCom、

chipKIT、chipKIT ロゴ、CodeGuard、dsPICDEM、dsPICDEM.net、dsPICworks、dsSPEAK、ECAN、ECONOMONITOR、

FanSense、HI-TIDE、In-Circuit Serial Programming、ICSP、Mindi、MiWi、MPASM、MPF、MPLAB Certified ロゴ、MPLIB、MPLINK、mTouch、Omniscient Code Generation、PICC、

PICC-18、PICDEM、PICDEM.net、PICkit、PICtail、REAL ICE、rfLAB、Select Mode、SQl、Serial Quad I/O、Total Endurance、TSHARC、UniWinDriver、WiperLock、ZENA および Z-Scaleは、米国およびその他の Microchip Technology Incorporatedの商標です。

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

GestIC および ULPP は、Microchip Technology Inc. の子会社

である Microchip Technology Germany II GmbH & Co. & KG 社

の他の国における登録商標です。

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

© 2011-2014, Microchip Technology Incorporated, All Rights Reserved.

ISBN: 978-1-62077-745-9

DS30009729B_JP - p. 35

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

Page 36: 32 ビット プログラマブル巡回冗長検査 (CRC)ww1.microchip.com/downloads/jp/DeviceDoc/30009729B_JP.pdfプログラマブルCRC ジェネレータを使うと、各種の通信およびセキュリティ

DS30009729B_JP - p.36 2011-2014 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, MATel: 774-760-0087 Fax: 774-760-0088

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

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

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

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

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

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

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

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

サンノゼ、CATel: 408-735-9110

カナダ - トロント

Tel: 905-673-0699 Fax: 905-673-6509

アジア / 太平洋アジア太平洋支社Suites 3707-14, 37th FloorTower 6, The GatewayHarbour City, KowloonHong KongTel: 852-2943-5100Fax: 852-2401-3431

オーストラリア - シドニー

Tel: 61-2-9868-6733Fax: 61-2-9868-6755

中国 - 北京

Tel: 86-10-8569-7000Fax: 86-10-8528-2104

中国 - 成都

Tel: 86-28-8665-5511Fax: 86-28-8665-7889

中国 - 重慶

Tel: 86-23-8980-9588Fax: 86-23-8980-9500

中国 - 杭州

Tel: 86-571-8792-8115Fax: 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-5533Fax: 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-7160Fax: 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-7830

台湾 - 台北

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-89-627-144-0 Fax: 49-89-627-144-44

ドイツ - プフォルツハイム

Tel: 49-7231-424750

イタリア - ミラノ 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

各国の営業所とサービス

03/25/14