2010-11-26 79 views
2

從RFID設備讀取數據時,您會在有效負載上找到CRC-CCITT。 「CRC被初始化爲0x3791而不是通常的值0xFFFF。」我如何定義這個函數來檢查CRC是否正常。如何計算RFID協議中的CRC

樣品

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

另一個樣品

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

+0

是你能解決這個問題?怎麼樣? – jacknad 2011-01-25 21:09:21

回答

0

我能得到這個工作的唯一方法通過實施逐位算法(圖52中的TMS37157數據表)。

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

一個更緊湊的實現(在僞代碼)是:

// 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_cyclic_redundancy_checks