2016-11-29 32 views
2

こんにちは皆、私のNFCプロジェクトのファームウェアの最後のセクションを終了しています。私は、NXPのMF0ULx1 MIFARE Ultralight EV1 - 非接触チケットICを使用するAD-740 NFCタグと通信しようとしています。私が使用しているNFCリーダーはNXPのCLRC663です。私はSPI上のPSOC5LPデバイスでNFCリーダーを制御しています。ISO/IEC 14443a CRC計算

あなたはすべての背景情報を持っているので、私は今質問します。

この場合、NXP Read Method私はCmdとAddrを長さ2バイトのCRCにエンコードする必要があります。私がリンクできるデータシートは、ISO/IEC 14443を参照しています。Googleでそれを検索すると、ウィキペディアのページに移動し、PDFの4つのセクションが表示されます。私はセクション4の伝送プロトコルセクションが必要であると仮定しています。唯一の問題は、このPDFが有料壁によってブロックされていることです。これは意図的なのですか?私はちょうど多項式を見て170 $のPDFを購入するから私を防ぐことができ、いくつかのコード例を発見したインターネット上での周りのScrounging

...

コード例1 - 私はコメントにソースリンクを投稿することができます。メインポストでそれをする担当者を持っていない。

// Calculate an ISO 14443a CRC. Code translated from the code in 
    // iso14443a_crc(). 
    func ISO14443aCRC(data []byte) [2]byte { 
     crc := uint32(0x6363) 
     for _, bt := range data 
     { 
      bt ^= uint8(crc & 0xff) 
      bt ^= bt << 4 
      bt32 := uint32(bt) 
      crc = (crc >> 8)^(bt32 << 8)^(bt32 << 3)^(bt32 >> 4) 
     } 

     return [2]byte{byte(crc & 0xff), byte((crc >> 8) & 0xff)} 
    } 

コード例2 - コメントにソースリンクを投稿することができます。メインポストでそれをする担当者を持っていない。私の最後の質問はこの情報のすべてと ...それを仮定しても安全だろうと

void iso14443a_crc(byte_t* pbtData, size_t szLen, byte_t* pbtCrc) 
    { 
     byte_t bt; 
     uint32_t wCrc = 0x6363; 

     do { 
     bt = *pbtData++; 
     bt = (bt^(byte_t)(wCrc & 0x00FF)); 
     bt = (bt^(bt<<4)); 
     wCrc = (wCrc >> 8)^((uint32_t)bt << 8)^((uint32_t)bt<<3)^((uint32_t)bt>>4); 
     } while (--szLen); 

     *pbtCrc++ = (byte_t) (wCrc & 0xFF); 
     *pbtCrc = (byte_t) ((wCrc >> 8) & 0xFF); 
    } 

そして今:

CRC多項式である:0x6363

シード値0x00FF

視覚的表現が見られますhere

+0

[MF0ULx1 Datahsheet](のhttp://キャッシュ。 nxp.com/documents/data_sheet/MF0ULX1.pdf?pspll=1) | [コード例1ソース](https:// github。com/fuzxxl/nfc/blob/master/dev/nfc/crc.go#L23) | [コード例2ソース](https://git.eleves.ens.fr/hackens/libnfc/blob/a78cae1c1505dec2c3e411a0592fcbc133c78644/src/lib/bitutils.c) – CDutko

答えて

3

ISO14443A多項式は0x8408、初期値は0x6363です。

+0

ありがとうございましたが、可能な方法はありますかこれらが正しい値であることを証明してください。 – CDutko

+0

私は正直にあなたがそれらの数字を思い付いたかどうかわかりませんが、私は彼らが正しいと確信しています。私はそれらの同じ値を持つ複数のソースを今見つけています。 – CDutko

+2

私はあなたにiso14443-3を読むように言うことができましたが、それはすばらしいでしょう:) – Nipo

0

私はISO/IEC 14443のためのCRC_Aの計算にいくつかの有用なリソースを見つけた:

バイト配列にそれを追加するバリアントを持って、ここiso14443a_crcのlibnfcの実装です:

void 
iso14443a_crc(uint8_t *pbtData, size_t szLen, uint8_t *pbtCrc) 
{ 
    uint32_t wCrc = 0x6363; 

    do { 
    uint8_t bt; 
    bt = *pbtData++; 
    bt = (bt^(uint8_t)(wCrc & 0x00FF)); 
    bt = (bt^(bt << 4)); 
    wCrc = (wCrc >> 8)^((uint32_t) bt << 8)^((uint32_t) bt << 3)^((uint32_t) bt >> 4); 
    } while (--szLen); 

    *pbtCrc++ = (uint8_t)(wCrc & 0xFF); 
    *pbtCrc = (uint8_t)((wCrc >> 8) & 0xFF); 
}