关于非接触式IC智能(射频)卡及其读写设备内核技术的研究与应用开发(连载6)
MCM与RF模块的接口一般有如下几个引脚来实现:
通过KOMP0与NPAUSE0可与RF0模块相连接;
通过KOMP1与NPAUSE1可与RF1模块相连接;(仅有MCM500有RF1)
通过RXKOMP与TXNPAUSE可与其他的级联MCM模块相连接;
(三) 与天线射频接口电路
有二个引脚ANT和GND接口可直接与正极性天线相联接。其间用同轴电缆。阻抗欧娒。连接长度一般应小于50CM。
MCM的外部金属屏蔽盒(仅MCM500有)必须连接到同轴电缆的外屏蔽包裹线,以使信号不能扩散,且免受外界电磁辐射信号等的影响。
如果天线工作不正常,可用“天线调谐器”来调谐,使之能将Mifare 1卡片的有效操作距离保持在10CM/2 .5CM以上。
(四) 与电源接口电路
与电源的接口包括这样几组信号:
DVDD—数字电路正电源端(+5V);
DGND--数字电路接地端(0V);
BP ---WOM缓冲器供电(通电工作时为+5V;不通电工作时为+3V );
RFVDD—RF电路正电源端(MCM500:+12V/MCM200: +5V);
RFGND-- RF电路接地端(0V);
注意,RFGND和DGND有条件的话应该分开接地,否则应接到系统的接地端,并且连接线应该具有高导电特性,且应愈短愈粗愈好。
MCM供电电源端与GND端必须跨接100NF的电容,这些电容应尽可能靠近MCM,以免引起接地环路。
整个系统应有单一电源供电,且应稳压,纹波电压小于50mv。
第三章 MCM 软件编程指令
(一)指令集
MCM能执行有限的一些指令,并将这些指令传输到MIFARE 1卡片上。
每一个指令包含7个独立的步骤,程序员在编程执行这些指令时必须小心每一个正确的(步骤)时序,这些步骤在不同的MCM指令执行中而不一样。以下是MCM通信基本指令集。
指令代码表
在与MIFARE卡片进行任何通信之前,程序员必须按照下述方法预先设置MODE寄存器:
MODE = “ 1 1 0 0 0 1 1 0 ”bin = C6 hex
注意,使用CM200(Philiphs产品)时, MODE 寄存器的设置值应为: “1100 0110b”,即C6H,但在使用SB201(UniVision Engineering Limited联视工程有限公司的产品)时, MODE 寄存器的设置值应为: “1101 0110b”,即D6H。
出错处理:
DV标志指明了MCM与MIFARE卡片之间的传输已经完成,并且主处理机可能已经从MCM中收到数据。DV标志保持“1”的持续时间,出错标志亦将保持有效。
在有效的数据被存储进FIFO寄存器时,DV标志将持续保持。在向MCM写数据时的写指令周期内,DV标志将被清除。DV标志也可能会被软复位(soft-reset)清除。
有时,为了确认有些操作的成功完成,必须使用定时溢出(TE)标志。
1 . “Answer to Request” (“Request”应答)指令
Request 指令将通知MCM在天线有效的工作范围(距离)内寻找MIFARE 1卡片。如果有MIFARE 1卡片存在,这一指令将分别与MIFARE 1进行通信,读取MIFARE 1卡片上的卡片类型号TAGTYPE(2个字节),由MCM传递给MCU,进行识别处理。
程序员可以根据TAGTYPE来区别卡片的不同类型。
对于MIFARE 1卡片来说,返回卡片的TAGTYPE(2个字节)可能为0004h。
从一个指定的卡片开始,后续的卡片可以根据TAGTYPE而被选择。当使用 “Request std“指令来寻卡时,只有那些卡片上没有被设置成“HALT_MODE ”(停机模式)的卡片将响应这一指令。
Request all指令的使用是很重要的,它可以防止MCM选择同一卡片好几次。当某一张卡片在MCM之天线的有效的工作范围(距离)内,Request all指令在成功地读取这一张卡片之后,将一直等待卡片的使用者拿走这一张卡片,直到有新一张的卡片进入MCM之天线的有效的工作范围(距离)内。当然,这里的“新一张的卡片”亦可以是刚刚拿开的那张卡片。
Request all指令是非连续性的读卡指令。只读一次。但有个例外,当某一次Request all指令读卡片失败时,例如,卡片没能通过密码认证或其他原因而出错时,Request all指令将连续地读卡,直到读卡成功才进入非连续性的读卡模式。
Request all指令适用于那些需要有人工干预的场合。
Request std指令的使用和Request all指令刚巧相反,Request std指令是连续性的读卡指令。当某一张卡片在MCM之天线的有效的工作范围(距离)内,Request std指令在成功地读取这一张卡片之后,进入MCM对卡片的其他操作。如果其他操作完成之后,程序员又将MCM进入Request std指令操作,则Request std指令将连续性地再次进行读卡操作,而不管这张卡片是否被拿走。只要有一张卡片进入MCM之天线的有效的工作范围(距离)内,Request std指令将始终连续性地再次进行读卡操作。
Request std指令是连续性的读卡指令。
Request std指令适用于那些不需要有人工干预的场合,即全自动的场合。例如,宾馆,酒店,高级写字楼等场所的门禁控制系统(Door Access Control),高速公路,停车场等的不停车收费系统(Non-Stop Road Tolling),等等。
2.“AntiCollision” 防重叠
如果有多于一张的Mifare 1卡片在MCM之天线的有效的工作范围(距离)内 ,必须使用AntiCollision指令,使MCM能够在这一叠 Mifare 1卡片中选择个别的一张卡片。
AntiCollision指令开始于一个“AntiCollision loop”(防重叠循环)。结束时,AntiCollision指令将提供给用户在这些卡片叠中选择的那张个别的卡片的一个有效的40 bit长的序列号SN(serial number)。
一般地,AntiCollision指令将有序地读所有的处在MCM之天线的有效的工作范围(距离)内的Mifare 1卡片。读完第Xi张卡片后,MCM 及MCU对这Xi张卡片进行处理,完毕之后,读 第Xi+1张卡片,然后MCM 及MCU对这Xi+1张卡片进行处理。循序渐进,直至所有的卡片。
AntiCollision指令的启动必须是在程序员完成了对STACON寄存器中的AC位的成功的设置之后。
注意:AntiCollision指令事实上并不实际地选择一张个别卡片,而仅仅是读取Mifare1卡片上的序列号SN。MCM与卡片的真正联络,选择某一张卡片,是由程序员向MCM发送“SELECT”命令来完成的。
AntiCollision指令读取的Mifare 1卡片上的一个有效的40 bit长的序列号SN(serial number)被存储在Mifare 1卡片上的第00H扇区中的第00h 块(Block)中。共5个字节。
事实上,对于程序员来说,实际有意义的SN只有前4个字节,最后一个字节只是一个SN的校验码。
程序员在控制MCM及MCU,发送AntiCollision指令,而获得SN之后,一般地应在程序中对所接收到的SN进行校验,以确保数据的正确性。具体的方法是对所接收到的SN的bit位进行异或校验,这在后面的具体程序编制中将会阐述。
对于MIFARE 1卡片来说,返回某一张卡片的有效序列号SN(4个字节)可能为:007e0a42h。
3.“Select Tag” 选择卡片操作
在一个成功的AntiCollision指令之后,或在任何时候当程序员想实际地与已知序列号的卡片进行通信时,必须使用Select指令,以建立与所选卡的通信。
为了允许在Select指令以后对卡片能进行Read/Write等指令的操作,Select指令是很重要的,必须首先被使用。被选择的卡片将给出其自己的存储器容量---已编码的一个BYTE(字节)。
Select指令成功地完成后,MCU将得到MCM之DATA寄存器传送来的一个字节长的卡片容量信息---SIZE字节。
SIZE字节被存储在Mifare 1卡片上的第00H扇区中的第00h 块(Block)中。共1个字节(8bits)。
对于MIFARE 1卡片来说,返回卡片的SIZE(个字节)可能为88h。
4.Authentication” 认证操作
在MCU将运算获得的数据,准备存储到卡片上的存储器之前,或MCU希望能读取Mifare 1卡片上的数据之前,程序员必须证明他的读/写请求操作是被允许的。
这可以通过选择秘密地存储在MCM之RAM中的密码集(KEYSET)中的一组密码来进行认证而实现。如果这一组密码匹配与Mifare 1卡片上的密码,这一次的操作被允许进行。
卡片上的存储器的每一个block(块)(128 bits ) 都分别地指定了该BlOCK(块)的存取条件。这些存取条件是根据密码A或B(它们对整个sectors (扇区)始终有效)而定。这样一来,不同的操作可能会被允许对一个sector中的4个不同blocks的每一个block进行操作。
MCM能够存储3个密码集KEYSET0,KEYSET1,KEYSET2。每一个KEYSET又包含了KEY A 及 KEYB 等,以存取最高达32Kbit内存容量的MIFARE卡片。
用户必须在KEYSTACON(0B H地址)寄存器中指定一套密码,即设置KS0, KS1。
KEYADDR寄存器(0C H地址)中的AB位用于选择KEYA(当AB=“1”时)和KEYB(当AB=“0”时)。
KEYADDR寄存器(地址0C H) 中的“AB”设置必须匹配”Authentication”命令(指令代码60和 61 hex),这是很重要的。否则,”Authentication”命令将失败。
即,在”Authentication”命令中,60h代码用于认证KEYA;61h代码用于认证KEYB。
当用60h代码时,在KEYADDR寄存器中只能设置AB=“1”,用于选择KEYA;
当用61h代码时,在KEYADDR寄存器中只能设置AB=“0”,用于选择KEYB;
当用60h代码时,在KEYADDR寄存器中不能设置AB=“0”,否则认证命令将出错;
当用61h代码时,在KEYADDR寄存器中不能设置AB=“1”,否则认证命令将出错;
KS1和KS0的设置选择与上述的认证命令的指令代码60和 61 hex的选择无关;
KS1和KS0的设置选择与上述的KEYADDR寄存器中AB的设置无关。
在MCM中,KEY-RAM(密码存储器)的实际存储器范围是:
MCM中另外还包含了KEY-ROM (密码只读存储器),用以存储一套传输密码(one set of transport keys) 和一个维护密码(one service KEY)。 传输密码对于用户想在KEY-RAM(密码存储器)中自己定义密码而编程序时,很有用。
KEY-ROM (密码只读存储器)的存储器容量为:
5.“Load KEY” 存取密码
在MCM中,每一个认证扇区(Authentication sector)中包含了一套传输密码Tkey(one transport KEY)。这些密码在制造产品时,可以编程。它们可以被传输到系统的集合器(例如,用户开发的硬件系统)中,集合器负责存取新的用户定义的密码到MCM-WOM(密码只读存储器)中。此时,可以通过“Load KEY”指令来完成任务。
对于一个单独扇区(sector)中的密码提取,则相应的传输密码必须被预先指定。
在用“Load KEY”指令来完成存取密码过程中,KEYSTCON寄存器和KEYADDR寄存器的设置与“Authentication”的操作相似。但也有些区别。这将在后面的编程中具体介绍。
6.“Read” 读指令操作
Read (读)指令允许MCU通过MCM来读取MIFARE 1卡片上完整的16 个Bytes的数据块(Data blocks)。
只有在预先“Authentication” 认证指令完成后,才允许进行对Mifare 1卡片上的某一数据扇区进行Read (读)指令操作。
Read (读)指令操作只能一个块(Block)一个块地读,即只能16个字节一次性地读取。如果只要求某Block中的几个字节的数据,也只能一个整块16个字节一起读取,由程序员选取指定的字节。
从卡片上读到的数据必须由MCU进行校验,以确保数据的有效性。
密码数据不能被读取。(待续)