原创 RFID阅读器(FM1702)开发过程 13.56M 苏州 非接触式

2009-1-5 11:24 7230 7 5 分类: 通信
  目前国际上非接触式IC智能射频卡中的主流技术是Philips公司的MIFARE技术.已经被制定为国际标准一IS014443 TYPEA标准。本模块采用的国产非接触卡读卡机专用芯片FM1702,正是基于此国际标准。该模块具有体积小、易于嵌入到应用系统中使用的特点。

     一、系统介绍:


    1 FM1702SL简介


    


    FM1702SL是复旦微电子股份有限公司基于IS014443标准设计的非接触卡读卡机专用芯片,该芯片采用的是0.6微米CMOS EEPROM工艺制造.可支持ISOl4443 typeA协议和MIFARE标准的加密算法。芯片内部集成了模拟调制解调电路。因而只需搭接最少量的外围电路就可以工作。FM1702SL芯片支持SPI接口,其数字电路具有TTL、CMOS两种电压工作模式。特别适用于ISO14443标准下的水、电、煤气表等计费系统的读卡器的应用。该芯片的三路电源都适用于低电压。


    


    2 非接触读写系统组成


    


    该系统主要由MCU、FM1702SL、RS232(TTL电平)通信模块、ISP在线调试接口和天线组成。系统组成框图如图1所示。用户只需简单地通过选定的UART接口发送命令就可以对卡片进行操作,MCU根据接收到的命令来控制FM1702SL,并由FM1702SL驱动天线对MiFare卡进行读写操 作。系统MCU采用STC增强型单片机STC12C4052,其可以通过ISP在线编程,且运行稳定。射频非接触式IC卡读写模块支持UART通讯接口。


    


    3 天线设计


    


    系统数据存储在无源Mifare卡中。读写模块的主要任务是将能量传输给Mifare卡。并与之建立通信。天线是非接触式IC卡读写模块的一个重要组成部分,在读写模块和非接触式IC卡通信过程中,天线用于产生能发射和接收射频信号的磁通量.而磁通量用于向卡提供电源并在读写模块和卡片之间传送信息。因此,在设计中要求天线线圈的电流最大,以用于产生最大的磁通量,并要确保有足够的带宽。读写模块的性能与天线的参数有着直接的关系。在对天线的性能进行优化之后。读写模块的读卡距离可以达到10 cm。


    


    由于FM1702SL的频率是13.56 MHz.属于短波段,因此可以采用小环天线。小环天线有方型、圆形、椭圆型、三角型等,本系统采用的是矩型天线。天线的最大几何尺寸同工作波长之间没有一个严格的界限。一般定义为:


    


    L/λ≤1/(2π)    (1)


    


    式中,L是天线的最大尺寸,λ是工作波长。对于13.6 MHz的系统来说,天线的最大尺寸在50cm左右。


    


    在天线设计中,品质因数Q是一个非常重要的参数。对于电感耦合式射频识别系统的读写器天线来说。较高的品质因数值会使天线线圈中的电流强度也较大,由此可改善对卡的传送功率。品质因数的计算公式为:


    


    27_2_0731214753.jpg


    


    式中,f0是工作频率,Lcoil是天线的尺寸,Rcoil是天线的半径。


    


    通过品质因数可以很容易地计算出天线的带宽:


    


    B=f0/Q   (3)


    


    从式中可以看出,天线的传输带宽与品质因数成反比关系。因此。过高的品质因数会导致带宽缩小,从而减弱读写器的调制边带,导致无法与卡通信。一般系统的最佳品质因数为10-30,最大不能超过60。


    


    4 硬件电路


    


    系统通过接收上位机的数据,并根据接收到的相关命令进行工作。另外。也可设定为自动寻卡方式,而无需上位机频繁发送寻卡指令,即当卡片进入到天线区后即将卡里的数据送到上位机。


    


    


    


    5 软件设计[3]


    


    读写器软件编程是采用标准C语言程序来实现对非接触式IC卡的一系列操作。主要有:STC单片机初始化、FM1702SL初始化、接收命令数据处理、IC卡读写、防冲突、密码验证以及对卡片block(数据块)操作程序等。


    


    读写卡过程是一个较复杂的程序执行过程,其软件流程图如图3所示,读写卡过程需要执行一系列的操作指令,并需调用多个C51函数。如果采用自动寻卡方式,MCU需要每隔0.5秒自动寻卡一次,如果寻到卡,则ICC置1。


    


     rurl4_b=f61ab13248a0979f528c4cc63e4ede37d7b580d12fcc5ab767babd730c7f9128097f57165dcf1210ff4229558fffb179b32e88c74314dd25c1ab28d6f491e20bd89f20e24501f6b73543d4c97a5143ac897c7c30


    


    5.1 请求操作


    


    当一张Mifare卡片处在读写模块天线的工作范围之内时.上位机通过发送命令来控制读写模块向卡片发出REQUEST all(或REQUEST std)命令。卡片的ATR将启动,并将卡片BlockO中的卡片类型(TagType)号(共2个字节)传送给读写模块。以建立卡片与读写模块的第一步通信联络。如果请求卡操作不成功,读写模块对卡片的其它操作将不会进行。


    


    5.2 防冲突操作


    


    如果有多张Mifare卡片处在卡片读写模块天线的工作范围之内时,读写模块将首先与每一张卡片进行通信。以取得每一张卡片的序列号。由于每一张Mifare卡片都有其唯一的序列号,因此读写模块可根据卡片的序列号来保证一次只对一张卡操作。该操作得到的卡的返回值即为卡的序列号。


    


    5.3 卡选择操作


    


    完成了上述二个步骤之后,读卡模块必须对卡片进行选择操作。执行操作后,返回卡上的卡片序列号(UID)。


    


    5.4 认证操作


    


    经过上述三个步骤,在确认已经选择了一张卡片时。卡片读写模块在对卡进行读写操作之前。必须对卡片上已经设置的密码进行认证,如果匹配,才允许进一步的读写操作。


    


    5.5 读写操作


    


    对卡的最后操作包括卡片初始化卡值、读卡、写卡、增值、减值、存储等。


    


    6 结束语


    


    本文主要介绍了一种基于FM1702SL的射频识别读写模块的设计方法。此模块只需要上位机通过选定的UART接口来发送命令就可以完成对卡片的操作。经实际应用证明,该读写模块具有电路稳定、易嵌入到其他模块使用、功耗低等良好性能。能方便应用于各种不同的射频识别应用系统.如考勤系统、门禁系统、公交车收费系统.以及各种水、电、气表计费系统等,有十分广阔的应用前景。


 

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

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

    接下来就去读type A的卡。如果天线调谐得很棒的话,设置一下几个寄存器就可以读到卡片的信息了。至于天线如何调谐,主要是对电容的调节,如果你的模拟电路够好的话,很简单的,就是把电容值加一点或者减一点。你也可以拎个示波器来看看波形,正弦波的波形非常好的话,就表示高次谐波的功率非常低。先找一张卡片来试试,整个简单的流程先玩一遍,如果能搜索到卡,你就成功一大半了。

    激活卡片命令,如下: 
    #define PICC_REQALL  0x52  /*寻天线区内全部卡*/ 


    这个寻卡的命令仅由7个数字位组成。

    次序如下,看以下函数,很简单的,猜都能猜出是啥意思。 

    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校验,不用发完整个字节,不然就收不到东西了。这就是第一步了。只要天线是调谐的,通过修改这几个寄存器,就可以跟卡片打招呼了。

 11f45ea7098g215.jpg

如果你想开发这种读卡器,按照上面的说的准没错。我这里提供开发板,使你开发起来事半功倍。

QQ:18720804

TEL:13776053551

淘宝:shop34893341.taobao.com
PARTNER CONTENT

文章评论0条评论)

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