SmartCardIC卡公交收费机设计(三)——MIFARE1卡读写软件设计电子与信息工程学院SmartCard课程目标非接触式IC卡读写控制MIFARE1卡读写控制功能的实现SmartCard项目开发——IC卡公交收费系统系统需求分析:1.具备小额电子钱包功能,定额方式收费2.操作方便快捷3.工作距离50cm4.具备显示余额、异常报警(非法卡或余额不足)5.可将当班收款额上传总站数据库6.公交公司可调整定额额度7.卡遗失可挂失8.抗干扰能力强SmartCard项目设计之三——软件实现读写器与M1卡交换数据的过程:1)由读写器MCU(微控制器)发送指令给MCM,2)MCM执行指令并将其转换为射频信号发送给卡;3)卡接收到来自MCM的指令后,按指令完成其内部的各种处理,并回送应答信号/数据给MCM;4)MCM接收卡回送的射频信号并将其转换为数字信号输出给MCU,读写器MCU读取MCM接收到的应答/数据,即可完成与M1卡的数据交换。SmartCardMCM基本通信指令集指令指令代码(hex)相关的出错标志接收卡片上数据AnswertoRequest(Request的应答)Requeststd26Requestall52TE,BETagtypeAntiCollision(防重叠)93TE,BESerialNumberSelectTag(选卡片)93TE,BE,PE,CESizeAuthentication(认证)Auth_1a60Auth_1b61TE,BE,PE,CE/LoadKEY(存取密码)/AERead(读)30TE,BE,PE,CEDataWrite(写)A0TE,BE/Increment(增值)C1TE,BE/Decrement(减值)C0TE,BE/Restore(重储)C2TE,BE/Transfer(传送)B0TE,BE/Halt(停机)50TE,BE/SmartCard寄存器名地址读(READ)写(WRITE)DATA00H0READ-BYTEWRITE-BYTESTACON01H1DVTEPECEBEAE----SORRFS----11NRFACENABLE02H2N/A1PRCECR--------BCNTS03H3N/ABIT-COUNT-SENDBCNTR04H4N/ABIT-COUNT-RECEIVEBAUDRATE05H5N/A--------111BRTOC06H6N/ATIMEOUT-COUNTERMODE07H7N/A11000P2P1P0P0CRCDATA08H8CRC-BYTE-READCRC-BYTE-WRITECRCSTACON09H9CV------------CZC8------------CRKEYDATA0AH10N/AKEY-BYTE-WRITEKEYSTACON0BH11----------------AL0--------KS1KS0KEYADDR0CH12N/AALABA5A4A3A2A1A00DH13RCODE0EH14N/A--------00RC1RC00FH15MCM内核特殊寄存器SmartCardMIFARE卡的读写操作步骤激活MCMMCM软复位向MCM下载密码(LOADKEY),校验传输密码正确后可向MCM的KEY-RAM写入用户自己设定的密码,以上操作与卡无关。请求应答(ANSWERTOREQUEST):寻卡防冲突(ANTICOLLISION):选择唯一一张卡选择标记(SELECT):激活所选择的卡认证(AUTHENTICATION):安全性读写操作(读、写、加值、减值):交换数据(READ/WRITE/INCREAMENT/DECREMENT)停止(HALT):置卡为停止模式,防止重复操作。SmartCardSOR/LOADKEYREQUESTANTICOLLISIONREAD/WRITE/INC/DECHALTMIFARE卡操作步骤AUTHENTICATIONSELECT卡应答:TAGTYPE(2B)卡应答:SN(4B)+校验码(1B)卡应答:SIZE(1B)卡应答:AE位SmartCard指令时序每个指令由7个基本步骤组成,必须按此时序编程才能完成该指令:(1)初始化,设置各寄存器,特别是BCNTS和BCNTR。(2)送指令码到DATA,由MCM发送指令。(3)设置TOC,MCM准备接收来自卡的应答或数据。(4)检查DV标志,查询数据接收是否完成。DV标志为”1”表明MCM与MIFARE卡片之间的传输已经完成,并且主处理机可能已经从MCM中收到数据,可以进行下一步操作。而DV=0表示数据接收尚未完成或未能接收到数据,则程序循环检测DV标志直至DV=1。有一种情况例外,既当定时器溢出时,无论接收是否完成DV都将被设置为1,同样将进行下一步操作。(5)清零TOC。(6)检查出错标志,若有标志被设置,则进行相应的出错处理,例如设置出错标志等,并返回主程序;若没有标志被设置,表示接收正确,将进行下一步操作(7)MCU从DATA读出MCM接收到的应答或数据。SmartCardAnswertoRequest(请求应答)指令Request指令将通知MCM在天线有效的工作范围(距离)内寻找MIFARE1卡。命令码:26H或52H。卡收到该指令将回送卡类型号作为卡应答:TAGTYPE(2个字节)初始化设置BCNTS=7bitsBCNTR=2Byte开始选择REQUESTALL或REQUESTSTD发送REQUEST命令设置TOC=1ms读STACONDV=1?清零TOC判断是否出错?读TAGTYPERET出错处理YNYNSmartCardWitha“requeststd”(26H)instructiononlycardswhicharenotsetintoa“HALT-mode”willrespondtothisrequest,oritmaybeexpandedtoallcardsinthefieldwitha“requestall”(52H)option.ThefirstoptionisneededtopreventtheMCMfromselectingonecardseveraltimes.Differencebetween“requeststd”&“requestall”SmartCardRequest:NOPNOPMOVA,#0CH;设置STACONMOVR0,#01HMOVX@R0,AMOVA,#0EH;设置BAUDRATEMOVR0,#05HMOVX@R0,AMOVA,#0C0H;设置ENABLEMOVR0,#02HMOVX@R0,AMOVA,#0C6H;设置MODEMOVR0,#07HMOVX@R0,AMOVA,#0CH;再次设置STACONMOVR0,#01HMOVX@R0,AMOVA,#02H;设置RCODEMOVR0,#0EHMOVX@R0,ASmartCardMOVA,#07H;设置BCNTS=7bitsMOVR0,#03HMOVX@R0,AMOVA,#10H;设置BCNTR=2BytesMOVR0,#04HMOVX@R0,AJUDGE_COMMAND:;选择REQSTD还是REQALLMOVA,R2XRLA,#01HJNZRQT_STDRQT_ALL:MOVA,#52HSJMPRQT_NEXTRQT_STD:MOVA,#26HRQT_NEXT:MOVR0,#00H;发送命令码MOVX@R0,ANOPSmartCardMOVA,#0AH;设置TOC=1msMOVR0,#06HMOVX@R0,ARQT_STACON:MOVR0,#01H;读STACONMOVXA,@R0JNBACC.7,RQT_STACON;判断DV=1?MOVR7,A;暂存STACONMOVA,#00H;清零TOCMOVR0,#06HMOVX@R0,AMOVA,R7;判断是否出错JBACC.6,RQT_TE_ERRJBACC.3,RQT_BE_ERRMOVR0,#00H;读TAGTYPEMOVXA,@R0MOV20H,AMOVR0,#00HMOVXA,@R0MOV21H,AMOVB,#00H;设置OK标志SJMPRQT_EXITSmartCardRQT_BE_ERR:;错误处理MOVB,#01HSJMPRQT_EXITRQT_TE_ERR:MOVB,#02HSJMPRQT_EXITRQT_EXIT:RETSmartCardAuthentication认证操作MCM中设有专用的密码存储器(KEY-RAM),用于存储3个密码集KEYSET0,KEYSET1,KEYSET2,每一个KEYSET又包含了各个扇区的KEYA及KEYB。Authentication操作就是将KEY-RAM中的密码与卡中对应的密码进行三次相互认证。Authentication操作的卡应答以AE位给出;AE=1,密码出错,未能通过认证;AE=0,密码正确,通过认证SmartCardAuthetication操作包括3个步骤1)设置KEYSTACON寄存器,指定Authetication操作及KEYSET(0、1或2)2)设置KEYADDR寄存器,指定Authetication操作、KEYA或KEYB、待认证的扇区号3)写“命令”(60H或61H)和写“地址”(扇区号0~15)到DATA寄存器,启动Authetication操作。SmartCardREAD/WRITE操作READ/WRITE均需整块操作。READ:发送命令码30H+块地址(0~63)接收指定块的数据(16B)通常用2次读并比较是否一致来校验是否正确读WRITE:发送命令码A0H+块地址(0~63)接收ACK/NAK应答来校验是否正确接收命令发送块数据(16B)接收ACK/NAK应答来校验是否正确写入EEPROMSmartCardValueOperate值操作MIFARE卡专门为公交/地铁等行业的定额收费系统设有值操作命令,包括INCREAMENT/DECREAMENT/TRANSFER/RESTORE对某块进行值操作的前提是该块已被初始化为“值块”(ValueBlock)并且AccessBits允许值操作。SmartCardIncrement/Decrement/TransferIncrement:addsthespecifiedvaluetothememoryvalueDecrement:subtractsthespecifiedvaluefromthememotyvalueTransfer:EachIncrementorDecrementinstructionmanipulatingastandardvalueblockhastobefollowedbyaTransferintructionwhichactuallystoresthecalculatedresultinthecardmemory.Untilthen,theresultiskeptinaninternalvaluebufferresgister.SmartCardDECREMENT:入口:块地址addr,值value存放于D_BUF出口:ACK/NAKNOPNOPMOVA,#10H;SENDBCNTS(16bits:命令码+块地址)MOVR0,#03HMOVX@R0,AMOVA,#04H;SENDBCNTR(4bits:ACK/NAK)MOVR0,#04HMOVX@R0,AMOVA,#0C0H;SENDCODEMOVR0,#00HMOVX@R0,AMOVA,#addr;SENDBLOCKADDRMOVR0,#00HMOVX@R0,ASmartCardMOVA,#0AH;SETTOC=1msMOVR0,#06HMOVX@R0,AD_wait_value:;读STACON,判断DV=1?MOVR0,#01HMOVXA,@R0JNBACC.7,D_wait_valueMOVR6,AMOVA,#00H;清零TOC