• 2012.5.3上午


    影响阅读器接收电路架构的参数:1.天线工作的中心频率,标签的反射方式,包括幅度调制和相位调制。电子标签返回数据的编码,主要为基带调制方式和副载波的调制方式。电子标签返回数据的速率在40~640kbs之间。

    在干扰比较严重的环境下可以使用低通信速率,在干扰比较小的环境下可以使用高通信速率,从而保证通信过程的准确性。

    EPC Gen2协议的实现,包括编解码、防冲突、定时控制、串口通信、CRC校验等模块。

    EPC Gen2协议中最小时间单位Tari可为6.25us、12.5us或者25us

    射频模块的功能包括:调制发射经过D/A转换的基带信号、给标签提供能量和接收由标签散射的回波并解调至控制部分。协议中国规定,读写器发往标签的信息可以采用双边带幅度见空(DSB-ASK)、单边带幅度键控(SSB-AK)或者反向相位幅度键控(PR-ASK)的方法进行调制载波,调制深度典型值为90%,载波频率范围为860MHZ~960MHZ。而由于标签采用的是反向散射调制,在标签应答过程中读写器必须继续发送连续无调制波(CW),以使得标签的反向散射得以保持。

    计算CRC-16循环冗余校验码的C51程序

    一、计算步骤:

    1、定义一个初始值为FFFF的16位的组合变量(regs),该变量称为CRC寄存器。

    2、把欲发送或接收消息的高8位和CRC寄存器的底8位作异或运算,并把结果在赋到CRC寄存器。

    3、CRC寄存器右移1位(朝最低位),同时最高位添零。取出并检查最低位是否为1。

    4、如果为1,则CRC寄存器与多项式A001异或;如果为0,则重复第3步的动作。

    5、重复3和4直到完成了8次移位。这样完整的8位字节将完成处理了。

    6、对于下一个8位字节的处理就是重复第2步到第5步了

    7、把所有的欲发送或接收消息这样处理后,CRC寄存器里的值就是我们最终需要得到的CRC校验码(在result中)。

    二、C51源程序

    /*CRC数组计算程序*/

    #include <stdio.h>

    typedef unsigned char uchar;//定义简写类型

    typedef unsigned short u16;//定义简写类型

    u16 result;//放计算后的CRC结果值

    u16 len=6;//参与计算的数组个数(不包括CRC两子节)

    //数组1

    //uchar ppp[]={0xFF,0x03,0xC0,0x21,0x04,0x03,0x00,0x07,0x0D,0x03,0x06};

    //CRC高节=0x9b,CRC低节=0x03,即result=0x9B03  len=11

    //数组2

    uchar ppp[]={0x64,0x03,0x00,0x0A,0x00,0x01};

    //CRC高节=0xfd,CRC低节=0xad 即result=0xfdad len=6

    //定义组合结构

    typedef union

    {

        u16 val;

        struct

        {

            u16 bit0 : 1;

            u16 bit1 : 1;

            u16 bit2 : 1;

            u16 bit3 : 1;

            u16 bit4 : 1;

            u16 bit5 : 1;

            u16 bit6 : 1;

            u16 bit7 : 1;

            u16 bit8 : 1;

            u16 bit9 : 1;

            u16 bit10 : 1;

            u16 bit11 : 1;

            u16 bit12 : 1;

            u16 bit13 : 1;

            u16 bit14 : 1;

            u16 bit15 : 1;

        } bits;

    } CRCREGS;

    CRCREGS regs;

    u16 CRCCheck(uchar *pp,u16 CRClen)

    {

    bit a;

    int i,j;

    regs.val=0xffff;

    pp=&ppp[0];

    for(i=0;i<CRClen;i++)

    {

      regs.val^=pp[i];

      for(j=0;j<8;j++)

       {

        a=regs.bits.bit0;

        regs.val>>=1;  

        if(a) regs.val^=0xA001;

       }

    }

      return regs.val;

    }

    /* 主程序 */

    void main()

    {

    result=CRCCheck(ppp,len);

    }

    三、简要说明

    1、程序中列了两组数,可以做测试用,结果都在注释中,注意 len 的值要与数组的个数相匹配,数组1为11,数组2为6;

    2、regs.val是一个共用体变量,该变量既可以作为字用,也可以进行位操作,详细情况请参照变量union和共用和struct结构类型体说明;

    3、在主程序中直接调用result=CRCCheck(ppp,len);即可得到CRC-16结果,注意ppp是一个数组变量,在函数中是当成数组变量指针用的。

    本人参考了许多资料,通过反复修本人认为是比较精练的C51程序,完全可以直接用到编程中去。希望能够对同行有所帮助。 

    EDN博客:http://bbs.ednchina.co/BLOG_wangxinfeng6666_422817.HTM
  • 相关阅读:
    关于DOM事件操作
    js 去掉字符串前后空格
    oracle创建表索引
    导入Excel -- 套路及代码分析
    漫谈五种IO模型(主讲IO多路复用)
    Reactor模式
    jvm
    Python入门学习资料推荐
    ConcurrentHashMap & Hashtable
    分布式系统的接口幂等性设计
  • 原文地址:https://www.cnblogs.com/cecwxf/p/2481278.html
Copyright © 2020-2023  润新知