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

2007-11-1 23:39 4811 5 5 分类: 通信
    单片机使用LPC2102,用ISP的方式开发。读卡芯片FM1702NL。SPI的方式。

    使用SPI接口时,有一个需要注意的地方。在FM1702NL的芯片资料上并没有详细的介绍,后来我还是从FM1702SL的资料看到的。就是SPI接口的确认过程,并口需要确认,SPI口也需要确认。

    文字描述就是:先在读卡芯片的RSTPD管脚产生个复位信号->读芯片的命令寄存器是否为0,不是0就不断检测->如果为0,往Page register里面写0x80->再判断命令寄存器是否为0->如果为0,往Page register里面写0x00。到这里,FM1702的SPI初始化就算完成了。

    接下来就去读type A的卡。如果天线调谐得很棒的话,设置一下几个寄存器就可以读到卡片的信息了。至于天线如何调谐,别问我,我也不清楚。运气好的话,你可以拎个示波器来看看波形,正弦波的波形非常好的话,就表示高次谐波的功率非常低。反正我是运气较好,调了一个1cm范围的天线,嘿嘿,高兴一会会。不过在那个什么防碰撞上面,可是遇到了麻烦。于是这部分的程序我留到以后再写。先按照一张卡片来吧。整个简单的流程先玩一遍。

    激活卡片有两个命令,如下:
    #define PICC_REQIDL  0x26 /*寻天线区内未进入休眠状态的卡*/
    #define PICC_REQALL  0x52  /*寻天线区内全部卡*/
    我当然用后面那个,至于这两者有多大区别,我还得试过才知道。我现在还不知道怎么样才能让卡片休眠呢。

    这个寻卡的命令仅由7个数字位组成。仅由7个   仅由7个   仅由7个
    次序如下,看以下函数,很简单的,猜都能猜出是啥意思。
void testATR(void) //做测试用的,通过串口返回数据,在串口
{                  //助手里面用hex的方式察看
    uint8 i,temp;
    Wr_Rd_PCD(0,RegTxControl,0x5b);     //发送载波,当然得先发送
           //调天线时也是这样,没有载波怎么调嘛。赋值的具体含义参看
           //芯片的pdf文档,我就不拷贝过来了
    delay_50us(10000); //500ms延时而已,或长或短,能看着办吗?
    Wr_Rd_PCD(0,RegCommand,PCD_IDLE);
    Wr_Rd_PCD(0,RegChannelRedundancy,0x00);   //不发送奇偶校验位
    Wr_Rd_PCD(0,RegBitFraming,0x07); //根据标准, 只发送7bit的数据
    Wr_Rd_PCD(0,RegFIFOData,PICC_REQALL); //先往FIF0写入读卡命令
    Wr_Rd_PCD(0,RegCommand,PCD_TRANSCEIVE);//命令寄存器写收发命令
    delay_50us(10000);  //500ms,延时,还是延时
    temp=Wr_Rd_PCD(1,RegFIFOLength,RDONEBYTE);//看看有多少数据
    test(temp);//串口上传一下结果,如0x03什么的
    if(temp>0){ //有数据,那就读出来吧
        for(i=0;i
            atqa= Wr_Rd_PCD(1,RegFIFOData,RDONEBYTE);
        }
        for(i=0;i
    }
}

    简单点说,给卡片发0x52,卡片返回0x04,0x00。这时,RegFIFOLength=0x03。这就是请求所有,激活卡片吧。在这一步,发7个数据位就可以了,不用奇偶校验,不要CRC校验,不用发完整个字节,不然就收不到东西了。这就是第一步了。只要天线是调谐的,通过修改这几个寄存器,就可以跟卡片打招呼了。


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


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

文章评论0条评论)

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