原创 我的RFID阅读器开发过程[2]

2007-11-2 00:14 3651 7 7 分类: 通信
    在[1]里面已经搞定了REQA,这时候卡片会处于ready的状态。在这个状态时,就可以读它的UID了。好像也只能按照这个次序来读。在这个读UID的阶段,得实现那个防冲突防碰撞的算法,叫什么二进制检索树什么的。至于该怎么写程序去实现它,我现在还没有详细去了解。先放一放。先把单张卡片的UID读回来。
    这时候的命令有两个字节。0x93+0x20。不需要CRC校验,但是需要奇偶校验。这都是标准里面的,可惜我还是没有找到详细的资料,只有把几份资料参对着看,然后试出来。所以很是郁闷。等我找到了,我就上传上来,见者有份。

#define PICC_ANTICOLL1  0x93   /*防冲撞*/
#define PICC_NVB1       0x20   //
#define PICC_NVB2       0x70

void test_anti(void)   //防碰撞,暂时没有实现
{   uint8 i,temp;
    Wr_Rd_PCD(0,RegCommand,PCD_IDLE); //清除上次的命令,可以不要
    Wr_Rd_PCD(0,RegChannelRedundancy,0x03); //发送奇校验位
    Wr_Rd_PCD(0,RegBitFraming,0x00);//根据标准, 发送8bit的数据
    Wr_Rd_PCD(0,RegFIFOData,PICC_ANTICOLL1);//先往FIF0写入防冲突命令 0x93
    Wr_Rd_PCD(0,RegFIFOData,PICC_NVB1);//0x93 + 0x20
    Wr_Rd_PCD(0,RegCommand,PCD_TRANSCEIVE);  //发送命令
    delay_50us(10000);                  //500ms
    temp=Wr_Rd_PCD(1,RegFIFOLength,RDONEBYTE);
    test(temp);
    if(temp>0){
        for(i=0;i
            anti= Wr_Rd_PCD(1,RegFIFOData,RDONEBYTE);
        }
        for(i=0;i
    }   
}

     RegChannelRedundancy寄存器老得改变。还好SPI的速度很快。关于LPC2102这款单片机的SPI的使用,周立功的网站上有。我就不用多说啥了。

    当阅读器给卡片发出0x93+0x20后,卡片就会返回数据,有4个字节,也可以有更多的字节,有着更多的字节该怎么办,我暂时还不知道。
    UID0,UID1,UID2,UID3 分别等于anti[0],anti[1],anti[2],anti[3]。
    接着再把这个序列号发给卡片。
    命令序列如下:
    0x93+0x70+UID0+UID1+UID2+UID3+BCC+CRC16
    CRC16是硬件自动产生的,不需要软件计算。
    BCC需要通过软件来计算。BCC=UID0^UID1^UID2^UID3; 序列号的异或。
    于是往RegFIFOData写入7个字节后,启动发送接收,就会得到一个应答。这叫选择应答,至此,卡片才正儿八经给激活,可以交换数据。

void test_select(void)     //选择卡
{
    uint8 i,temp;
    Wr_Rd_PCD(0,RegCommand,PCD_IDLE);  
    Wr_Rd_PCD(0,RegChannelRedundancy,0x07);//发送奇校验位,CRC16
    Wr_Rd_PCD(0,RegBitFraming,0x00);//根据标准, 发送8bit的数据
    Wr_Rd_PCD(0,RegFIFOData,PICC_ANTICOLL1);//往FIF0写入防冲突
    Wr_Rd_PCD(0,RegFIFOData,0x70);           //0x93 + 0x70
    Wr_Rd_PCD(0,RegFIFOData,anti[0]);
    Wr_Rd_PCD(0,RegFIFOData,anti[1]);
    Wr_Rd_PCD(0,RegFIFOData,anti[2]);
    Wr_Rd_PCD(0,RegFIFOData,anti[3]);
    temp = (anti[0]^anti[1]^anti[2]^anti[3]);
    Wr_Rd_PCD(0,RegFIFOData,temp);
    Wr_Rd_PCD(0,RegCommand,PCD_TRANSCEIVE);       //发送命令
    delay_50us(10000);                  //500ms
    temp=Wr_Rd_PCD(1,RegFIFOLength,RDONEBYTE);
    test(temp);
    if(temp>0){
        for(i=0;i
            selsak= Wr_Rd_PCD(1,RegFIFOData,RDONEBYTE);
        }
        for(i=0;i
    }   
}
    注意:RegChannelRedundancy=0x07了。

    到这里,已经进行了3步。在后面,软件的工作量还很大。我弄一部分就整理一部分上来。至于硬件原理图什么的,比较简单。照着文档做就可以。个人觉得,真地好麻烦,因为有模拟的部分。有时候真的很难判断是硬件还是软件的问题。毕竟没有这方面的经验,也没有相应的仪器。网络分析仪、频谱分析仪,又岂是俺能买得起的。再说了,也不划算嘛,还不如直接买个别人做的开发板呢。上面的天线都是调谐的。只是没有什么意思,以后还是得自个做的,嵌入式嘛,体积有要求,功能集成上有要求。另外我觉得,折腾折腾它的天线还是蛮有意思的,等我借到仪器再说。好了,今天就到这一步了,下线继续测试。

;i++)>;i++){>;i++)>;i++){>

;i++)>;i++){>;i++)>;i++){>

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条