RFID协议中CRC如何计算

发布于 2024-10-04 04:51:19 字数 276 浏览 2 评论 0原文

从 RFID 设备读取数据时,您会在有效负载上发现 CRC-CCITT。 “CRC 初始化为 0x3791,而不是通常的值 0xFFFF。”我如何定义检查 CRC 是否正常的函数。

示例

数据:{0x02、0x40、0x00、0x00、0x00、0x00、0xA0} CRC: { 0x60, 0xE7 }

另一个示例

数据: { 0x02, 0x41, 0x00, 0x00, 0x00, 0x00, 0xA4 } CRC:{0x6F,0xA5}

When reading data from a RFID device you will find a CRC-CCITT over the payload. "The CRC is initialized with 0x3791 instead of the usual value 0xFFFF." How can I define the function, that checks that the CRC is ok.

sample

data: { 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0xA0 }
CRC: { 0x60, 0xE7 }

another sample

data: { 0x02, 0x41, 0x00, 0x00, 0x00, 0x00, 0xA4 }
CRC: { 0x6F, 0xA5 }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

菩提树下叶撕阳。 2024-10-11 04:51:19

实现此功能的唯一方法是实施逐位算法(TMS37157 数据表图 52)。

UINT16 rfid_get_crc(const UINT8 * data, INT8 size)
{
 static BOOL lsb;
 static BOOL rxdt;
 static UINT16 crc;
 static UINT8 bits;
 static UINT8 byte;
 static UINT8 i;
 const UINT16 RFID_CRC_INIT = 0x3791;

 crc = RFID_CRC_INIT;
 for (i=0; i<size; i++)
 {
  bits = 8;
  byte = data[i]; // Next byte
  while (bits --> 0)
  {
   lsb = crc & 1; // Store LSB
   crc >>= 1; // Shift right 1 bit
   rxdt = byte & 1;
   if (rxdt)
    crc |= 0x8000; // Shift in next bit
   if (lsb) // Check stored LSB
    crc ^= 0x8000; // Invert MSB
   if (0x8000 == (crc & 0x8000)) // Check MSB
    crc ^= 0x0408; // Invert bits 3 and 10
   byte >>= 1; // Next bit
  }
 }
 return crc;
}

The only way I could get this to work was by implementing the bit-by-bit algorithm (TMS37157 datasheet Figure 52).

UINT16 rfid_get_crc(const UINT8 * data, INT8 size)
{
 static BOOL lsb;
 static BOOL rxdt;
 static UINT16 crc;
 static UINT8 bits;
 static UINT8 byte;
 static UINT8 i;
 const UINT16 RFID_CRC_INIT = 0x3791;

 crc = RFID_CRC_INIT;
 for (i=0; i<size; i++)
 {
  bits = 8;
  byte = data[i]; // Next byte
  while (bits --> 0)
  {
   lsb = crc & 1; // Store LSB
   crc >>= 1; // Shift right 1 bit
   rxdt = byte & 1;
   if (rxdt)
    crc |= 0x8000; // Shift in next bit
   if (lsb) // Check stored LSB
    crc ^= 0x8000; // Invert MSB
   if (0x8000 == (crc & 0x8000)) // Check MSB
    crc ^= 0x0408; // Invert bits 3 and 10
   byte >>= 1; // Next bit
  }
 }
 return crc;
}
稍尽春風 2024-10-11 04:51:19

更紧凑的实现(伪代码)是:

// Least significant bit first (little-endian)
  // x^16+x^12+x^5+1 = 1000 0100 0000 1000 (1) = 0x8408
  function crc(byte array string[1..len], int len) {

     //Other RFID tags I have seen use initialization of 0x0000:
     //rem  := 0x3791;

     rem  := 0x3791;

      for i from 1 to len {
         rem  := rem xor string[i]
         for j from 1 to 8 {   // Assuming 8 bits per byte
              if rem and 0x0001 {   // if rightmost (most significant) bit is set
                 rem  := (rem rightShift 1) xor 0x8408
             } else {
                 rem  := rem rightShift 1
             }
         }
     }
     // A popular variant complements rem here
      return rem

这可以在以下代码片段 5 中找到:

http:// en.wikipedia.org/wiki/Computation_of_circlic_redundancy_checks

A more compact implementation( in pseudo code ) is:

// Least significant bit first (little-endian)
  // x^16+x^12+x^5+1 = 1000 0100 0000 1000 (1) = 0x8408
  function crc(byte array string[1..len], int len) {

     //Other RFID tags I have seen use initialization of 0x0000:
     //rem  := 0x3791;

     rem  := 0x3791;

      for i from 1 to len {
         rem  := rem xor string[i]
         for j from 1 to 8 {   // Assuming 8 bits per byte
              if rem and 0x0001 {   // if rightmost (most significant) bit is set
                 rem  := (rem rightShift 1) xor 0x8408
             } else {
                 rem  := rem rightShift 1
             }
         }
     }
     // A popular variant complements rem here
      return rem

This can be found in Code Fragment 5 of:

http://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文