18000-6C整理-入门query/CRC-5

关于session

协议包括物理层和标签识别层

RFID标签使用常识整理

上面链接提到的18000-6C整理-入门query/CRC-5_第1张图片

进制表述不准确,应该为下图:

18000-6C整理-入门query/CRC-5_第2张图片

一个字指16位 2字节

CW调制:等幅度连续波

RFID梳理

RFID知识点

18000-6C整理-入门query/CRC-5_第3张图片

18000-6C整理-入门query/CRC-5_第4张图片

CRC-5算不出来,可以自己写程序测试一下,参考程序

源代码:
/******************************************************************************
 * Name:    CRC-5/EPC           x5+x3+1
 * Poly:    0x09
 * Init:    0x09
 * Refin:   False
 * Refout:  False
 * Xorout:  0x00
 * Note:
 *****************************************************************************/
uint8_t crc5_epc(uint8_t *data, uint_len length)
{
    uint8_t i;
    uint8_t crc = 0x48;        // Initial value: 0x48 = 0x09<<(8-5)
    while(length--)
    {
        crc ^= *data++;        // crc ^= *data; data++;
        for ( i = 0; i < 8; i++ )
        {
            if ( crc & 0x80 )
                crc = (crc << 1) ^ 0x48;        // 0x48 = 0x09<<(8-5)
            else
                crc <<= 1;
        }
    }
    return crc >> 3;
}

修改后代码:
#include 
#include 

uint8_t crc5Bitwise(uint16_t bits)
{
    uint32_t a;
    uint32_t crc;
    uint32_t crc_n;

    a = 0x00821200;//0x00821200 论文 ; CRC-5:0x08
    crc = (0x09 << 19);

    while(bits--)
    {
        crc_n  = (crc << 1) & 0xFFFFFFFF;
        crc_n ^= ((a ^ crc) & (1<<23)) ? (0x29 << (19)) : 0;
        crc    = crc_n;
        a      = (a << 1) & 0xFFFFFFFF;
    }
    crc >>= 19;
    crc ^= 0x0000001F;
    crc = ~crc;  
    crc &= 0x0000001F;

    return (uint8_t)crc;
}
int main()
{
	uint8_t test[4]={0x12,0x34,3,4}, value;	
	value = crc5Bitwise(17);
	printf("crc输出结果为0x%.2x ",value);
	
   return 0;
}

参考   手动计算

CRC-5始终算不到

找了个程序是国标的,它计算的CRC-5是RN16中的CRC-5,而不是query的CRC-5,国标和iso18000-6C定义的query不一样,如下图

18000-6C整理-入门query/CRC-5_第5张图片

18000-6C整理-入门query/CRC-5_第6张图片

RN16的产生和tag的EPC码,场的能力和传输速率有关

论文参考1 参考论文2  ISO18000各种协议 论文里面提到的伪代码

18000-6C整理-入门query/CRC-5_第7张图片转换为C语言格式

uint8_t crc5Bitwise(uint16_t bits)//bits:17
{
    uint32_t a;
    uint32_t crc;
    uint32_t crc_n;

    a = 0x00821200;//数据(缺位补0):0x00821200  CRC-5:0x08
    crc = (0x09 << 19);//5+19=24

    while(bits--)
    {
        crc_n  = (crc << 1) & 0xFFFFFFFF;
        crc_n ^= ((a ^ crc) & (1<<23)) ? (0x29 << (19)) : 0;//0x29:0010 1001
        crc    = crc_n;
        a      = (a << 1) & 0xFFFFFFFF;
    }
    crc >>= 19;
    crc ^= 0x0000001F;
    crc = ~crc;  
    crc &= 0x0000001F;

    return (uint8_t)crc;
}

 

你可能感兴趣的:(C,RFID)