ISO / IEC 14443a CRC计算

时间:2016-11-29 15:13:01

标签: nfc rfid crc psoc

大家好,我正在为我的NFC项目完成固件的最后一部分。我正在尝试与使用恩智浦MF0ULx1 MIFARE Ultralight EV1 - 非接触式票证IC的AD-740 NFC标签进行通信。我使用的NFC读卡器是恩智浦的CLRC663。我通过SPI使用PSOC5LP设备控制NFC读卡器。

现在您已掌握了所有背景信息,现在我将问我的问题。

对于这个特定的NXP Read Method,我需要将我的Cmd和Addr编码为长度为2个字节的CRC。我可以链接到的数据表引用了ISO / IEC 14443.在Google中搜索它会将我带到维基百科页面,然后显示PDF的四个部分。我假设我需要第4节传输协议部分。唯一的问题是此PDF被付费墙阻止。这是故意的吗?

在互联网上搜索我发现了一些代码示例,可能会阻止我购买170美元的PDF来查看多项式...

代码示例1 - 我可以在评论中发布源链接。没有代表在主要职位上做这件事。

+----+-------+-----------------+-----------------+-----------------+-----------------+---------+---------+
| id | name  | col_to_compare1 | col_to_compare2 | col_to_compare3 | col_to_compare4 | min_col | max_col |
+----+-------+-----------------+-----------------+-----------------+-----------------+---------+---------+
| 1  | John  | 5               | 5               | 2               | 1               | 1       | 5       |
+----+-------+-----------------+-----------------+-----------------+-----------------+---------+---------+
| 2  | Peter | 3               | 2               | 4               | 1               | 1       | 4       |
+----+-------+-----------------+-----------------+-----------------+-----------------+---------+---------+
| 3  | Josh  | 3               | 5               | 1               | 3               | 1       | 5       |
+----+-------+-----------------+-----------------+-----------------+-----------------+---------+---------+

代码示例2 - 我可以在评论中发布源链接。没有代表在主要职位上做这件事。

    // 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)}
    }

现在关于我的最后一个问题,包含所有这些信息......可以安全地假设:

CRC多项式为:0x6363

种子值为:0x00FF

可以看到here

的直观表示

2 个答案:

答案 0 :(得分:3)

ISO14443A多项式为0x8408,初始值为0x6363。

答案 1 :(得分:0)

我在计算ISO / IEC 14443的CRC_A时找到了一些有用的资源:

对于后人,这是libnfc对iso14443a_crc的实现:

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