在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。
KS1KS0 = 00 KS1KS0 = 01 KS1KS0 = 10 KS1KS0 = 11 选择KEYSET0 选择KEYSET1 选择KEYSET2 选择KEYSET3 KEYADDR寄存器(0C H地址)中的AB位用于选择KEYA(当AB=“1”时)和KEYB(当AB=“0”时)。 AB = “1” AB = “0” 选择KEYA 选择KEYB 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(密码存储器)的实际存储器范围是: 3 x sector x # KEYs/sector x # bits/KEY 3 x 64 x 2 x 48 = 18,432 bits = 2,304 bytes 注意:KEY-RAM(密码存储器)中的数据不能读出芯片之外。
MCM中另外还包含了KEY-ROM (密码只读存储器),用以存储一套传输密码(one set of transport keys) 和一个维护密码(one service KEY)。 传输密码对于用户想在KEY-RAM(密码存储器)中自己定义密码而编程序时,很有用。 KEY-ROM (密码只读存储器)的存储器容量为: # sectors x # bits / KEY + # bits of service KEY 64 x 48 + 48 = 3,120 bits = 390 BYTEs 注意:KEY-ROM (密码只读存储器)是掩膜方式编程的,不能读出芯片之外。
5. “Load KEY” 存取密码
36
指 令 Load KEY(存取密码) 指令代码(hex) / 相关的出错标志 AE 接收卡片上数据 在MCM中,每一个认证扇区(Authentication sector)中包含了一套传输密码Tkey(one
transport KEY)。这些密码在制造产品时,可以编程。它们可以被传输到系统的集合器(例如,用户开发的硬件系统)中,集合器负责存取新的用户定义的密码到MCM-WOM(密码只读存储器)中。此时,可以通过“Load KEY”指令来完成任务。
对于一个单独扇区(sector)中的密码提取,则相应的传输密码必须被预先指定。 在用“Load KEY”指令来完成存取密码过程中,KEYSTCON寄存器和KEYADDR寄存器的设置与“Authentication”的操作相似。但也有些区别。这将在后面的编程中具体介绍。
6. “Read” 读指令操作 指 令 Read (读) 指令代码(hex) 30 相关的出错标志 TE, BE, PE,CE 接收卡片上数据 Data Read (读)指令允许MCU通过MCM来读取MIFARE 1卡片上完整的16 个Bytes的数据块(Data blocks)。
只有在预先“Authentication” 认证指令完成后,才允许进行对Mifare 1卡片上的某一数据扇区进行Read (读)指令操作。
Read (读)指令操作只能一个块(Block)一个块地读,即只能16个字节一次性地读取。如果只要求某Block中的几个字节的数据,也只能一个整块16个字节一起读取,由程序员选取指定的字节。 从卡片上读到的数据必须由MCU进行校验,以确保数据的有效性。
密码数据不能被读取。
7. “Write” 写指令操作 指 令 Write (写) 指令代码(hex) A0 相关的出错标志 TE, BE 接收卡片上数据 / “Write“ 写指令允许用户写数据到MIFARE卡片上(完整的16 个BYTEs的数据块(Data blocks))。只有在先“Authentication” 认证指令完成后,才允许进行对要求的数据扇区或数据块(Block)进行“Write“ 写指令操作。
为了提供最大的数据集成度,以及包含大量密码值的密码数据块的保密性,我们必须保持一个大数据结构。这样可以允许MIFARE卡片执行增值/减值(Increment/Decrement)指令。
“value block”(数据块)的数据结构: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 address address address address V A L U E V A L U E V A L U E 表 :数据块
数据块通过一个写操作,将存储的数据在每一个block块中写3次,1次反写,从而完成数据块的初始化。此外,一个地址引导位代码域必须写4次,其中2次为反向写入。正/负数据值将以标准的2的补码格式来表示。
注意:在将数据写到卡片上的某一扇区时,一定要小心。因为有些block中存储了密码数据
37
以及存储允许使能数据。特别是每一个扇区的Block3中存放了该扇区的存取条件,包含有KEYA,KEYB及该扇区的控制字。Mifare 1卡片出厂时的Block3有缺省值,为:“a0a1a2a3a4a5ff078069b0b1b2b3b4b5”,共16个Bytes。 涉及Mifare 1卡片的存储结构等信息,请参考本文的关于Mifare 1 卡片章节。 程序员在使用Mifare 1卡片做应用时,一定要清清楚楚记住每一个扇区的Block3的数据,这样也就记住了扇区的密码和存取控制字。否则,扇区的存储空间将不能被READ/WRITE等操作而失效。 任何人试图用任何方式来读写不知密码的卡片或某一扇区都是徒劳无益的。
卡片应放在安全的地方,即不要放在离MCM天线较近的地方。因为当MCM在执行某些指令时,有可能无意对这一卡片进行了读/写等操作。
8. “Increment “ & “ Decrement “ & “ Restore” 增值/减值/重储 指 令 Increment (增值) Decrement (减值) Restore (重储) 指令代码(hex) C1 C0 C2 相关的出错标志 TE, BE TE, BE TE, BE 接收卡片上数据 / / / 通过Mifare 1内部电路,MIFARE 1卡片能够执行“Increment “ & “ Decrement “增值/减值 操作,如果:
? 用合适的写指令对数据块“value block”进行了初始化;
? 根据KEY A 和KEY B ,允许进行“Increment “ & “ Decrement “增值/减值 操作; ? “Increment “ 增值 0 操作和“ Decrement “减值0 操作是不允许的; “Increment “ 增值:加指定的值到卡片的存储器中 “ Decrement “减值:从卡片的存储器中减去指定的值 “ Restore” 重储: 执行一个“Decrement 0”(减 0)指令
上述指令的计算结果将被存储在MCM的一个内部的数据缓冲寄存器中,直达以后的指令来存取。为了将结果写到卡片上,紧接着必须执行“Transfer”指令。Transfer”指令并不改变数据缓冲寄存器中的数据值。这一操作保持数据块中的数据结构,直到数据块中的值被自动地反写及校验为止。存储的地址也被正确地传送存储到数据块中。
数据块的长度为4 字节(BYTES)。
万一数据值溢出,即数据值远大于最大的正数值 或 远小于最小的负数值时,MIFARE卡片将停止操作,并返回一个NACK代码。
9. “Transfer” 传送指令 指 令 Transfer (传送) 指令代码(hex) B0 相关的出错标志 TE, BE 接收卡片上数据 / 每一个“Increment “ & “ Decrement “增值/减值 操作都必须跟随一条“Transfer” 传送指令,这样真正地将数据结果传送到卡片上去。否则,没有传送指令,数据结果仍保持在数据缓冲寄存器(value buffer register)。“Transfer” (传送) 指令的目标地址可能会相同与“Increment “ & “ Decrement “增值/减值指令时的源地址。然而,如果有了完善的后备管理软件,这样的事可能不会发生。
除了“Transfer”指令之外,其他所有的指令将改变内部数据缓冲寄存器(value buffer register)的内容。这将要求使用“Restore”指令。“Restore”指令将重建“Read“指令之后的数据缓冲寄存器(value buffer register)的内容。
如果“Transfer” (传送) 指令存取了一个新的存储器位置时,将被要求一个相同于源
38
地址的存储条件的 目标地址。
即,对于两个内存位置,要求执行“Increment “ & “ Decrement “增值/减值指令。“Transfer” (传送) 指令自动地保持正确的数据结构,包括存储数据的地址。
10. “ Halt” 停机指令 指 令 Halt (停机) 指令代码(hex) 50 相关的出错标志 TE, BE 接收卡片上数据 / “Halt” 停机指令将MIFARE 1卡片设置为“HALT MODE”。例如,卡片已经退出使用等。卡片将保持“HALT MODE”状态,直到被复位(例如:重新用于通信 等)。
第四章 MCM应用开发
在这一章节里,将向广大 读者介绍MCM的具体的应用开发。 我们选用的卡片为Mifare 1 S50系列的标准的符合 ISO/IEC 14443 TYPE A 标准的非接触式IC射频卡。选用的读写器的核心模块为MCM200(或是SB201)。 根据以上几个章节的介绍,相信读者可以理解如下的通用读写器DEMO电路的设计。
一. DEMO硬件电路的应用开发
通用读写器DEMO的硬件电路请见所附的图纸。具体说明如下:
1. DEMO电路中,对于MCU的说明:
笔者选用了市场上容易购置的美国ATMEL 公司的89C52芯片。其内建8K EEPROM,256 bytes 的RAM ,内设P0,P1,P2,P3 等四个端口,其中P0,P2为数据/地址双向的多用端口。内有3个定时器,T0,T1和T2。其振荡晶体选用11.0592MHz,以利于以后通信时的波特率的精确设计和设置。89C52中还内设8级中断控制系统,3级单向一次性可编程的密码内存,可以防止芯片内的程序被非法读写,拷贝等,保护知识产权。等等。
AT89C52 的软件指令完全兼容与MCS-51系列的MCU的标准,包括指令的寻址方式,各种数据的操作等等。
有关详细的资料,可以查阅ATMEL 公司的网页:HTTP://WWW.ATMEL.COM
2. Demo电路中,对MCM的说明:
在DEMO电路中,笔者选用了Philips公司的MCM200模块(也可用联视工程公司的SB201模块)。
将MCM的D0 ~ D7 连接到MCU的P0端口;MCM的读写线连接到MCU的-RD和-WR端上; A0 ~ A7空缺,使用ALE线,连接到MCU的第30脚上;MCM的天线端点上(ANT,-ANT等)必须对地接高频滤波电容,并串接高频电感;MCM的第9脚必须接3.6V的后备锂电池;MCM的第31脚及12脚分别接MCU的25脚和26脚,由程序员来控制MCM的启动和关闭。MCM上的模拟电路供电和数字电路的供电端必须跨接高低频滤波电容等。
3. Demo电路中,对显示电路的说明:
在DEMO电路中,笔者选用了Motorola 公司的MC14499显示模块。
39
每个MC14499模块可动态扫描4位段式LED(共阴)。DEMO电路中共使用了2个MC14499模块,以显示8位数据。
MC14499显示0 ~9数字时很直观,但是它是数字型的。由于我们经常要显示16进制的数据,因此对于A,B,C,D,E,F的显示,MC14499的显示可能不很直观,希望读者注意。
在新版本的DEMO电路中,笔者已经将显示电路改为LCD点阵式,多字行的液晶显示电路。这对于将这种低功耗的显示电路直接应用于所要求开发的应用设备中将提供很大方便。
两个MC14499模块的CLK和DATA信号将分时复用,以节省MCU有限的资源,分别接到MCU的21 和22引脚上,两个MC14499模块的--ENB信号分别接到MCU的23 和24引脚上。如果选通-ENB1,则第一个MC14499显示模块将接收数据;如果选通-ENB2,则第二个MC14499显示模块将接收数据。 4.Demo电路中,对键盘电路的说明: 在DEMO电路中,笔者选用了4 X 4方阵式样的键盘电路与MCU相连在P1端口上。 键盘电路中的4X4共16个键分别设置为0 ~ 9 十个键,一个“.”键,以及其他一些功能键及字母键。
键盘电路的扫描值通过一个LS244,送到MCU的P1的高四位,供MCU采集;MCU的P1的低四位送出键盘的扫描信号。LS244的选通(MCU采集P1的高四位时)信号和显示电路的DATA线分时复用,以节省MCU有限的资源。
本键盘电路的软件设计不同于传统,而采用了比较直接,明了,快速的“位扫描法”,这对于读者如果要求对键盘数目进行扩充,则读者在仔细阅读本文之后定能迎刃而解。
在软件设计说明章节中将详细介绍键盘扫描电路软件设计方法。
5. Demo电路中,对指示信号的说明: LED1:指示MCM的-CS信号是否被选中,LED1亮,则指示MCM已被MCU选中,可对MCM进行操作。(此时,应注意MCM的RST端指示信号LED2应亮,否则MCM不能被操作)。 LED2:指示MCM的RST信号是否被选中,LED2亮,则指示MCM以被MCU选中,可对MCM进行操作。(此时,应注意MCM的-CS端指示信号LED1应亮,否则MCM不能被操作)。 LED1 和LED2的指示应该同时有效才能使MCM工作。
LED3:整个DEMO电路的“OK”指示信号。即在每次对MCM操作成功之后,LED3将指示为亮。例如在对MCM成功地进行了SELECT命令或REQUEST命令等操作之后,LED3将指示为亮。特别地,在本文的“门禁控制系统”应用程序中,LED3将直接作为门锁的驱动信号。在实际的装置中,如果“门禁控制系统”的读写器读到某一张写有该“门禁控制系统”密码的非接触式射频卡,则LED3将指示发亮,并驱动门锁,打开大门。(读者如果已完全理解,读通“门禁控制系统”应用程序的话,完全可在程序中适当的位置加入一段小程序,连同LED3的驱动信号,而作为门锁的复合驱动信号。这样的“门禁控制系统”将更具有安全性,可靠性。)
喇叭(蜂鸣器):DEMO电路的喇叭(蜂鸣器)指示音信号,在每次对MCM操作成功之后,喇叭(蜂鸣器)将发声。例如在对MCM成功地进行了SELECT命令或REQUEST命令等操作之后,喇叭(蜂鸣器)将发声。特别地,在本文的“门禁控制系统”应用程序中,喇叭(蜂鸣器)将直接作为门锁的驱动指示音信号。配合LED3的指示信号,仅当门锁被合法地打开时,喇叭(蜂鸣器)将给出指示音信号。否则,喇叭(蜂鸣器)将不会给出指示音
40