2013年10月14日月曜日

1WireのCRC計算

1WireのCRC生成コードです

      4 /* CRCを含めたデータサイズ(バッファサイズ) */
      5 uint8_t CalcCRC(uint8_t *pData, uint8_t DataSize) {
      6   register uint8_t *pCRC = pData + DataSize -1;
      7   register uint8_t dat;
      8   int i;
      9
     10   if (!*pCRC) { DataSize--; }
     11
     12   for (i = 0; i < DataSize; i++) {
     13     dat = pData[i];
     14
     15     *pCRC = ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC >> 1); dat >>= 1;
     16     *pCRC = ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC >> 1); dat >>= 1;
     17     *pCRC = ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC >> 1); dat >>= 1;
     18     *pCRC = ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC >> 1); dat >>= 1;
     19     *pCRC = ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC >> 1); dat >>= 1;
     20     *pCRC = ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC >> 1); dat >>= 1;
     21     *pCRC = ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC >> 1); dat >>= 1;
     22     *pCRC = ((dat ^ *pCRC) & 1) ? (((*pCRC ^ 0x18) >> 1) | 0x80) : (*pCRC >> 1); dat >>= 1;
     23   }
     24 }

ROMコードであれば8バイトのバッファとバッファ長8を渡します
バッファはファミリコードが0バイト目 CRCが7バイト目になるような配列です
CRCが0の場合はCRCを生成し
CRCが0以外の場合はCRCを再計算します

CRCを生成する条件で読んだ場合はCRCの部分にCRCデータが入りますが
CRCを再計算する条件の場合は0になれば正常です 0以外の場合はCRCデータを含めいずれかの1つ以上のビットが破壊されています

上の*pCRC = ((dat ^...のコードはforで回すべきですが
今回は8回分ベタ書きしています
この最適化がどれくらいに効果があるかは不明ですが とりあえず気分の問題ってことで

0 件のコメント:

コメントを投稿