nfc - ISO/IEC 14443a CRC 计算

标签 nfc rfid crc psoc

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

现在您已经了解了所有背景信息,我现在要问我的问题了。

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

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

代码示例 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

最佳答案

我找到了一些有助于计算 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);
}

关于nfc - ISO/IEC 14443a CRC 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40869293/

相关文章:

android - Kotlin EMV android.nfc.Tag.setConnectedTechnology 错误

java - 点击另一个支持 NFC 的设备后无法进入 onNewIntent。(android)

android - 适用于三星 Galaxy S4 的 Mifare DESFire EV1 NFC 标签

Android NFC 读取标签问题。每次收到数据时 Activity 都会启动

php - 将用 C 编写的 8 位 CRC 函数转换为 PHP

java - 如何用Java计算CRC8

java - 使用我们自己的 android 应用程序在 MifareClassic 卡上写入

.net - 为什么我的 RFID 阅读器读取到不存在的 RFID 标签代码?

python - 使用 Raspberry & python 读取 USB RFID

java - spark checkpoint ".bk"和 ".crc"文件的功能是什么?