4 MF RC500与AT89S52的接口电路
图4为MF RC500与AT89S52的接口电路,图5为AT89S52与RS-232接口电路。


5 对Mifare1卡的操作流程
整个系统的工作由对Mifare卡操作和系统后台处理两大部分组成。本文只介绍对Mifare卡的操作流程。Mifare卡的操作可以分为以下几项:
(1) 复位请求
当一张Mifare卡片处在卡读写器的天线工作范围之内时,程序员控制读写器向卡片发出RE-QUEST all(或REQUEST std)命令。此时卡片的ATR将启动,并将卡片Block 0中的卡片类型(TagType)号共2个字节传送给读写器,从而建立卡片与读写器的第一步通信联络。
如果不进行该位请求操作,读写器对卡片的其它操作将不能进行。
(2) 反碰撞操作
如果有多张Mifare卡片处在卡片读写器的天线工作范围之内,PCD将首先与每一张卡片进行通信,以取得每一张卡片的系列号。由于每一张Mifare卡片都具有其唯一的序列号而决不会相同,因此,PCD根据卡片的序列号来保证一次只对一张卡进行操作。该操作将使PCD得到PICC的返回值作为卡的序列号。
(3) 卡选择操作
完成了上述二个步骤之后,PCD必须对卡片进行选择操作。执行该操作后,将返回卡上的SIZE字节。
(4) 认证操作
经过前面叙述的三个步骤以后,便可以在确认已经选择了一张卡片时,在PCD对卡进行读写操作之前,使系统对该卡片上已经设置的密码进行认证。如果该认证匹配,便可允许进一步的读写操作。
(5) 读写操作
对卡的最后操作即是读、写、增值、减值、存储和传送等操作。
6 读卡程序
根据上面的流程,便可采用基于Keil C的C语言进行编程,程序如下:

RC500发送请求时,req_code是请求模式,一共有request all和Request std两种模式。Requestall指令是非连续性读卡指令,只读一次。但有一个例外,即当某一次Request all指令读卡失败时,如卡片没能通过密码认证或其它原因而出错时,Request all指令将连续地读卡,直到读卡成功才进入非连续性的读卡模式。Request std指令的使用和Request all指令刚巧相反。Request std指令是连续性的读卡指令。当某一张卡片在MCM天线的有效工作范围(距离)内时,Request std指令在成功地读取这一张卡片之后,将进入MCM对卡片的其它操作。如果其它操作完成,程序员又将MCM进入Request std指令操作,那么,Request std指令将连续地再次进行读卡操作,而不管这些片卡是否被拿走。只要有一张卡片进入MCM之天线有效工作范围(范围)内,Request std指令将始终连续地再次进行读卡操作。对于Mifare1卡,该函数反回值为0004H。其程序如下:


这是三轮认证函数,整个过程是先将所要访问的区密码加密(如区0的初始密码为6个FFH),再将加密后的密码通过Loadkey存入MF RC500的Key缓存中,接着进行认证。