最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

M1卡(S50)资料讲解

IT圈 admin 98浏览 0评论

2024年8月29日发(作者:出洁玉)

S50非接触式IC卡性能简介(M1)

一、 主要指标

 容量为8K位EEPROM

 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位

 每个扇区有独立的一组密码及访问控制

 每张卡有唯一序列号,为32位

 具有防冲突机制,支持多卡操作

 无电源,自带天线,内含加密控制逻辑和通讯逻辑电路

 数据保存期为10年,可改写10万次,读无限次

 工作温度:-20℃~50℃(湿度为90%)

 工作频率:13.56MHZ

 通信速率:106 KBPS

 读写距离:10 cm以内(与读写器有关)

二、 存储结构

将16个扇区的64个块按绝对地址编号为0~63,存贮结构如下图所示:

扇区0 块1

扇区1

块2

块3

块0

块1

块2

块3

块0

密码A 存取控制 密码B

密码A 存取控制 密码B

0

扇区15

1

2、第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。

3、每个扇区的块0、块1、块2为数据块,可用于存贮数据。

数据块可作两种应用:

★ 用作一般的数据保存,可以进行读、写操作。

1

1、M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也

数据块

数据块

数据块

控制块

数据块

数据块

数据块

控制块

0

1

2

3

4

5

6

7

数据块

数据块

60

61

62

63

2

3

数据块

密码A 存取控制 密码B 控制块

★ 用作数据值,可以进行初始化值、加值、减值、读值操作。

4、每个扇区的块3为控制块,包括了密码A、存取控制、密码B。具体结构如下:

5、每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取

控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的

存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控

制位,定义如下:

块0: C10 C20 C30

块1: C11 C21 C31

块2: C12 C22 C32

块3: C13 C23 C33

三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如

进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。三个控制

位在存取控制字节中的位置,以块0为例:

对块0的控制:

bit 7 6 5 4 3 2 1 0

字节6

字节7

字节8

字节9

C20_b

A0 A1 A2 A3 A4 A5 FF 07 80 69 B0 B1 B2 B3 B4 B5

密码A(6字节) 存取控制(4字节) 密码B(6字节)

C10_b

C30_b

C10

C30

C20

( 注: C10_b表示C10取反 )

存取控制(4字节,其中字节9为备用字节)结构如下所示:

bit 7 6 5 4 3 2 1 0

字节6

字节7

字节8

字节9

C23_b

C13

C22_b

C21_b

C20_b C13_b

C33_b

C12_b

C32_b

C11_b

C31_b

C10_b

C30_b

C12

C32

C11

C31

C10

C30

C33

C23

C22

C21

C20

( 注: _b表示取反 )

6、数据块(块0、块1、块2)的存取控制如下:

2

控制位(X=0..2)

C1X C2X C3X

访 问 条 件 (对数据块 0、1、2)

Read Write Increment Decrement, transfer,

Restore

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

0

0

0

0

1

1

1

1

KeyA|B KeyA|B KeyA|B

KeyA|B Never

KeyA|B KeyB

KeyA|B KeyB

KeyA|B Never

KeyB

KeyB

Never

KeyB

Never

Never

Never

Never

KeyB

Never

Never

Never

Never

KeyA|B

Never

Never

KeyA|B

KeyA|B

Never

Never

Never

(KeyA|B 表示密码A或密码B,Never表示任何条件下不能实现)

例如:当块0的存取控制位C10 C20 C30=1 0 0时,验证密码A或密码B正确后可读;

验证密码B正确后可写;不能进行加值、减值操作。

7、控制块块3的存取控制与数据块(块0、1、2)不同,它的存取控制如下:

C13

C23

C33 Read

密码A

Write

KeyA|B

Never

KeyB

Never

KeyA|B

KeyB

Never

Never

存取控制

Read

KeyA|B

KeyA|B

KeyA|B

KeyA|B

KeyA|B

KeyA|B

KeyA|B

KeyA|B

Write Read

密码B

Write

KeyA|B KeyA|B

KeyA|B

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

0

0

0

0

1

1

1

1

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

KeyA|B

KeyB

KeyB

Never

N

ever

KeyB

N

ever

N

ever

KeyA|B

N

ever

KeyA|B

KeyB

N

ever

N

ever

Never

N

ever

Never

例如:当块3的存取控制位C13 C23 C33=1 0 0时,表示:

密码A:不可读,验证KEYA或KEYB正确后,可写(更改)。

存取控制:验证KEYA或KEYB正确后,可读、可写。

密码B:验证KEYA或KEYB正确后,可读、可写。

三、 工作原理

卡片的电气部分只由一个天线和ASIC组成。

天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。

ASIC:卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个

8K位EEPROM组成。

工作原理:读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,

其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使

3

电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷

送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提

供工作电压,将卡内数据发射出去或接取读写器的数据。

四、 M1射频卡与读写器的通讯

复位应答

Request

防冲突机制

Anti collision Loop

选择卡片

Select Tag

改变扇区

三次相互验证

Authentication

不改变扇区

读 块 写 块 加值 减值 中止

Read Write increment decrement Halt

复位应答(

Answer to request)

M1射频卡的通讯协议和通讯波特率是定义好的,当有卡片进入读写器的操作范围时,

4

读写器以特定的协议与它通讯,从而确定该卡是否为M1射频卡,即验证卡片的卡型。

防冲突机制

(Anticollision Loop)

当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的

则处于空闲模式等待下一次选卡,该过程会返回被选卡的序列号。

选择卡片

(Select Tag)

选择被选中的卡的序列号,并同时返回卡的容量代码。

三次互相确认

(3 Pass Authentication)

选定要处理的卡片之后,读写器就确定要访问的扇区号,并对该扇区密码进行密码校验,

在三次相互认证之后就可以通过加密流进行通讯。(在选择另一扇区时,则必须进行另一扇

区密码校验。)

对数据块的操作

(Read):读一个块;

写 (

Write):写一个块;

(Increment):对数值块进行加值;

(Decrement):对数值块进行减值;

存储

(Restore):将块中的内容存到数据寄存器中;

传输

(Transfer):将数据寄存器中的内容写入块中;

中止

(Halt):将卡置于暂停工作状态;

5

关于非接触式IC智能(射频)卡

及其读写设备内核技术的研究与应用开发

上海华东磁记录电子公司 张敏

前 言

当今的信息技术又到了一个关键的十字路口。单独的PC甚至局域网的时代已为“全球

化网络”时代所代替。互联网INTERNET的产生和今天的飞速发展和广泛渗透就是典范。

IC(集成电路)智能卡正在并已经融入当今信息技术的主流。她以其高度的信息集成,

高度的安全性,正日渐其辉煌和灿烂。

随着金融行业的不断发展,社会经济的日新月异,特别是公共交通行业,无线通信领域,

卫生保健行业,封闭式场所管理,身份识别,电话通信,大楼保安系统等等,人们已愈来愈

多地开始接受和使用IC智能卡。特别是银行服务系统,IC智能卡替代古老的磁卡而服务于

大众已日渐成熟。并且“一卡通”,一卡多用,给我们的生活质量带来了很大的提高。IC智

能卡自动电表抄表系统,煤气/自来水抄表系统,公交/地铁自动售票/检票系统,移动通信手

机中IC 智能SIM卡等等,IC智能卡已愈来愈贴近我们的生活,成为我们生活的一步分。“刷

卡”已成为人们日常生活中不可或缺的一部分。

近几年来,随着IC智能卡中的接触式CPU 卡以及非接触式IC智能射频卡(内建MCU,

ASIC等)的高度安全保密性,使之在IC智能卡领域中异军突起,成为当今IC智能卡中的

流行宠物,应用前景十分广阔。

国外对IC卡的研究和应用较早,特别是在美国,欧洲国家等。IC卡遍布社会各个方方

面面。就象在美国,国民消费总额的20%~~30%是由“刷卡”消费完成的,由此可见IC智

能卡流行和使用的程度。

尽管国外对IC卡已有多年的研究,但真正在IC智能卡中特别是CPU卡类, 非接触式

IC智能射频卡(内建MCU,ASIC等)方面的研究也仅有1~~2年的成熟期。因为他们也看

到了CPU 卡,特别是非接触式IC智能射频卡(内建MCU,ASIC等)代表了整个“刷卡”

领域的发展方向,前景光明。

我国对IC卡行业的发展始于1993年左右,当时的中央领导特别是江泽民同志高度重视

IC卡行业,高瞻远瞩,指示要发展我国自己的IC卡事业,建立“金卡工程”。虽然至今也

只有短短的6年左右时间,但已取得了不小的成就。已研制成功我国自主版权的较大容量的

存储卡,逻辑加密卡等,但是对于尖端的CPU卡及非接触式IC智能射频卡(内建MCU,

ASIC等)的制卡技术及其相应的读/写卡设备技术,仍处于落后状态。这极大地制约了IC

卡行业的发展,特别是在要求有极高安全性和保密性的金融行业中,制约了我国金卡工程的

实施和发展。

6

为了加快IC卡行业的发展,特别是尖端的CPU卡及非接触式IC智能射频卡(内建

MCU,ASIC等)的推广应用,让IC卡行业及其他行业的同行尽快掌握CPU卡及非接触式

IC智能射频卡(内建MCU,ASIC等)的核心技术及其读写设备的软硬件技术及应用设计,

跟上国外的IC卡研究和应用步伐,甚至走在其前面,在上海华东计算机研究所,上海计算

机协会等领导同志的关怀下,在上海华东磁记录设备电子公司吴文总经理的直接支持下,经

过一段时间全身心投入的研发之后,笔者已基本上比较全面地掌握了PHILIPS公司的非接

触式IC智能射频卡(内建MCU,ASIC等)MIFARE 1卡(S50系列)及其卡片读写设备

核心模块MCM(Mifare Core Module)的软硬件技术。使我们发展,应用,甚至超越PHILIPS

公司的非接触式IC智能射频卡(内建MCU,ASIC等)技术及其读写设备技术成为可能。

当今世界上非接触式IC智能射频卡(内建MCU,ASIC等)中的主流主要为PHILIPS

公司的MIFARE技术,已经被制定为国际标准:ISO/IEC 14443 TYPE A标准 。欧洲一些

较大的IC卡片制造商以及IC卡片读写器制造商以及IC卡片软件设计公司等(例如法国的

GEMPLUS公司)大都以MIFARE技术为标准,而发展和推进IC卡行业。

通过阅读本文,相信有一定IC卡经验,技术及具有一定的计算机软/硬件技术(尤其是

微处理单片机MCU技术)的同行定能将本文消化之后而能设计出诸多应用场合的产品,例

如,门禁控制系统(Door Access System),高速公路不停车收费系统,停车场收费管理系统,

地铁非接触式IC智能射频卡的“刷卡”读写器,机关/企业内部考勤管理系统,医疗保险管

理系统,公共交通收费管理系统,出租车收费管理系统,银行服务“一卡通”等等。

第一章 Mifare 1 非接触式IC智能(射频)卡

一. Mifare 1非接触式IC智能射频卡特点

Mifare 1 IC智能(射频)卡的核心是Philips 公司的Mifare 1 IC S50(-01,-02,-03,-04)

系列微模块(微晶片)。它确定了卡片的特性以及卡片读写器的诸多性能。

Mifare 1 IC智能(射频)卡采用先进的芯片制造工艺制作。内建有高速的CMOS

EEPROM,MCU等。卡片上除了IC微晶片及一副高效率天线外,无任何其他元件。

卡片上无源(无任何电池),工作时的电源能量由卡片读写器天线发送无线电载波信号

耦合到卡片上天线而产生电能,一般可达2V以上,供卡片上IC工作。工作频率 13.56MHZ。

Mifare 1射频卡所具有的独特的MIFARE RF(射频)非接触式接口标准已被制定为国

际标准:ISO/IEC 14443 TYPE A 标准。

射频卡标准操作距离为100mm(由MCM500 作为读写器核心模块)和 25 mm (由

MCM200 作为读写器核心模块)。 与卡片读写器的通信速率高达106Kbit/s。

Mifare 1 IC智能(射频)卡上具有先进的数据通信加密并双向验证密码系统;且具有防重

叠功能:能在同一时间处理重叠在卡片读写器天线的有效工作距离内的多张重叠的卡片。

7

Mifare 1 IC智能(射频)卡与读写器通信使用握手式半双工通信协议;卡片上有高速的

CRC协处理器,符合CCITT标准。

卡片制造时具有唯一的卡片系列号,没有重复的相同的两张MIFARE 卡片。

卡片上内建8K(bit) EEPROM存储容量并划分为16个扇区,每个扇区划分为4个数

据存储块,每个扇区可由多种方式的密码管理。

卡片上还内建有增值/减值的专项的数学运算电路,非常适合公交/地铁等行业的检票/收

费系统。典型的检票交易时间最长不超过100ms(0.1秒)(包括卡片的认证,6个扇区的读

(768bit,2个扇区的认证),2个扇区的写操作(256bit))。

卡片上的数据读写可超过10万次以上;数据保存期可达10年以上,且卡片抗静电保护

能力达2KV以上。

二. Mifare 1非接触式IC智能射频卡功能组成

如图所示为MIFARE 1 S50非接触式IC智能射频卡的功能组成图。

MIFARE 1 S50 CARD IC

RF-Interface

射频接口电路

Digital Section

数字电路部分

波形转换

Control &

Clock

ATR

正弦=>方波

Arithm. Un

it

Data

AntiCollision

Modu./DeModu

RAM

调制/解调

ROM

Select Application

POR

Crypto Unit

(复位)

Access Control

Energy

卡片天线

整个卡片包含了两个部分,RF射频接口电路和数字电路部分。

(一). RF射频接口电路

在RF射频接口电路中,主要包括有波形转换模块。它可将卡片读写器上的13.56MHZ

的无线电调制频率接收,一方面送调制/解调模块,另一方面进行波形转换,将正弦波转换

为方波,然后对其整流滤波,由电压调节模块对电压进行进一步的处理,包括稳压等,最

终输出供给卡片上的各电路。

POR模块主要是对卡片上的各个电路进行POWER-ON-RESET(上电复位),使各电路

同步启动工作。

电压调节

Authentication &

8

(二)。 在数字电路部分模块中:

1.

ATR模块:Answer to Request(“请求之应答“)

当一张Mifare 1卡片处在卡片读写器的天线的工作范围之内时,程序员控制读写器向卡

片发出REQUEST all(或REQUEST std) 命令后,卡片的ATR将启动,将卡片Block 0 中的

卡片类型(TagType)号共2个字节传送给读写器,建立卡片与读写器的第一步通信联络。

如果不进行第一步的ATR工作,读写器对卡片的其他操作(Read/Write等)将不会进

行。

卡片的类型(TagType)号共2个字节,可能为:0004H

2.AntiCollision模块:防止(卡片)重叠功能

如果有多张Mifare 1卡片处在卡片读写器的天线的工作范围之内时,AntiCollision模块

的防重叠功能将被启动工作。在程序员控制下的卡片读写器将会首先与每一张卡片进行通

信,取得每一张卡片的系列号。由于Mifare 1卡片每一张都具有其唯一的系列号,决不会相

同,因此卡片读写器根据卡片的序列号来识别,区分已选的卡片,卡片读写器中的MCM中

的AntiCollision防重叠功能配合卡片上的防重叠功能模块,由程序员来控制读写器,根据卡

片的序列号来选定一张卡片。被选中的卡片将直接与读写器进行数据交换,未被选择的卡片

处于等待状态,随时准备与卡片读写器进行通信。

AntiCollision模块(防重叠功能)启动工作时,卡片读写器将得到卡片的序列号Serial

Number。序列号Serial Number存储在卡片的Block 0中,共有5个字节,实际有用的为4

个字节,另一个字节为序列号Serial Number的校验字节,这在以后章节中详细论述,包括

对序列号Serial Number的校验方法等。

序列号Serial Number中实际有用的4个字节,可能为:007e0a42h 。

3.

Select Application 模块:主要用于卡片的选择。

当卡片与读写器完成了上述的二个步骤,程序员控制的读写器要想对卡片进行读写操

作,必须对卡片进行“Select” 操作。以使卡片真正地被选中。

被选中的卡片将卡片上存储在Block 0中的卡片的容量“Size” 字节传送给读写器。当

读写器收到这一字节后,将明确可以对卡片进行深一步的操作了。例如,可以进行密码验证

等等。

读写器收到的“Size” 字节可能为:88h

4.

Authentication & Access Control 模块: 认证及存取控制模块

在确认了上述的三个步骤,确认已经选择了一张卡片时,程序员对卡片进行读写操作之

前,必须对卡片上已经设置的密码进行认证,如果匹配,则允许进一步的Read/Write操作。

Mifare 1 卡片上有16个扇区,每个扇区都可分别设置各自的密码,互不干涉。因此每

个扇区可独立地应用于一个应用场合。整个卡片可以设计成“一卡通”形式来应用。

三遍认证:

如图所示为三遍认证的令牌原理框图。

(A)RB

非接触式卡Mifare 1

(E) (B)TOKEN AB (C)

片读写器 卡片

(D)TOKEN BA

9

认证过程是这样进行的:

(A)环 :由Mifare 1卡片 向读写器 发送一个随机数据 RB;

(B)环 :由读写器收到RB后向Mifare 1卡片发送一个令牌数据TOKEN AB,其中包

含了读写器发出的一个随机数据 RA;

(C)环 :Mifare 1卡片收到 TOKEN AB 后,对TOKEN AB 的加密的部分进行解

密,并校验第一次由(A)环中Mifare 1卡片 发出去的随机数RB是否与

(B)环中接收到的TOKEN AB中的RB相一致;

(D)

环 : 如果(C)环校验是正确的,则Mifare 1卡片 向读写器 发送令牌TOKEN

BA给读写器 ;

(E)环 :读写器 收到令牌TOKEN BA后,读写器将对令牌TOKEN BA中的RB(随

机数)进行解密;并校验第一次由(B)环中读写器发出去的随机数RA

是否与(D)环中接收到 的TOKEN BA中的RA相一致;

如果上述的每一个环都为“真”,都能正确通过验证,则整个的认证过程将成功。读

写器将能对刚刚认证通过的卡片上的这个扇区可以进入下一步的操作(READ/WRITE 等操

作)。

卡片中的其他扇区由于有其各自的密码,因此不能对其进行进一步的操作。如想对其

他扇区进行操作,必须完成上述的认证过程。

认证过程中的任何一环出现差错,整个认证将告失败。必须从新开始。

如果事先不知卡片上的密码,则由于密码的变化可以极其复杂,因此靠猜测密码而想打

开卡片上的一个扇区的可能性几乎为零。

这里提醒一下程序员和卡片的使用者,必须牢记卡片中的16个扇区的每一个密码,否

则,遗忘某一扇区的密码,将使该扇区中的数据不能读写。没有任何办法可以挽救这种低级

错误。但是,卡片上的其他扇区可以照样使用。

上述的叙述已经可以充分地说明了Mifare 1 卡片的高度安全性,保密性,及卡片的应

用场合多样性,一卡多用(一卡通)。

5.

Control & Arithmetic Unit 控制及算术运算单元:

这一单元是整个卡片的控制中心,是卡片的“头脑”。它主要进行对整个卡片的各个单

位进行微操作控制,协调卡片的各个步骤;同时它还对各种收/发的数据进行算术运算处理,

递增/递减处理,CRC运算处理,等等。是卡片中内建的中央微处理机(MCU)单元。

6.

RAM/ROM 单元:

RAM主要配合控制及算术运算单元,将运算的结果进行暂时存储,如果某些数据需要

存储到EEPROM,则由控制及算术运算单元取出送到EEPROM存储器中;如果某些数据需

要传送给读写器,则由控制及算术运算单元取出,经过RF射频接口电路的处理,通过卡片上

的天线传送给卡片读写器。RAM中的数据在卡片失掉电源后(卡片离开读写器天线的有效工

作范围内)将被清除。

同时,ROM中还固化了卡片运行所需要的必要的程序指令,由控制及算术运算单元取

出去对每个单元进行微指令控制。使卡片能有条不紊地与卡片的读写器进行数据通信。

7.

Crypto Unit 数据加密单元:

该单元完成对数据的加密处理及密码保护。加密的算法可以为DES标准算法或其他。

8. EEPROM INTERFACE/EEPROM MEMORY EEPROM存储器及其接口电路:

该单元主要用于存储数据。EEPROM中的数据在卡片失掉电源后(卡片离开读写器天

线的有效工作范围内)仍将被保持。用户所要存储的数据被存放在该单元中。Mifare 1卡片中

的这一单元容量为8196bit(1 Kbyte)。分为16个扇区。

10

三.

Mifare 1 IC智能(射频)卡的物理组成及卡片上天线的研究

在卡片上的微晶片外面一般封装了保护层。保护层可以防止微晶片被折叠,扭曲等众多

对卡片实施非正常的物理性损坏。同时也防止微晶片受到紫外线的辐射,使卡片能长久地被

使用。

但从电性能的角度来看,由于加入了保护层,使IC与卡片上的天线组成的振荡回路的频

率将发生变化。因为,保护层给IC微晶片增加了一个输入回路电容Cmount。尽管这个电容

只有几个pf 至几十个pf,但对于要求频率精度,稳定度等都很高的非接触式IC智能射频卡

来说,也将是很重要的。

带保护层的

IC微晶片

天线线圈

Mifare 1 IC智能(射频)卡

卡片上的等效电路如下:

Rcoil La

Ccoil Cpack Cic Cmount

Lcoil

Lb

不带IC微晶片的天线 IC 微晶片

整个卡片的自由振荡频率计算方法:

F

res

=

1

2

*

3.1415926

*

( Lcoil

*

(Ccoil + Cpack +C ic + C mount ) )

1 / 2

说明:

F

r

es

:卡片的振荡频率,应为13.56MHz

11

Rcoil :天线线圈的电阻,约6.07欧娒

Lcoil :天线线圈的电感,约 3.6 μH

Ccoil :天线线圈的电容,约 5pf

Cpack :天线线圈的封装后引入的电容, 约 5pf

Cic :IC微晶片的电容,约 16pf

Cmount :IC微晶片的安装后引入的电容, 约 几个pf ~ 几十个pf

La :天线线圈与IC微晶片的接触点a

Lb :天线线圈与IC微晶片的接触点b

其中,

天线线圈的电感:

Lcoil = 2 * L [cm] * ( ln ( L [mm] / D [mm] – 1.04 ) * N

L : 天线线圈一圈的长度

N :天线线圈圈数,一般为4圈

D :天线线圈直径或导体的宽度

P :由天线线圈的技术而定的N的指数因子,如下表所示:

P值:

1.8

1.7

1.5 ~~ 1.7

天线线圈结构:

环绕线圈

Etched(蚀刻)线圈

印刷电路板线圈

p

上述天线线圈的电感的公式只能作为首次估测之用,实际的天线线圈的电感必须通

过仪器测量而定,但偏差不会很大。

一般 天线线圈的电感 : Lcoil < 4.2μH, 实际中推荐在 3.6μH 左右为最优。

天线线圈的品质因数 Qcoil :

ω2πfres

*

13.56

Qcoil =

* Lcoil

= =

一般天线线圈的品质因数 30 < Qcoil < 60。

实际中,品质因数 Qcoil在>30后的增加量, 对卡片的操作距离的增加无明显帮

助;品质因数 Qcoil必须 < 60 ,以确保数据通信稳定,可靠,否则天线的有效工作距离

内有死区,而不能可靠地进行数据通信。

天线线圈的矩形面积S

总:

S

必须 > 11200 mm

2

Rcoil Rcoil Rcoil

S

= S

平均

*

N圈

2

所以S

平均

必须 > 11200 mm/ N圈

2

一般,S

平均

>= 2778 mm(当卡片上的天线线圈的矩形面积的 长 X 宽 = 40mm

X 70 mm时)。

2

实际中,推荐S

平均

在3330 mm左右。即,实际设计时,卡片上的天线线圈的矩形

面积的长和宽应为:74mm 和45mm,天线线圈的圈数N为4圈,则这样制作出的卡

片将能保证通信的距离。

12

13

四.Mifare 1卡片的存储结构

Mifare 1卡片的存储容量为8192 BIT X 1位字长(即1K X 8位字长),采用EEPROM

作为存储介质,整个结构划分为16个扇区,编为扇区0 ~~ 15。每个扇区有4个块(Block),

分别为块0,块1,块2和块3。每个块有16个字节。一个扇区共有 16 Byte X 4 = 64 Byte。如

下图:

0

块 0(厂商标志代码)

块 1

块 2

块 3(A密码+存取控制+B密码)

1

Block 0

Block 1

Block 2

Block 3(A密码+存取控制+B密码)

15

Block 0

Block 1

Block 2

块 3(A密码+存取控制+B密码)

每个扇区的块3(即第四块) 包含了该扇区的密码A(6个字节)、存取控制(4个字节)、密

码B(6个字节),是一个特殊的块。其余三个块是一般的数据块。

但扇区0的块0是特殊的,是厂商代码,已固化,不可改写。

其中: 第0~4个字节为卡片的序列号,第5个字节为序列号的校验码;

第6个字节为卡片的容量“SIZE”字节;

第7,8个字节为卡片的类型号字节,即Tagtype字节;

其他字节由厂商另加定义。

Mifare 1 卡片的扇区0中的块0(Block 0)存储的16个字节的内容可能为:

420a7e8174h。

下面将对密码A,密码B,存取控制与数据区的关系加以说明:

存取控制的结构如下:(四个字节中的各位依次命名为)

14

位: 7 6 5 4 3 2 1 0

C2X3_b C2X2_b C2X1_b C2X0_b

C1X3_b C1X2_b C1X1_b C1X0_b

C3X3_b

C2X3

BX3

C3X2_b

C2X2

BX2

C3X1_b

C2X1

BX1

C3X0_b

C2X0

BX0

C1X3

C3X3

BX7

C1X2

C3X2

BX6

C1X1

C3X1

BX5

C1X0

C3X0

BX4

_b 表示取反,如C2X3_b 即C2X3取反;X表示扇区号;Y表示第几块;C表示控制位;

B表示备用位;

存取控制对块3的控制如下:(X=0-15)

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

0

0

0

0

1

1

1

1

密码A

never

never

never

never

never

never

never

never

密码A

Write

KEYA|B

Never

KEYB

Never

KEYA|B

KEYB

Never

Never

存取控制 存取控制 密码B

read

KEYA|B

KEYA|B

KEYA|B

KEYA|B

KEYA|B

KEYA|B

KEYA|B

KEYA|B

write

never

never

never

never

KEYA|B

KEYB

KEYB

never

read

密码B

write C1X3 C2X3 C3X3 read

KEYA|B KEYA|B

KEYA|B never

never

never

never

never

never

KEYB

never

KEYB

never

never

KEYA|B KEYA|B

KEYA|B 表示密码A或密码B;never表示没有条件实现。

对数据块的控制如下表:

(X=0-15扇区、Y=每个扇区的0-2块)

C1XY

0

0

1

1

0

0

1

1

C2XY

0

1

0

1

0

1

0

1

C3XY

0

0

0

0

1

1

1

1

Read Write Increment Decr,Transfer,restore

KEYA|B

never

never

KEYA|B

KEYA|B

never

never

never

never

never

KEYB

never

never

never

never

KEYA|B KEYA|B KEYA|B

KEYA|B never

KEYA|B KEYB

KEYA|B KEYB

KEYA|B never

KEYB

KEYB

Never

KEYB

never

never

块3的初始化值为:a0,a1,a2,a3,a4,a5,ff,07,80,69,b0,b1,b2,b3,b4,b5共16个字节,其中 KEYA

是{a0,a1,a2,a3,a4,a5},KEYB是{b0,b1,b2,b3,b4,b5},控制存取的四个字节为

{0xff,0x07,0x80,0x69}。

存取控制位表示如下(请用户去对照上表以确定初始化状态):

Ff h

位:# 7 6 5 4 3 2 1 0

07h

80h

69h

15

1

0

1

0

1

0

0

1

1

0

0

1

1

0

0

0

1

0

0

1

1

1

0

0

1

1

0

0

1

1

0

1

程序员可以根据自已应用的具体情况,对不同的扇区可选用不用的存取控制,不同的密

码,但应注意其每一位的格式,以免误用!

数据块有两种应用方法,一种是用作一般的数据保存用,直接读写。另一种用法是用作

数值块,可以进行初始化值、加值、减值、读值的运算。系统配用相应的函数完成相应的功

能。

16

MCM内核技术说明

第二章

MCM的硬件内核电路

一.

MCM200/MCM500读写模块说明

Mifare Core Module是MCM的全称,意为Mifare 核心模块。

Philips公司的MCM 主要有两种产品型号,为MCM200和MCM500。这两种智能模块

均被用于读写Mifare 1非接触式IC智能射频卡的读写器中,负责读写器中对非接触式IC智

能射频卡片的读写等功能,一般在读写器中还必须有MCU(微处理单片机)来对MCM进

行控制,及对读写器的其他方面进行控制,例如对键盘,显示,通信等部分的控制等等。

MCM200模块主要应用于对卡片操作距离在 25mm的卡片读写器中;

MCM500模块主要应用于对卡片操作距离在100mm的卡片读写器中。

Mifare所具有的独特的MIFARE RF(射频)非接触式接口标准已被制定为国际标准:

ISO/IEC 14443 TYPE A 标准。

(一)。 MCM200模块说明

A.特性:

1.标准的双列直插32引脚

2.工作频率:13.56MHZ

3.标准的+5V 电源供电,供电范围4.75V至5.25V

4.(典型)电流消耗40MA,最大不超过80MA,最小10MA左右

5.读写卡片距离可达25MM以上

6.与卡片的通信速率可达106KBps

7.模块与卡片通信时,数据加密

8.每个扇区设有3套密码及其认证和密码存储器

9.有防卡片重叠功能

10.

16个字节的FIFO(先进先出)队列接收/发送缓冲寄存器

11.

在模块与卡片通信时自动侦查错误,自动对数据流分析

12.

对RF(射频)通道自动监控

13.

内建8位/16位的CRC协处理器,提供CRC,PARITY等数据校验

14.

支持多种方式的活动天线,并且不需“天调系统”(天线调节系统)对天线

进行补偿调节

15.

标准的MIFARE并行接口与MCM500 100%全兼容

16.

MCM200 的软件与MCM500模块 100%全兼容

17.

可控制,级联MCM500模块

18.

工作温度范围在:-20 ~ +70度

B.MCM200模块引脚说明

如图所示是该模块的引脚排列示意图:

17

D7

D6

D5

D4

D3

D2

D1

D0

BP

NPAUSE1

KOMP1

NRST

DVDD

DGND

NIRQ

TP

MCM200引脚说明如下:

引脚 引脚名称 引脚类型

1 32

2 31

3 30

4 29

5 28

6 27

7 26

8 25

9 24

10 23

11 22

12 21

13 20

14 19

15 18

16 17

KPROG

NCS

NWR

NRD

A0

A1

A2

A3

ALE

USEALE

MODE

NANT

ANT

AVDD

AGND

RX

MCM200模块

将来使用类

引脚 引脚名称 引脚类型

将来使用类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

D7

D6

D5

D4

D3

D2

D1

D0

Bp

NPAUSE1

KOMP1

NRST

DVDD

DGND

NIRQ

TP

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

SUPPLY

O

I(PU)

I

SUPPLY

SUPPLY

O

O(analog)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

SUPPLY

O

I(PU)

I

SUPPLY

SUPPLY

O

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

RX

AGND

ACDD

ANT

NANT

MODE

USEALE

ALE

A3

A2

A1

A0

NRD

NWR

NCS

KPROG

I(analog)

SUPPLY

SUPPLY

O

O

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

NC

I(analog)

SUPPLY

SUPPLY

O

O

I(PU)

I(PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

SUPPLY

上述表中:I --------------- 输入引脚 O --------------- 输出引脚

SUPPLY -------电源供电输入 I/O ---------------输入/输出双向引脚

PU ---------------Internal Pull-up 内部有上拉电阻

18

ST---------------- Schmit-Trigger input 施密特触发输入

C.其他说明

MCM200是Philips 公司的产品,另外还有其他公司与之相兼容的产品。

UniVision Engineering Limited (联视工程有限公司)持有Mifare 制造专利,其生产的相

当与MCM200的产品命名为SB201。

SB201与MCM200模块在硬件上有一处不同,表现在软件上有一个MODE方式寄存器

的设置不同。SB201 的MODE 设置为0xD6H;MCM200 的设置为0xC6H(这在以后的章

节中还会论述)。除此以外,两者软/硬件100%全兼容。

法国的GEMPLUS公司向PHILIPS公司购买MCM中核心ASIC RC150或RC170芯片

制造的MCM200模块及读写器与MCM200全兼容等。

(二). MCM500模块说明

A.. 特性:

1.

工作频率:13.56MHZ

2.

标准的+12V电源供电,

3.

工作频率:13.56MHZ

4.

读写卡片距离可达100MM以上

5.

与卡片的通信速率可达106KBps

6.

模块与卡片通信时,数据加密

7.

每个扇区设有3套密码及其认证和密码存储器

8.

有防卡片重叠功能

9.

16个字节的FIFO(先进先出)队列接收/发送缓冲寄存器

10.

在模块与卡片通信时自动侦查错误,自动对数据流分析

11.

对RF(射频)通道自动监控

12.

内建8位/16位的CRC协处理器,提供CRC,PARITY等数据校验

13.

支持多种方式的活动天线,并且不需“天调系统”(天线调节系统)对

天线进行补偿调节

14.

标准的MIFARE并行接口与MCM200 100%全兼容

15.

MCM200 的软件与MCM500模块 100%全兼容

16.

可遥控,级联MCM500模块

17.

工作温度范围在:-20 ~ +70度

B.MCM500模块引脚说明

如图所示是该模块的引脚排列示意图:

次开发 15 1

。。。。。

16 2

17

18

屏 蔽 盒

31

32

19

34

48

。。。。。

33

47

如图所示是该模块的引脚排列示意图:

引脚

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

引脚名称

NPAUSE1

NWR

GATE1

NRD

MOD1

MODE

SYNC1

NCS

WKOMP1

CS

KOMP1

N.T.C.

DGND

N.T.C.

DVDD

CLOCK

RFVDD

N.T.C.

RFGND

N.T.C.

RxKOMP

引脚

类型

O

I

O/NC

I

O/NC

I

I/NC

I

I

I

I

O/NC

O

功 能 描 述

串行数据输出,驱动RF1单元,该引脚必须连到RF单元的

TxNPAUSE端。该引脚的“LOW”信号指示一个能量暂停。

写信号使能端

(未使用)

读信号使能端

(未使用)

并行协议模式,必须用“HIGH”高电平来驱动。

(未使用)

(Not Chip Select)当MCU用“LOW”低电平来驱动 该引脚时,将选中

MCM

(未使用)

(Chip Select)当MCU用“HIGH”高电平来驱动 该引脚时,将选中MCM

(Compartor input of RF1)RF1的比较器输入端,必须连到RF单元的

RXKOMP端

(未使用)

数字电路接地端

(未使用)

电源供应端+5V。内部在RxKOMP端上有上拉电阻。

(未使用)

+12V电源输入,供给RF射频单元

(未使用)

RF射频单元(模拟电路)接地端

(未使用)

RF射频单元的输出信号端。它提供与数字电平兼容的接收信

号。其对地(DGND)为集电极开路输出,并有上拉电阻2K2

接到DVDD端

(Compartor input of RF0)RF0的比较器输入端,必须连到RF单元的

RXKOMP端

22

23

24

25

KOMP0

RxWKOMP

WKOMP0

SYNC

I

O

I

O/NC

(未使用)

(未使用)

(未使用)

20

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

SYNC0

TxMOD

MOD0

RxGATE

GATE0

TxNPAUSE

NPAUSE0

A0

D0

A1

D1

A2

D2

A3

D3

ALE

D4

USEALE

D5

NIRQ

D6

BP

D7

I/NC

I/NC

O/NC

I/NC

O/NC

I

O

I

I/O

I

I/O

I

I/O

I

I/O

I

I/O

I

I/O

O

(未使用)

(未使用)

(未使用)

(未使用)

(未使用)

CMOS兼容电平输入信号至RF射频单元。该信号参考与RFGND接地端。

串行数据输出,驱动RF0单元,该引脚必须连到RF单元的

TxNPAUSE端。该引脚的“LOW”信号指示一个能量暂停。

A0 ~ A3为4位地址线

D0 ~ D7为8位双向数据总线

A0 ~ A3为4位地址线

D0 ~ D7为8位双向数据总线

A0 ~ A3为4位地址线

D0 ~ D7为8位双向数据总线

A0 ~ A3为4位地址线

D0 ~ D7为8位双向数据总线

Address Latch Enable地址锁存使能端

D0 ~ D7为8位双向数据总线

选择器:从内部地址锁存器或A0~A3引脚取地址

D0 ~ D7为8位双向数据总线

当该端为“LOW”时,通知MCU应该按评估MCM的状态寄存器内容,并存取MCM

中的数据

I/O

I/O

D0 ~ D7为8位双向数据总线

后备电池输入端,保护MCM内部密码RAM

D0 ~ D7为8位双向数据总线

上述表中:I --------------- 输入引脚 O --------------- 输出引脚

SUPPLY -------电源供电输入 I/O ---------------输入/输出双向引脚

PU ---------------Internal Pull-up 内部有上拉电阻

NC -------------- 该引脚暂时未使用

上述MCM500引脚功能说明表中,与MCM200引脚定义相一致的,同样适用与对

MCM200的引脚说明。

C.其他说明

MCM500是Philips 公司的产品,另外还有其他公司与之相兼容的产品。

UniVision Engineering Limited (联视工程有限公司)持有Mifare 制造专利,其生产的相

当与MCM200的产品命名为SB601。

SB601与MCM500模块在硬件上有一处不同,表现在软件上有一个MODE方式寄存器

的设置不同。SB601 的MODE 设置为0xD6H;MCM500 的设置为0xC6H(这在以后的章

节中还会论述)。除此以外,两者软/硬件100%全兼容。这一点与上述的MCM200模块/SB201

模块相一致。

法国的GEMPLUS公司向PHILIPS公司购买MCM中核心ASIC RC150或RC170芯片

21

制造的MCM500模块及读写器与MCM500全兼容。 等等。

二. MCM的硬件内核寄存器描述

MCU是通过对MCM 内核特殊的内存寄存器的读写来控制MCM的。这些寄存器位

于MCM中的ASIC(特殊应用IC)的内部。共有16个寄存器可存取。在对MCM进行读

/写操作时,各寄存器担负着不同的功能和作用,并且不是所有的寄存器都是可写或可读的,

即有些寄存器只能读而不能写,有些则反之。

读取MCM, 一般的 指向MIFARE 1卡请求。MCM实际上是MCU与非接触式IC

智能(射频)卡之间信息(数据)交换的”中间人”。任何读取卡片上的数据,或写进卡片上的数据`

均必须通过MCM 来传递。写MCM意味着去控制MCM,例如,送一些类型的指令给它。

以下是MCM中ASIC内核特殊寄存器一览表。

MCM—ASIC 寄存器

寄存器名

DATA

STACON

ENABLE

BCNTS

BCNTR

BAUDRATE

TOC

MODE

CRCDATA

地址

00H 0

01H 1

02H 2

03H 3

04H 4

05H 5

06H 6

07H 7

08H 8

读(READ)

READ-BYTE

DV TE PE CE BE AE --

--

写(WRITE)

WRITE-BYTE

SOR RFS -- -- 1 1 NRF

AC

N/A

N/A

N/A

N/A

N/A

N/A

CRC-BYTE-READ

CV -- -- -- -- -- -- CZ

N/A

1 PR CE CR -- -- -- --

BIT-COUNT-SEND

BIT-COUNT-RECEIVE

-- -- -- -- 1 1 1 BR

TIMEOUT-COUNTER

CRC-BYTE-WRITE

C8 -- -- -- -- -- --

CR

KEY-BYTE-WRITE

1 1 0 0 0 P2 P1 P0 P

CRCSTACON 09H 9

KEYDATA 0AH

10

0BH

11

0CH

12

0DH

KEYSTACON

KEYADDR

-- -- -- -- -- -- -- --

N/A

AL 0 -- -- -- -- KS1

KS0

AL AB A5 A4 A3 A2 A1

A0

22

13

RCODE

0EH

14

0FH

15

N/A

表1 :MCM –ASIC 寄存器

各种特殊寄存器材的具体说明如下:

1.

DATA 寄存器 地址:OOH

寄存器名

DATA

地址

00H 0

读(READ)

READ-BYTE

写(WRITE)

WRITE-BYTE

-- -- -- -- 0 0 RC1 RC0

任何传递到MIFARE 1卡的数据 或 来自MIFRAE 1卡的数据 都必须分别地 被写入

DATA寄存器 或 从DATA寄存器中 读出。

例如, MCU向卡片写数据Xi, 则Xi必须首先被写入到 DATA寄存器中, 然后在MCM

与Mifare 1 卡片进行通信, 由卡片上的ASIC将DATA寄存器中的数据读取并存放在指定

的卡片上的存储器中, 从而完成 MCU向MIFRAE 1卡片写数据的过程。 反之亦然。

DATA寄存器中有一个16 BYTE 的FIFO(先进先出)队列寄存器。 数据写到DATA

寄存器后,被存放在这个16 BYTE 的FIFO(先进先出)队列寄存器中, 等待向卡片上或

MCU传送。

如要进行传送DATA寄存器中数据, 则首先必须先设定要传输 多少位(BIT) 或多少字

节(BYTE), 即必须对BCNTS寄存器进行有效的正确设置,以确定有多少字节将要被传送。

当卡片上的数据流接收 结束或没有被接收时, STACON寄存器中的DV标志被置位”1”,

并且MCM 上的引脚NIRQ也将由”HIGH”变为”LOW”。

如果设置了DV-bit,则STACON寄存器中的error-bits (出错位)将被设置。如果没

有相关的error-bit被设置,则FIFO寄存器中的数据将被假设为正确,且可以被读出。

2. STACON 寄存器 地址:01H

SATCON 是STATUS CONTROL (状态控制)的缩写,是一个状态控制寄存器。

寄存器名

STACON

地址

01H 1

-- --

读(READ) 写(WRITE)

AC

DV TE PE CE BE AE SOR RFS -- -- 1 1 NRF

将数据写到STACON寄存器中将对MCM进行状态控制,见如下表:

Bit Name

位名

SOR

RFS

Name名称

Soft Reset

(软复位)

RF-Select

(RF选择)

23

Function功能

“0” ----表示无作用

“1”:----reset MCMA1,自动地清楚一切

“0”----RF单元0被选中激活

“1”---- RF单元1被选中激活

NRF

AC

NO RF

(无RF)

Anti Collision

(防重叠)

“0”----将活动(激活)RF单元接上

“1”----将活动(激活)RF单元关闭

“0”----无作用

“1”----启动防重叠状态机

这里,应该注意, 当写数据到STACON寄存器时(即对STACON寄存器进行设置),在

写数据到STACON寄存器的这一写周期中,RFS位的设置必须与RF单元相互一致。

另外,设置了AC位,即“AC=1”,将使防重叠状态机启动工作,执行内部存取。这一

存取在设置AC位后的12us开始,至35us结束。在这一间隙时间,不允许MCU向MCM

进行写(WRITE)数据操作。必须延迟35us。这是为了保证防重叠状态机处理软件的正确

运行,让其能识别叠放在一起的多张Mifare 1 卡片,为下一步进行选择一张指定SN(Serial

Number)的Mifare 1卡片进行数据读/写而作准备。Philips公司(或UniVision Engineering

Limited 联视工程公司)推荐至少延迟35us,然后进行写DATA,TOC寄存器等操作。

读取 STACON寄存器,将告诉我们一系列的MCM及卡片的当前状况信息。以下是读

取STACON寄存器后的一系列标志位表。

Bit Name 位名 Name名称

Data Valid

(数据有效)

Timeout Error

(溢出出错)

Parity Error

(奇/偶校验错)

CRC Error

(CRC错)

Bitcount Error

(位记数器出错)

Authentication

(认证出错)

Function功能

卡上的数据传输到FIFO寄存器中 或一个定

时记数器溢出(以在确定TE标志时,是二者

中的那一个溢出)。DV位也可以在正确的

Authentication(认证)操作完成后而被设置。

DV

TE

PE

CE

BE

一个定时记数器溢出发生。

在通讯时有奇/偶校验错

在通讯时有CRC错

在BCNTR寄存器中有大量的指定bits(位)没

有收到。

卡的认证应答码不正确或当执行一个取密码

(KEY Error Load) 操作时指定的ROM

KEY(只读存储器中密码)不正确。

AE

在上述表中,仅当DV(Data Valid数据有效)位被设置有效时(即DV=”1”) ,TE,PE,CE,

BE及AE标志才有效。但有一例外,即 当认证(Authentication)正确完成后,AE标志也

直接有效。

SOR是Software Reset(软件复位)的缩写。当执行SOR后,所有的这些标志将被清除,

且当对MCM的任何一个寄存器执行写周期时,所有的这些标志也将被清除。详见SOR后

的复位表。

当对MCM内的任何一个寄存器执行写周期时,所有的这些标志也将被清除;仅当FIFO是

空时,DV标志将被写周期清除。

有时侯MCM接收少于8 bits(例如 在接收ACK 或NACK时)时,MCM将不影响PE,

CE, 及AE标志。

在MCU与MCM, MCM与Mifare 1卡片进行数据通信时,经常会出现各种错误。例如,

卡片没能认证(Authentication) 通过, 则会使AE出错位置位,等等。

以下是在检查DV位之后,相关的

出错

情况,列为下表:

Command Name (命令名): Relevant Error Flags (相关的出错标志):

24

Answer to Request(Request应答)

Anti Collision (防重叠)

Select Card (卡片选择)

Authentication (认证)

Read Command (读命令)

Read DATA (读数据)

Write Command ( 写命令)

Write DATA (写数据)

InCR。/DeCR。/Rest。 Command

(增/减/复位 命令)

InCR。/DeCR。/Rest。 Value

(增/减/复位 值)

Halt (停机)

出 错 表

TE,BE

TE,BE

TE,BE, PE,CE

TE,BE,PE,AE

TE,BE

TE,BE,PE,CE

TE,BE

TE,BE

TE , BE

TE , BE

TE , BE

注意,送到卡片上的所有的命令和数据都提供奇/偶校验(parity) 和CRC 检查( 但

“REQUEST”命令操作除外)。这是由卡片上的ASIC负责检查。

3。 ENABLE 寄存器,地址:02H

ENABLE 寄存器的设置将影响卡片在通信时对 parity 和CRC 的校验。在ENABLE

寄存器中有针对 parity 和CRC 校验的复位允许位(reset ENABLE bits)。

寄存器名

ENABLE

地址

02H 2

读(READ)

N/A

写(WRITE)

1 PRE CEN CRE -- -- --

--

对ENABLE寄存器进行写操作,将执行对parity 和CRC块的控制。

Bit Name

位名

PR

CE

CR

Name名称

Parity reset

(Parity复位)

CRC ENABLE

(CRC 使能)

CRC Reset

(CRC 复位)

“0”-----无效

Function功能

“1”-----复位parity 块,自动清除

“0”----- 关闭CRC发生器及校验

“1”---- 打开CRC发生器及校验

“0”----- 无效

“1”----- 复位CRC 块,自动清除

在对MCM进行编程的开始时,必须对ENABLE寄存器进行写操作,即必须将CE位关

闭。仅当执行”Select”命令操作时才打开CE位:

由于MCM在电源接通时或在任何数据通信开始时,都会复位 parity 和CRC块,因

此无须额外地去执行这一操作。

4. BCNTS 寄存器,地址: 03H

寄存器名

BCNTS

地址

03H 3

读(READ)

N/A

写(WRITE)

BIT-COUNT-SEND

BCNTS是英文Bit-Counter-for-Sending的缩写,意为传送时的位计数器(寄存器)。 这里的

25

传送指的是CPU向MCM的DATA寄存器写数据。因此BCNTS寄存器实际上是一个字节发

送控制器,它控制了MCU向DATA寄存器中写进的数据字节数目。

例如,设置BCTRS=10H,则可向MCM的DATA寄存器写进的数据字节数目为2个(8位字

长的数据,因为总的bit数目=10H=16D),多余的数据,MCM将不予接收。

由于BCNTS寄存器是控制向DATA寄存器写数据的字节数目,因此这一操作必须在数据

写入DATA寄存器之前完成。使用2进制代码来操作。

在大量的字节数据被写入DATA寄存器之后,MCM自动地与卡片进行通信。写入DATA

寄存器的bits数量由BCNTS寄存器制定,保持。

5。 BCNTR寄存器, 04H

BCNTR是英文Bit-Counter-for-Receiving的缩写,意为接收时的位计数器(寄存器)。

寄存器名

BCNTR

地址

04H 4

读(READ)

N/A

写(WRITE)

BIT-COUNT-RECEIVE

与BCNTS寄存器相反, BCNTR寄存器控制了MCU读取DATA寄存器的数据字节数目

例如,设置BCNTR=20H,则可向MCM的DATA寄存器读取的数据字节数目为4个(8位字

长的数据,因为总的bit数目=20H=32D),多余的数据,MCM将不予理会。

由于BCNTR寄存器是控制向DATA寄存器读取数据的字节数目,因此这一操作必须在读

DATA寄存器之前完成。使用2进制代码来操作。

BCNTR寄存器中的值将与实际接收到的数据字节相比较,如果有差别,则STACON寄

存器中的BE标志被设置。

6。 BAUDRATE 寄存器, 地址: 05H

BAUDRATE 意为数据传输到卡片上或卡片上的数据传到MCM时通信的位速率。虽然

BAUDRATE 寄存器的后四位相关与指定的位速率,但是实际有用于MIFARE 1卡的只是最

后一位。

寄存器名

BAUDRATE

地址

05H 5

读(READ)

N/A

写(WRITE)

-- -- -- -- 1 1 1 BR

BAUDRATE 寄存器的设置将直接影响着MCM与Mifare 1卡片之间的数据通信速率。

MCM中有一个时钟发生器。写数据至BAUDRATE 寄存器,可以控制 时钟发生器(CLOCK

GENERATOR)。以下是位速率的计算公式:

t

bit

=

(BRX+2) X 8

[μs]

13.56

如果BRX = 0x0Eh则有:

t

bit

= 9.44 (us) = 1 / 105.94 kHz

上述BRX = 0x0Eh 为对BAUDRATE 寄存器进行设置的推荐值(对于MIFRARE 1卡

来说BRX(大约)值为0X0Eh,即初始化时BAUDRATE 寄存器应设置为: ”0000 1110b”=0Eh。

7。 TOC 寄存器, 地址: 06H

TOC是Time Out Counter ((定)时间溢出记数器 ) 的缩写。

26

寄存器名

TOC

地址

06H 6

读(READ)

N/A

写(WRITE)

TIMEOUT-COUNTER

对TOC 寄存器的设置即对定时时间的控制。写数据至TOC 寄存器,可以控制 定时

溢出记数器。

定时溢出的计算公式如下:

t

TO

=

10. 128

X TOC [us] = 100 x TOC

[us]

13. 56

如果用0x00 H 写给TOC,即TOC = 0x00 H ,则将关闭定时溢出记数器,即t

TO

= 0。

TOC 寄存器中的值 必须在MCM与MIFARE 1卡片通信时被设置;

TOC 寄存器常用的设置值为:0AH,即定时t

TO

= 100 X 10 us = 1 ms。

TOC 寄存器中的值 (非零值) 将在 没有通信时,永久地被递减。因此,在没有通信时,

或通信刚结束时,TOC 寄存器中的值必须被设置,即设置TOC = 0x00H. 例如: 在FIFO

中的数据有效时,就必须这样做。否则将影响STACON寄存器的TE出错标志。

如果有溢出出现,则TE标志被设置,DV标志被激活。

在完成写数据到DATA寄存器,定时溢出记数器 应该经常被初始化。但有个例外,即

在认证操作(AUTHENCATION)的开始时段,定时溢出记数器 应该在存取“KEYSTACON”

和“KEYADDR”寄存器 之后,在存取DATA寄存器之前 被初始化。

一般地在读取(Read)和保存(save)了STACON寄存器中的数据之后 定时溢出记数

器必须被关闭。

8.

MODE寄存器, 地址: 07H

MODE 意为在与卡片数据相互往来时的数据编码模式 (MODE of DATA coding)。

MODE寄存器的设置控制了MCM在与卡片数据相互通信时的数据编码模式.

MODE寄存器的每一位都与数据通信模式有关,但在使用MIFARE 1卡时,只有最后

3 位(BITS)最为关联。

寄存器名

MODE

地址

07H 7

读(READ)

N/A

写(WRITE)

1 1 0 0 0 P2 P1 P0

写数据至MODE 寄存器,可以控制 接收器和发生器。

以下是通信时的脉冲长度(pause length)(宽度)的计算公式:

pause

=

t

(13+P)/6.78

[us]

MODE 寄存器 中的P2 ,P1 ,及P0位决定了在NPAUSE0 和NPAUSE1引脚上的

各自的脉冲宽度。脉冲宽度的可变范围在 2 ~ 3 us 之间。

在使用MIFARE卡时,P2 ,P1 ,及P0位应被设置为 111 b 或110 b。

这里必须提醒读者注意的是,当我们使用CM200(Philiphs产品)时与使用

SB201(UniVision Engineering Limited联视工程有限公司的产品)时,MODE 寄存器的设置值

将不一样。

使用CM200(Philiphs产品)时, MODE 寄存器的设置值应为: “1100 0110b”,即C6H,但在

使用SB201(UniVision Engineering Limited联视工程有限公司的产品)时, MODE 寄存器的设

置值应为: “1101 0110b”,即D6H。这是两个产品唯一存在的硬件上的不兼容,导致软件的设置

值不同。 否则由于数据通信时的数据编码模式不相同,MCM将不能正常工作,不能读/写

Mifare 1卡片。在实际应用中已有此经验教训。

27

9. CRCDATA 寄存器, 地址: 08H

被计算CRC的数据必须被写入CRCDATA寄存器中。 计算后的CRC必须从

CRCDATA 寄存器中读出。

寄存器名

CRCDATA

地址

08H 8

读(READ)

CRC-BYTE-READ

写(WRITE)

CRC-BYTE-WRITE

在写入一个BYTE(字节)到CRCDATA 寄存器后,计算将开始。计算完成后,STACON

寄存器的CV标志被设置。当我们要写下一个字节到CRCDATA 寄存器之前,或在读取

CRCDATA寄存器以得到CRC之前,或在检查CZ标志之前,都必须先读取CV标志,检

查CV标志。

10.

CRCSTACON寄存器, 地址: 09H

CRCSTACON寄存器是指CRC处理器状态和控制寄存器。

寄存器名

CRCSTACON

地址

09H 9

读(READ)

CV -- -- -- -- -- --

CZ

写(WRITE)

C8 -- -- -- -- -- --

CR

写数据到CRCSTACON寄存器中,即执行对CRC-处理器的控制。

Bit Name

位名

C8

CRE

Name名称

8-bit-CRC

(8位CRC)

CRE

(CRC-复位)

Function功能

“0”---- 选择16位CRC处理器

“1” ---- 选择8 位CRC处理器

“0” ---- 无效

“1” ---- 复位CRC处理器

读取CRCSTACON寄存器后 用户将知道CRC-处理器数据传输的状态。当标志被设置

为“1”时,标志被激活。

Bit Name

位名

CR

CZ

Name名称

CRC-Ready

(CRC-准备)

CRC-Zero

(CRC-零)

Function功能

最后一个字节(BYTE)被处理完成

CRC-寄存器内容=00H,意味着CRC-校验OK

8-bit CRC寄存器值的多项式计算公式为 : X

7

+ X

5

+X

4

+X

3

+1 一般其初值 = 0xE3H

16-bit CRC寄存器值 多项式计算公式为 : X

15

+ X

10

+X

3

+1 一般其初值 = 0x31E3 H

读取16-bit CRC模式时的CRC寄存器 需要2个读周期。第一个读到的字节是16-bit

CRC中的低字节, 第二个读到的字节是16-bit CRC中的低字节。

11.

KEYDATA 寄存器, 地址: 0A H (10)

被存储在MCM中RAM的密码数据必须先被写入KEYDATA 寄存器。

寄存器名

KEYDATA

地址

0AH 10

读(READ)

N/A

写(WRITE)

KEY-BYTE-WRITE

为了能够存取MCM内部RAM中的密码,密码的存放地址必须首先在KEYSTACON

寄存器和KEYADDR寄存器两者中指定。

在做存放密码操作或做密码验证操作之前,首先必须对KEYSTACON 寄存器进行设

28

置; 在密码被准确无误地存进RAM之前,相关的传输密码(Transport KEY)Tkey必须被写入

KEYDATA-寄存器中。传输密码TKey和写入RAM中的密码都是6字节(BYTE)长,连

续被写入KEYDATA 寄存器中。但是,在“AUTHENCATION”(认证)操作时,这一寄

存器不必使用。

12. KEYSTACON – 寄存器 地址:0BH(11)

KEYSTACON 寄存器是指(密码)KEY状态和(密码)KEY控制寄存器。

寄存器名

KEYSTACON

地址

0BH 11

读(READ)

写(WRITE)

AL 0 X X X X KS1

KS0

写入 数据到KEYSTACON – 寄存器进行设置,将确定存取RAM中的密码(KEY)或传

输密码(KEY)的密码地址的一部分。

存放在MCM的RAM中的密码对程序员来说是透明的,不得而知的。因此也是不可读的。

(这里指的是密码本身及存放密码的地址不可读)。

Bit Name

位名

Name名称

Authenticate

AL (认证)

/Load Keys

Key-Set

密码集

Function功能

“0” ---- 准备提取密码

“1” ---- 准备认证

“00” ---- 选择RAM,KEY-set 0

KS1,KS0

“01” ---- 选择RAM,KEY-set 1

“10” ---- 选择RAM,KEY-set 2

“11” ---- 选择传输密码(Transport KEY)

提取密码: AL=0, 表明将要提取密码;

密码认证(Authentication): AL=1, 表明将要认证 “AUTHENTICATION” 操作。

RAM中的密码 和传输密码TKey 二者中允许被选择。

注意:KEYSTACON – 寄存器中的值必须根据所使用的“AUTHENTICATION”命令(60 hex

或61 hex指令代码)来确定。

此外,密码地址通过写数据到KEYSTACON 和KEYADDR寄存器之后而在MCM中

被确定,之后,通过写“命令”(Command)和写“地址”(address)到DATA寄存器之后,

认证密码“AUTHENTICATION” 操作便开始启动执行。

13. KEYADDR-寄存器, 地址:0C H (12)

KEYADDR寄存器将存放RAM(密码)KEY和 传输(密码)KEY各自的 密码

地址的一部分。

寄存器名

KEYADDR

地址

0CH 12

读(READ)

N/A

写(WRITE)

AL AB A5 A4 A3 A2 A1 A0

写入 数据到KEYADDR– 寄存器 将确定存取MCM的RAM中的密码(KEY)或传输

密码(KEY)的密码地址的一部分。

程序员不可能知道密码实际存放在MCM的RAM中的地址,否则密码便没有秘密可言了。

Bit Name Name名称

29

Function功能

位名

Authenticate

AL (认证)

/Load KEYs

AB

A5 … A0

KEY’A’ 或

KEY ‘B’

KEY address

“0” ---- 准备提取密码

“1” ---- 准备认证

“0” ---- 使用密码‘A’

“1” ---- 使用密码‘B’

密码地址A5至A0 指定密码的sector

提取密码: AL=0, 表明将要提取密码;

认证Authentication: AL=1, 表明将要认证 “AUTHENTICATION” 操作。

14.

RCODE –寄存器,地址:0D H (14)

RCODE –寄存器 用于代码接收。

寄存器名

RCODE

地址

0EH 14

读(READ)

N/A

写(WRITE)

X X X X 0 0 RC1 RC2

写入 数据到RCODE 寄存器对其进行设置,将使接收器的译码器参数化。

Bit Name

位名

RC1,RC0

Name名称 Function功能

KOMP引脚上用于引起中断(“HIGH”高电

平)的必不可少的(脉冲)边界数目。

Receive(接收)

RCODE –寄存器中的值一般应设置为0X02 H。 然而,在有些环境中,设置为0x03 H

时,对Mifare 1卡片的操作距离可能会稍为好(远)一点。

三. MCM硬件初始化

为了与MIFARE 1卡通信,必须对MCM各硬件寄存器进行初始化设置。

寄存器

STACON

ENABLE

BAUDRATE

MODE

RCODE

地址

1

2

5

7

13

初始化设置(16进制值)

0x0C

0x4C

0xC0

0x0E

0xC6或0xD6

0x02

一般地,应该先对MCM执行软复位(soft-reset),然后对MCM进行初始化设置,再进行

数据通信。

在任何数据通信之前必须先执行“REQUEST”命令, 以和卡片建立第一步的通信联络。

以下是MCM各硬件寄存器在上电时或在软件复位时的复位表。

MCM 复 位 表

寄存器 地址 POR硬件上电复位 SOR软复位 初始化设置

30

DATA

STACON

ENABLE

BCNTS

BCNTR

BAUDRATE

TOC

MODE

CRCDATA

CRCSTACON

KEYDATA

KEYSTACON

KEYADDR

RCODE

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

xxxx xxxx

00nn 0100

0000 nnnn

0000 0000

0000 0000

Nnnn 1111

0000 0000

0000 0000

xxxx xxxx

xxxx xxxx

xxxx xxxx

00nn nnxx

1000 0000

nnnn nnnn

Nnnn 0011

nnnn nnnn

uuuu uuuu

0unn uu00

0000 nnnn

uuuu uuuu

uuuu uuuu

Nnnn uuuu

uuuu uuuu

uuuu uuuu

xxxx xxxx

xxxx xxxx

uuuu uuuu

00nn nnuu

1uuu uuuu

nnnn nnnn

Nnnn uuuu

nnnn nnnn

0x0C/0x4C

0xC0

0x0E

0xC6/0xD6

0x02

说明:上表中的POR和SOR两列中: X :表示此位不必关注;

N :表示此位没有使用; U :表示此位不变。

四. MCM的硬件内核包括了如下几大部分接口电路:

1.

与MCU(微处理机CPU)接口电路

2.

RF模块接口电路

3.

与天线射频接口电路

4.

与电源接口电路

(一)

MCM与MCU(微处理机CPU)接口电路

MCM可以由标准的MCU接口信号来控制。这些标准的控制信号可以控制MCM的

ASIC进行工作。其间使用了标准的微控制器和微处理机通信协议。

MCM可由外部MCU发出特殊命令来启动运行。任何情况下,MCM都可以由对地址

的选择来启动工作。例如,MCM的RST引脚,-CS引脚和CS引脚的信号设置等。

对MCM内部存储器的存取,意味着将激活-CS和CS信号,以及对地址为00H~~0FH

的寄存器的合适的设置。

通过读特殊I/O地址的信息,可以得到MCM的状态信息。采用不同的MCU及其连接

方法,将会有不同的硬件信号时序及数据信息流信息等。

CS

-CS

-RD

MCU

-WR

MODE

USEALE

ALE

31

MCM

-IRQ

A(0-3)

D(0-7)

(二)

RF模块接口电路

MCM与RF模块的接口一般有如下几个引脚来实现:

通过KOMP0与NPAUSE0可与RF0模块相连接;

通过KOMP1与NPAUSE1可与RF1模块相连接;(仅有MCM500有RF1)

通过RXKOMP与TXNPAUSE可与其他的级联MCM模块相连接;

PAUSE0

KOMP0

RF0

线

模块

MCM

RF1模块(仅

RF1

MCM500有)

线

PAUSE1

模块

KOMP1

(三)

与天线射频接口电路

有二个引脚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。

32

第三章 MCM 软件编程指令

(一)

. 指令集

MCM能执行有限的一些指令,并将这些指令传输到MIFARE 1卡片上。

每一个指令包含7个独立的步骤,程序员在编程执行这些指令时必须小心每一个正确的

(步骤)时序,这些步骤在不同的MCM指令执行中而不一样。以下是MCM通信基本指令

集。

通信基本指令集

MCU《==》MCM《===》MIFARE 1卡片

指 令

Answer to Request

(Request的应答)

Request std

Request all

AntiCollision

(防重叠)

Select Tag

(选卡片)

Authentication

(认证)

Auth_1a

Auth_1b

Load KEY(存取密码)

Read (读)

Write (写)

Increment (增值)

Decrement (减值)

Restore (重储)

Transfer (传送)

Halt (停机)

指令代码(hex)

26

52

93

93

60

61

/

30

A0

C1

C0

C2

B0

50

AE

TE, BE, PE,CE

TE, BE

TE, BE

TE, BE

TE, BE

TE, BE

TE, BE

Data

/

/

/

/

/

/

TE, BE, PE,CE /

TE, BE

TE, BE, PE,CE

Serial Number

Size

TE,BE Tagtype

相关的出错标志 接收卡片上数据

指令代码表

在与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卡片之间的传输已经完成,并且主处理机可能已经从

33

MCM中收到数据。DV标志保持“1”的持续时间,出错标志亦将保持有效。

在有效的数据被存储进FIFO寄存器时,DV标志将持续保持。在向MCM写数据时的写

指令周期内,DV标志将被清除。DV标志也可能会被软复位(soft-reset)清除。

有时,为了确认有些操作的成功完成,必须使用定时溢出(TE)标志。

1 。 “Answer to Request” (“Request”应答)指令

指 令

Answer to Request

(Request的应答)

Request std

Request all

指令代码(hex)

26

52

TE,BE Tagtype

相关的出错标志 接收卡片上数据

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),等等。

8.

“AntiCollision” 防重叠

指 令

AntiCollision

(防重叠)

指令代码(hex)

93

相关的出错标志

TE, BE

接收卡片上数据

Serial Number

如果有多于一张的Mifare 1卡片在MCM之天线的有效的工作范围(距离)内 ,必须

34

使用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” 选择卡片操作

指 令

Select Tag

(选卡片)

指令代码(hex)

93

相关的出错标志

TE, BE, PE,CE

接收卡片上数据

Size

在一个成功的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” 认证操作

指 令

Authentication

(认证)

Auth_1a

Auth_1b

指令代码(hex)

60

61

35

相关的出错标志 接收卡片上数据

TE, BE, PE,CE /

在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://

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

信号。

读者如果已完全理解,读通“门禁控制系统”应用程序的话,完全可在程序中适当的位

置对LED3或喇叭(蜂鸣器)进行任意的程序设置。

电源输入保护电路:在DEMO电路中,加入了简单的电源保护电路。即在电源的输入

端加入一个反向二极管,当电源极性接反时,将输入的电源短路,而不会使DEMO电路损

坏。

6.

其他电路

通信电路:在新版本的DEMO电路中,笔者已经将RS232的通信电路连接上。以利于

用上位PC来具体地控制读写器,并能编制用户界面良好的应用软件,等等。

为了方便读者对于实际应用中不同的通信方式的要求,例如要求长线(长距离)方式(例

如RS422/485等),笔者业已设计完成相应的“全双工RS232《==》RS422/485通信(双向)

转接设备”。该转接设备非常轻巧,低功耗,成本很低,非常适合于各种不同应用类型的计

算机与应用设备之间的转接。例如大楼中的门禁系统中各读写设备与上位计算机之间的长线

方式的通信就应采用这种转接设备。其长线驱动可达1200米以上,且稳定可靠。传统的

RS232通信至多不超过20米。(注:关于“全双工RS232《==》RS422/485通信(双向)转

接设备”的介绍,笔者将会在另外文章中将做详细介绍。)

LCD显示电路:轻巧,低功耗的非接触式卡片读写器已越来越受到欢迎。因此大电流

显示的LED将被LCD显示所取代。笔者在新版本的DEMO电路中,已经将LCD应用于读

写设备中,且为图形方式点阵大屏幕显示。等等 。

二.

DEMO电路的 软件 应用开发

DEMO电路的 软件 应用开发的目标是:主要根据所设计的DEMO硬件电路而进行第

一步,最低层的面向微处理机MCU的应用程序的开发。

由于在DEMO电路中笔者选用的MCU为完全兼容与MCS-51系列微处理机的ATMEL

公司的AT89C52,因此,笔者将重点介绍MCS-51系列的面向硬件操作的最低层的汇编语

言的DEMO电路的应用程序的开发。

应用程序的开发将主要分为两大部分,即对MCM的应用程序的开发及对读写器的其他

电路的应用程序的开发。

程序开发的方式将主要建立一系列的汇编语言函数子程序以供主控程序的随时调用。即

对MCM模块或读写器的其他电路分别编制汇编语言函数子程序。

(一). 对MCM200(SB201)操作指令的程序设计和开发

对MCM指令的说明:

MCU对MCM的控制是以MCU发出MCM的指令来达到的。MCU对MCM的控制事

实上也就是对 Mifare 1 非接触式IC射频卡的控制。

MCM的指令主要有这样一些:Request std, Request all, Anticollision, Select, Load_key,

Authentication(Auth_1a,Auth_1b), Read, Write, Increment, Decrement, Restore, Transfer, Halt

等等。其中比较重要的是前8条指令,以及Halt 停机指令等。因为它们可以完成MCU对

Mifare 1 非接触式IC射频卡的很多应用场合的控制。例如 门禁控制系统(Door Access

System),高速公路不停车收费系统,停车场收费管理系统,公交/地铁非接触式IC智能射频

卡的“刷卡”读写器(收费管理系统),机关/企业内部考勤管理系统,医疗保险管理系统,

出租车收费管理系统,银行服务“一卡通”等等。

41

MCU对MCM的某一指令操作不是简单的一条指令所能完成的,必须有一个程序的序

列来完成,其中有对MCM硬件内核寄存器的设置以及汇编语言软件上的判断和设置。例如

对卡片进行读(READ)操作,则程序员必须对MCM内部的BCNTR寄存器,BCNTS寄存

器,TOC寄存器,STACON寄存器等进行设置,同时还必须对地址进行设置,对每一个状

态进行判别等等,对最终读得的数据还必须进行校验等等。就连一条最简单的停机(Halt)

指令也必须首先对MCM内部的诸多寄存器进行设置,等等。不同的指令将设置不同的MCM

内部寄存器以及应有不同的汇编语言程序序列。

1. 对MCM200(SB201)“Request std”和“ Request all”指令的汇编语言应用程序的

设计

功能:调用该汇编语言子程序,将执行MCM “Request std”或“ Request all”指令操

作,读取Mifare 1 非接触式IC射频卡的TAGTYPE字节,建立与卡片的第一步必不可少的

通信联系。

程序说明:

1. 在以下的汇编语言程序中,如果要调用该MCM指令操作,则应首先设置MCU的

R2的值: R2=”00H” 执行Request std操作;

R2=”01H” 执行Request all操作;

在该指令程序中用到了一些其他的子程序分别为:

D500US: 为500us的延时子程序;

H_SEND_TO_BUF01:

DEMO电路中,将A寄存器中的数据送显示电路中的高四位中的第0,1位,以

准备显示,地址为34H,35H;

H_SEND_TO_BUF23:

DEMO电路中,将A寄存器中的数据送显示电路中的高四位中的第2,3位,以

准备显示,地址为32H,33H;

SEND_TO_BUF01:

DEMO电路中,将A寄存器中的数据送显示电路中的低四位中的第0,1位,以

准备显示,地址为39H,3AH;

SEND_TO_BUF23:

DEMO电路中,将A寄存器中的数据送显示电路中的低四位中的第2,3位,

以准备显示,地址为37H,38H;

DISPLAY:

DEMO电路中,显示8位数据中的低4位数据值。即将存储在37H至3AH显

示内存中的低四位数据显示在LED上。

H_DISPLAY:

DEMO电路中,显示8位数据中的高4位数据值。即将存储在31H至34H显

示内存中的高四位数据显示在LED上。

等等。

2.在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,

这些可能是用于主控程序或是调试而用。特加以说明。

程序清单如下:

;======================== MCM REQUEST OPERATION ===================

request:

42

REPEAT_RQT:

_1_STACON: ;设置MCM中的STACON寄存器为 : 0CH

MOV A,#0CH ;设置A寄存器 = 0CH

MOV R0,#01H ;STACON 寄存器地址为01H

MOVX @R0,A ;将A寄存器内容送入STACON寄存器中

_2_BAUDRATE: ;设置MCM中的BAUDRATE寄存器为:0EH

MOV A,#0EH

MOV R0,#05H

MOVX @R0,A

_3_ENABLE: ;设置MCM中的ENABLE寄存器为:0C0H

MOV A,#0C0H

MOV R0,#02H

MOVX @R0,A

_4_MODE: ;设置MCM中的MODE寄存器为:0C6H

MOV A,#0D6H ;(如果采用SB201,则MODE寄存器应为:0D6H)

MOV R0,#07H

MOVX @R0,A

_5_STACON_AGAIN:

MOV A,#0CH

MOV R0,#01H

MOVX @R0,A

_6_RCODE:

MOV A,#02H

MOV R0,#0EH

MOVX @R0,A

_7_BCNTS:

MOV A,#07H

MOV R0,#03H

MOVX @R0,A

_8_BCNTR:

MOV A,#10H

MOV R0,#04H

MOVX @R0,A

;----------------------------------------------------------------

JUDG_RQT_STD_OR_ALL: ;根据R2值, 判断是执行Request std操作

MOV A,R2 ;还是Request all操作

XRL A,#01H

JNZ RQT_STD

;----------------------------------------------------------------

RQT_ALL:

MOV A,#52H

AJMP _11_RQT_MCM

RQT_STD:

MOV A,#26H

43

_11_RQT_MCM:

MOV R0,#00H

MOVX @R0,A

_12_TOC:

MOV A, #0AH

MOV R0,#06H

MOVX @R0,A ;TOC = 0AH

;----------------------------------------------------------------

RD_STACON:

MOV R0,#01H

MOVX A,@R0 ;READ STACON()

;================================================================

JUDG_DV_BIT:

JNB ACC.7,RD_STACON ; RD_STACON

;================================================================

mov r7,a ;protect A = stacon()

;================================================================

MOV A, #00H

MOV R0,#06H

MOVX @R0,A ;TOC=00H

;================================================================

mov a,r7 ;return stacon() value to A

;================= ;for "BE" and "TE" error-flag

ACALL H_SEND_TO_BUF23 ;DISPLAY R7XX ---> R7 = STACON()

;================================================================

_13_JUDG_ERR:

JB ACC.6,TE_ERR ; TE_ERR

JB ACC.3,BE_ERR ; BE_ERR

;================================================================

MOV R0,#00H ;READ_TAGTYPE_0

MOVX A,@R0

MOV 45H,A

ACALL SEND_TO_BUF01 ;SEND TAGTYPE 0 TO DISP_BUF_LOW

;----------------------------------------------------------------

mov r0,#00h

MOVX A,@R0 ;READ_TAGTYPE_1

MOV 46H,A

ACALL SEND_TO_BUF23 ;SEND TAGETYPE 1 TO DISP_BUF_HIGH

;----------------------------------------------------------------

MOV B,#00H ;"00H" is "OK" flag

;================================================================

mov a,b

44

ACALL H_SEND_TO_BUF01 ;XXBB

;================================================================

SETB P2.6 ;"OK" LAMP NOW WORKING

mov a,#00h

ACALL SPK_ON ;if "ok" then spk on

LJMP request_exit ;exit and RET

;----------------------------------------------------------------

TE_ERR: MOV B,#01 ;"TE" error flag is "01H"

MOV R6,B

LJMP RQT_EXIT

;----------------------------------------------------------------

BE_ERR: MOV R7,#0AH ;READY TO DELAY 500us

ACALL D500US ;延时500us

MOV B,#0BH ;"BE" error flag is "0BH"

; MOV A,#88H

; ACALL SEND_TO_BUF01

; ACALL SEND_TO_BUF23

;----------------------------------------------------------------

RQT_EXIT:

LJMP REPEAT_RQT

;----------------------------------------------------------------

request_exit:

RET

;==================End of MCM Request Operation =======================

2. 对MCM200(SB201)“AntiCollision”(防卡片重叠) 指令的汇编语言应用程序的

设计

功能:调用该汇编语言子程序,将执行MCM “AntiCollision”(防卡片重叠) 指令操作。

如果卡片读写器的天线之有效工作距离内有多张重叠的Mifare 1 非接触式IC射频卡,则该

指令将帮助程序员选择其中指定的一张卡片进行操作。“AntiCollision”(防卡片重叠) 指令

操作将读取卡片的系列号(SERIAL NUMBER)字节。

程序说明:

1.)在以下的汇编语言程序中,用到了一些其他的子程序(和上述的“Request std和

Request all”指令操作中的相同),分别为:

D500US: 为500us的延时子程序;

H_SEND_TO_BUF01:(同上)

H_SEND_TO_BUF23:(同上)

SEND_TO_BUF01:(同上)

SEND_TO_BUF23:(同上)

DISPLAY:(同上)

H_DISPLAY:(同上)

45

2.)在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,

这些可能是用于主控程序或是调试而用。特加以说明。等等。

3.)在本汇编语言子程序中,校验,计算卡片序列号的方法采用了相邻两个字节相互异

或,得出的结果与下一个字节再异或这样一种方法。前四个字节异或的结果与第5个字节应

该相同,即与第5个字节异或的结果应为“00H”,否则MCU读到的卡片的序列号有错。因

此对于我们来说,卡片的序列号前四个字节是有意义的,第5个字节仅仅用于校验之用。并

无实际意义。我们通常所说的序列号指的是前4个字节。并不包括第5个字节。这五个字节

被存储在卡片的第0扇区的第0块中,由卡片的生产商制定,固化,不得更改,且在世面上

流通的Mifare 1 S50系列的非接触式IC射频卡中,每一张卡片的序列号都不相同,都是唯

一的。

例如,某一张卡片的序列号为:007e0a42H,则计算异或方法如下:

00h异或7eh:(第一和第二字节异或)

0000 0000

0111 1110

---------------------------

第一次异或结果为: 0111 1110 为7eh;

将7eh与0ah相异或: 0111 1110

0000 1010

-------------------------------

第二次异或结果为: 0111 0100 为74h;

将74h与42h相异或: 0111 0100

0100 0010

-------------------------------

第三次异或结果为: 0011 0110 为36h;

这样前四个字节得到的异或结果为36H,如果读到的卡片上的序列号的第5个字节为

36H,则证明此次得到的卡片的序列号是有效的。如果读到的卡片上的序列号的第5个字节

不为36H,则证明此次得到的卡片的序列号是无效的。

第四次异或为: 将第三次异或结果36h与第5个字节相异或,如果第5个字节读到的值

为36H,则:

将36h与36h相异或: 0011 0110

0011 0110

-------------------------------

第四次异或结果为: 0000 0000 为00h

这样四次异或结果为00H,表明MCU读取的卡片序列号是有效的。具体的程序如下,

请读者仔细分析,定能理解上述关于卡片序列号的校验方法。

程序清单如下:

;======================== MCM ANTICOLLISION OPERTION ====================

anticollision:

ANTI_REPEAT:

MOV A, #10H

MOV R0,#03H

MOVX @R0,A ;BCNTS = 10H

MOV A, #0CH

46

SETB ACC.0 ;AC = "1"

MOV R0,#01H

MOVX @R0,A

MOV R7,#02H ;DELAY 1000US

ACALL D500US

MOV A, #93H

MOV R0,#00H

MOVX @R0,A ;DATA = 93H (ANTICOLLISION OPERATION CODE)

MOV A, #20H

MOV R0,#00H

MOVX @R0,A ;DATA = 20H

MOV A, #28H

MOV R0,#04H

MOVX @R0,A ;BCNTR = 28H

MOV A, #0AH

MOV R0,#06H

MOVX @R0,A ;TOC = 0AH

ANTI_RD_STACON:

MOV R0,#01H

MOVX A,@R0 ;READ: STACON ==> A

JNB ACC.7,ANTI_RD_STACON ;IF DV = "1"? NO,IT WILL READ AGAIN

;--------------------- NOW DV="1", JUDG OTHER FLAGS---------------------

MOV A, #00H

MOV R0,#06H

MOVX @R0,A ;TOC = 00H

JB ACC.6, ANTI_TE_ERR ;TE ERR

JB ACC.3, ANTI_BE_ERR ;BE ERR

;----------------NOW NO ERRORS OCCUR,CAN READ SNR ----------------

MOV R7,#04H ;R7 IS A COUNTER,FOR READING 4-BYTE SERIAL NUMBER

MOV B,#00H

MOV R1,#40H

MOV R0,#00H

ANTI_LOOP:

MOVX A,@R0

MOV @R1,A ;STORE SNR(1)--(4) IN 40H,41H,42H,43H

XRL B,A ;CACULATE

INC R1

DJNZ R7,ANTI_LOOP

MOVX A,@R0 ;READ 5th CHK_SUM_VALUE

XRL A,B ;CACULATE

JNZ ANTI_CHK_ERR_EXIT ;If "Z"="0"? If Not,CHK_SUM_VALUE ERROR

;------------------------- NOW THE SNR IS VALID ----------------------------

_OK:

;MOV B,#00H ;IF SNR "OK",THEN (B) = 00H <----RETURN_VALUE

47

MOV R1,#40H ;(40H) ==> SNR(1)

MOV A,@R1

ACALL SEND_TO_BUF01 ;SEND SNR(1) TO DISP_BUF_LOW

INC R1 ;(41H) ==> SNR(2)

MOV A,@R1

ACALL SEND_TO_BUF23 ;SEND SNR(2) TO DISP_BUF_HIGH

INC R1 ;(42H) ==> SNR(3)

MOV A,@R1

ACALL H_SEND_TO_BUF01 ;SEND SNR(3) TO H_DISP_BUF_LOW

INC R1 ;(43H) ==> SNR(4)

MOV A,@R1

ACALL H_SEND_TO_BUF23 ;SEND SNR(4) TO H_DISP_BUF_HIGH

SETB P2.6 ;"OK" LAMP NOW WORKING P2.3

ACALL SPK_ON ;if "ok" then spk on

MOV B,#00H ;IF SNR "OK",THEN (B) = 00H <----RETURN_VALUE

AJMP ANTI_OK_EXIT

;----------------------ERROR PROCESS-------------------------------

ANTI_TE_ERR:

MOV B,#01H ;IF "TE_ERR", THEN (B) = 01H

AJMP ANTI_ERR_EXIT

ANTI_BE_ERR:

MOV B,#0AH ;IF "BE_ERR", THEN (B) = 01H

AJMP ANTI_ERR_EXIT

;------------------------------ exit process -----------------------------

ANTI_CHK_ERR_EXIT:

MOV B,#08H

MOV A,B

;ACALL H_SEND_TO_BUF23 ;SEND RETURN_ERR_VALUE TO DISP_BUF_HIGH

ANTI_ERR_EXIT:

ANTI_OK_EXIT:

RET

;-------------------- End of MCM AntiCollision Operation -----------------

3.对MCM200(SB201)“Select”(选卡片) 指令的汇编语言应用程序的设计

功能:调用该汇编语言子程序,将执行MCM “Select”(选卡片) 指令操作。如果卡片

读写器的天线之有效工作距离内有多张重叠的Mifare 1 非接触式IC射频卡,则该指令在程

序员成功完成“AntiCollision”操作之后,将帮助程序员正式选择其中指定的一张卡片进行

操作(包括密码存取,密码认证,卡片上指定扇区的读写,等等。)“Select”(选卡片) 指令

操作将读取卡片的SIZE字节。

程序说明:

1.)在以下的汇编语言程序中,用到了一些其他的子程序(和上述的“Request std和

48

Request all”指令操作中的相同),分别为:

D500US: (与上述功能相同);

H_SEND_TO_BUF01:(与上述功能相同);

H_SEND_TO_BUF23:(与上述功能相同);

SEND_TO_BUF01:(与上述功能相同);

SEND_TO_BUF23:(与上述功能相同);

DISPLAY:(与上述功能相同);

H_DISPLAY:(与上述功能相同);

等等。

2.)在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,

这些可能是用于主控程序或是调试而用。特加以说明。

程序清单如下:

;====================MCM SELECT OPERATION=====================

select:

;SETB PSW.3

;SETB PSW.4

MOV A,#0CH

MOV R0,#01H

MOVX @R0,A ;STACON() = 0CH

MOV A,#0F0H

MOV R0,#02H

MOVX @R0,A ;ENABLE() = F0H

MOV A,#38H

MOV R0,#03H

MOVX @R0,A ;BCNTS() = 38H =56 D

MOV A,#08H

MOV R0,#04H

MOVX @R0,A ;BCNTR() = 08H <--RECEIVE ONE BYTE:"SIZE"BYTE

MOV A,#93H

MOV R0,#00H

MOVX @R0,A ;DATA() = 93H -->"SELECT" INSTRACTION CODE

MOV A,#70H

MOV R0,#00H

MOVX @R0,A ;IMPORTANT: DATA()=70H--BITCOUNT=70Hbits

;-----------------------------------------------------------------------

MOV R7,#04H ;R7 IS A COUNTER,FOR WRITING 04H BYTES TO DATA

MOV B,#00H

MOV R0,#00H

MOV R1,#40H ;THE FIRST ADDRESS OF SNR. 40H---43H

SELECT_WRT_LOOP:

MOV A,@R1

49

MOVX @R0,A

XRL B,A

INC R1

DJNZ R7, SELECT_WRT_LOOP

MOV A,B

MOVX @R0,A ;SEND THE 5th CHK_SUM_VALUE

MOV A,#0AH

MOV R0,#06H

MOVX @R0,A ;TOC() = 0AH

SEL_RD_STACON_AGAIN:

MOV R0,#01H

MOVX A,@R0 ;READ STACON() ==> A

MOV B,A

JNB ACC.7, SEL_RD_STACON_AGAIN ;IF "DV"="1"? IF NOT,REPEAT READ

MOV B,A

;------------- NOW DV="1", DATA VALID ----------------------

MOV A,#00H

MOV R0,#06H

MOVX @R0,A ;TOC() = 00H

;------------- NOW JUDGE ANY DATA ERRORS --------------------

MOV A,B

JB ACC.6, SEL_TE_ERR ;TE ERR

JB ACC.5, SEL_PE_ERR ;PE ERR

JB ACC.3, SEL_BE_ERR ;BE ERR

JB ACC.4, SEL_CE_ERR ;CE ERR

;------------- NOW NO ERRORS,READING CARD SIZE -----------------

MOV R0,#00H

MOVX A, @R0 ;READ SIZE: DATA() ==> A

MOV 44H,A ;STORE "SIZE" IN 44H

ACALL SEND_TO_BUF01 ;SEND "SIZE" TO DISP_BUF_LOW

SETB P2.6 ;"OK" LAMP NOW WORKING P2.3

ACALL SPK_ON ;if "ok" then spk on

MOV B,#00H ;SELECT OPERATION'S "OK" RETURN_VALUE=00H

MOV A,B ;READY FOR DISSPLAY IN DISP_BUF_HIGH(23)

LJMP SEL_OK_EXIT ;IF "OK", EXIT SELECT OPERATION

;-------------------ERRORS PROCESS-------------------------------

SEL_TE_ERR:

MOV B,#01H

LJMP SEL_ERR_EXIT

SEL_PE_ERR:

MOV B,#05H

LJMP SEL_ERR_EXIT

SEL_CE_ERR:

50

MOV B,#02H

LJMP SEL_ERR_EXIT

SEL_BE_ERR:

MOV R7,#0AH

ACALL D500US

MOV B,#0BH

LJMP SEL_ERR_EXIT

;----------------------EXIT------------------------

SEL_ERR_EXIT:

MOV A,B

SEL_OK_EXIT:

ACALL SEND_TO_BUF23 ;SEND ERR_RETURN_VALE TO DISP_BUF_HIGH

RET

;------------------------ End of MCM AntiCollision Operation -----------------

通过以上对MCM的几个指令的软件设计,读者应该能有较大的信心,将MCM其他的

一些指令也能设计成功。以供主控程序随时调用。

51

(二). 对MCM200(SB201)组成的DEMO电路的主控应用程序设计和开发

1.硬件电路请参照所附的DEMO电路图纸

2.软件清单如下

程序清单如下:

;====================================================================

; WRITTEN BY ROCKY, OCT'1999

;====================================================================

ORG 0000H

start:

LJMP MAIN

NOP

NOP

;--------------------------

;ORG 001BH

;LJMP 0500H

;--------------------------

ORG 0080H

MAIN:

MOV SP,#0E1H

NOP

CLR EA ;CLOSE CPU INT

CLR P2.5 ;RESET MCM (-RST="0")

SETB P2.4 ;RESET MCM (-CS ="1")

NOP

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

NOP

CLR P2.6 ;CLOSE "OK" LAMP

setb p2.0 ;disenable KB function

mov p1,#11110000b ;init P1 port:P1.0~~P1.3-->out (line)

; P1.4~~P1.7-->in (colum)

SETB P2.5 ;RESET MCM (-RST="1")

CLR P2.4 ;SELECT MCM (-CS="0")

ACALL D500MS

MOV A,#80H ;SOFTWARE_RESET MCM

MOV R0,#01H

MOVX @R0,A

ACALL D500MS

ACALL SPK_ON ;SPEAK ON

;MOV 21H,#01H ;THE kb_TEST_CHAR

52

KB_LOOKING:

LCALL KB_SCAN

ACALL DISPLAY

ACALL H_DISPLAY

CLR P2.6 ;CLOSE "OK" LAMP P2.3

AJMP KB_LOOKING

KB_ALL_EXIT:

MOV R2,#00H ;SET RQT_STD

SETB P2.5 ;RESET: MCM ON (-RST="1") P1.4

CLR P2.4 ;SELECT MCM ON (-CS="0") P1.5

;------------------------------------

REPEAT:

SETB P2.5 ;RESET: MCM ON (-RST="1")P1.4

CLR P2.4 ;SELECT MCM ON (-CS="0") P1.5

;==================================================

ACALL REQUEST ;MCM REQUEST OPERATION

;==================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500MS

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;=========================================================

ACALL ANTICOLLISION ;MCM ANTICOLLISION OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500MS

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;=========================================================

ACALL SELECT ;MCM SELECT OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500MS

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

53

;+++++++++++++++++++++ set up register/ram for load_key()++++++++++++++++++

mov 7FH,#0ABH

MOV 7EH, #00H ;(7EH) = 00H-->SELECT KEYSET0 (KS1=0;KS0=0)

MOV 7DH,#02H ;(7DH): 1)SELECT KEYA or KEYB

; 2)SELECT sector_ADDRESS :0-15

MOV 7CH,#60H ;(7CH) = 47H-->TKey(1) FIRST ADDRESS

;=========================================================

ACALL LOAD_KEY ;MCM LOAD_KEY OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL d500ms

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;++++++++++++++++++ set up register/ram for Authenticate() ++++++++++++++++++

;mov 7fh,#04h

;7EH:for future use!

MOV 7EH, #80H ;(7EH) = 80H-->SELECT KEYSET0 (KS1=0;KS0=0)

MOV 7DH,#82H ;(7DH): 1)SELECT KEYA or KEYB (for auth_)

; 2)SELECT sector ADDRESS :0-15 (for auth_)

MOV 7CH,#60H ;Select: Auth_ instruction code

;=========================================================

ACALL AUTHENTICATION ;MCM AUTHENTICATE OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500MS

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;++++++++++++++++++ set up register/ram for Write() ++++++++++++++++++

; MOV 7EH, #00H ;(7EH):The first_address(MSB) storing the data which

;7EH:for future use!; you want to write the data to the MCM/CARD

; MOV 7DH,#50h ;(7DH): The first_address(LSB) storing the data which

; you want to write the data to the MCM/CARD

; MOV 7CH,#0BH ;Select: written address(block no.):0~~63

; LCALL WRITE_KEY_A

;=========================================================

; ACALL write ;MCM write OPERATION

54

;=========================================================

; ACALL DISPLAY

; ACALL H_DISPLAY

; ACALL D500MS

; CLR P2.6 ;CLEAR "OK"LAMP P2.3

; ACALL INIT_DISP_BUF

; ACALL DISPLAY

; ACALL H_DISPLAY

;++++++++++++++++++ set up register/ram for Read() ++++++++++++++++++

;MOV 7EH, #00H ;(7EH):The first address(HIGH_byte) which you want to

;7EH:for future use! ;read the data from the MCM/CARD into cpu_ram

MOV 7DH,#50h ;(7DH):The first address(LOW_byte) which you want to

; read the data from the MCM/CARD into cpu_ram

MOV 7CH,#08h ;Select:The address(block no.) you want to read:0-63

;==========================================================

LCALL READ ;MCM READ OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500ms

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;==========================================================

LCALL HALT ;MCM HALT OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500MS

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;==========================================================

LCALL DISP_RD_BLK ;DISPLAY JUST READ BLOCK VALUES

;=========================================================

LCALL CLEAR_DISP_RD_BLK_IN_CPU ;CLEAR :FILL WITH #11H

;=========================================================

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;CLR P2.5 ;RESET MCM (-RST="0") P1.4

55

;SETB P2.4 ;RESET MCM (-CS="1") P1.5

MOV A,#80H ;SOFTWARE_RESET MCM

MOV R0,#01H

MOVX @R0,A

;LJMP REPEAT

RET

;----------------------------------------------------

56

D500US:

D500US_LOOP1:

MOV R6,#05H

D500US_LOOP2:

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

DJNZ R6,D500US_LOOP2

DJNZ R7,D500US_LOOP1

RET

;----------------------------------------------------

D500MS:

setb psw.3

setb psw.4

MOV R3,#19H

LOOP_1: MOV R4,#32H

LOOP_2: MOV R5,#64H

LOOP_3: DJNZ R5,LOOP_3

DJNZ R4,LOOP_2

DJNZ R3,LOOP_1

clr psw.3

clr psw.4

RET

;--------------------------

D2S:

setb psw.3

setb psw.4

MOV R6,#06H

LOOP: ACALL D500MS

DJNZ R6,LOOP

clr psw.3

clr psw.4

RET

;--------------------------

SPK_ON:

setb psw.3

setb psw.4

CLR P2.7

ACALL D500MS

57

SETB P2.7

clr psw.3

clr psw.4

RET

;--------------------------

DISPLAY:

SETB PSW.3

SETB PSW.4

CLR P2.2 ;SELECT MC14499'S "-ENB"

MOV R0,#36H ;DISPLAY BUF FIRST ADDRESS

MOV R1,#05H ;R1 AS A COUNTER

NEXT_CHAR: MOV A , @R0

SWAP A

ACALL DISP_ONE

INC R0

DJNZ R1,NEXT_CHAR

SETB P2.2 ;RELEASE MC14499'S "-ENB"

CLR PSW.3

CLR PSW.4

RET

;--------------------------

DISP_ONE:

MOV R2,#04H

NEXT_BIT:SETB P2.1 ;SELECT MC14499'S "CLK"=1

RLC A ;ONE BIT MOVE TO PSW.C

MOV P2.0, C

CLR P2.1 ;"CLK"=0

DJNZ R2, NEXT_BIT

RET

;--------------------------

H_DISPLAY:

SETB PSW.3

SETB PSW.4

CLR P2.3 ; -ENB

MOV R0,#31H

MOV R1,#05H

NOP

NOP

H_NEXT_CHAR: MOV A, @R0

SWAP A

ACALL H_DISP_ONE

INC R0

DJNZ R1,H_NEXT_CHAR

SETB P2.3 ; -ENB

58

CLR PSW.3

CLR PSW.4

RET

;----------------------------

H_DISP_ONE:

MOV R2,#04H

H_NEXT_BIT: SETB P2.1 ; CLK

RLC A

MOV P2.0, C ; DATA

CLR P2.1 ; CLK

DJNZ R2, H_NEXT_BIT

RET

;===========================

INIT_DISP_BUF:

SETB PSW.3

SETB PSW.4

MOV R0,#0AH

MOV R1,#31H

INIT_AGAIN: MOV @R1,#00H ;SET 31H--40H UNITS AS 00H

INC R1

DJNZ R0, INIT_AGAIN

CLR PSW.3

CLR PSW.4

RET

;--------------------------

SEND_TO_BUF01:

SETB PSW.3

SETB PSW.4

MOV B,A

MOV 3AH,A ;(3AH)

SWAP A

MOV 39H,A ;(39H)

MOV A,B

CLR PSW.3

CLR PSW.4

RET

;--------------------------

SEND_TO_BUF23:

SETB PSW.3

SETB PSW.4

MOV B,A

MOV 38H,A ;(38H)

SWAP A

MOV 37H,A ;(37H)

59

MOV A,B

CLR PSW.3

CLR PSW.4

RET

;--------------------------

H_SEND_TO_BUF01:

SETB PSW.3

SETB PSW.4

MOV B,A

MOV 35H,A ;(35H)

SWAP A

MOV 34H,A ;(34H)

MOV A,B

CLR PSW.3

CLR PSW.4

RET

;--------------------------

H_SEND_TO_BUF23:

SETB PSW.3

SETB PSW.4

MOV B,A

MOV 33H,A ;(33H)

SWAP A

MOV 32H,A ;(32H)

MOV A,B

CLR PSW.3

CLR PSW.4

RET

;--------------------------

SET_POINT0:

SETB PSW.4

SETB PSW.3

MOV R1,#36H ;(36H)

MOV @R1,#01H

MOV R1,#31H ;(31H)

MOV @R1,#02H

CLR PSW.3

CLR PSW.4

RET

;--------------------------

INDICATE:

CLR P2.6 ;INDICATE P2.6 AS "0-1-0"

SETB P2.6

ACALL D500MS

60

CLR P2.6

RET

;-----------------------------

61

;====================MCM REQUEST OPERATION====================

request:

RET

;--------------------------------------------------------------------

;===============MCM ANTICOLLISION OPERTION=============

anticollision:

RET

;--------------------------------------------------------------------

;====================MCM SELECT OPERATION=====================

select:

RET

;--------------------------------------------------------------------

;========================= AUTHENTICATION ========================

authentication:

RET

;--------------------------------------------------------------------

;========================= LOAD KEY =========================

LOAD_KEY:

RET

;--------------------------------------------------------------------

;====================MCM WRITE OPERATION=====================

write:

RET

;--------------------------------------------------------------------

;====================MCM read OPERATION=====================

read:

RET

;--------------------------------------------------------------------

62

;========================= HALT OPERATION==============================

halt:

MOV A,#10H

MOV R0,#03H

MOVX @R0,A

MOV A,#04H

MOV R0,#04H

MOVX @R0,A

MOV A,#50H

MOV R0,#00H

MOVX @R0,A

MOV A,#00H

MOV R0,#00H

MOVX @R0,A

;------------------------- SET TOC()= 0AH --------------------------

MOV A,#0AH

MOV R0,#06H

MOVX @R0,A ;TOC() = 0AH

;--------------------------- READ STACON() -------------------------

HALT_RD_STACON_AGAIN:

MOV R0,#01H

MOVX A,@R0 ;READ STACON()

;-------------------JUDGE DV FLAG ----------------------------------

JNB ACC.7,HALT_RD_STACON_AGAIN

;------------------- CLOSE TOC() -----------------------------------

MOV B,A

MOV A,#00AH

MOV R0,#06H

MOVX @R0,A ;TOC() = 00H

MOV A,B

;-------------------------JUDG ANY ERRORS --------------------------

JB ACC.6, HALT_OK_EXIT ;TE="1" IS HALT "OK" FLAG

;-----------------------HAVE ANY ERRORS ----------------------------

MOV B,#06H

LJMP HALT_ERR_EXIT

;-------------------------- EXIT -----------------------------------

HALT_OK_EXIT:

MOV B,#66H ;“ok”disp_flag

SETB P2.6 ;"OK" LAMP NOW WORKING P2.3

ACALL SPK_ON ;if "ok" then spk on

HALT_ERR_EXIT:

MOV A,B

ACALL SEND_TO_BUF01 ;SEND RETURN_VALE TO DISP_BUF_LOW

RET

63

;========================= End of MCM HALT OPERATION =======================

64

;-------------------- DISPLY READ BLOCK VALUE(16 BYTES) ---------------

DISP_RD_BLK:

MOV R0,#50H

MOV R7,#04H

DISP_RD_BLK_LOOP:

MOV A,@R0

LCALL H_SEND_TO_BUF23 ;SEND RETURN_VALE TO DISP_BUF_LOW

INC R0

MOV A,@R0

LCALL H_SEND_TO_BUF01 ;SEND RETURN_VALE TO DISP_BUF_HIGH

INC R0

MOV A,@R0

LCALL SEND_TO_BUF23 ;SEND RETURN_VALE TO H_DISP_BUF_LOW

INC R0

MOV A,@R0

LCALL SEND_TO_BUF01 ;SEND RETURN_VALE TO H_DISP_BUF_HIGH

INC R0

LCALL DISPLAY

LCALL H_DISPLAY

LCALL D500MS

LCALL D500MS

DJNZ R7,DISP_RD_BLK_LOOP

RET

;-------------CLEAR DISPLY_READ_BLOCK VALUE(16 BYTES) IN CPU RAM ----------

CLEAR_DISP_RD_BLK_IN_CPU:

MOV R0,#50H

MOV R7,#10H

CLEAR_DISP_RD_BLK_LOOP:

MOV @R0,#11H ;SEND #11H TO DISP_RD_BLK_IN_CPU

INC R0

DJNZ R7,CLEAR_DISP_RD_BLK_LOOP

RET (待续)

65

2024年8月29日发(作者:出洁玉)

S50非接触式IC卡性能简介(M1)

一、 主要指标

 容量为8K位EEPROM

 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位

 每个扇区有独立的一组密码及访问控制

 每张卡有唯一序列号,为32位

 具有防冲突机制,支持多卡操作

 无电源,自带天线,内含加密控制逻辑和通讯逻辑电路

 数据保存期为10年,可改写10万次,读无限次

 工作温度:-20℃~50℃(湿度为90%)

 工作频率:13.56MHZ

 通信速率:106 KBPS

 读写距离:10 cm以内(与读写器有关)

二、 存储结构

将16个扇区的64个块按绝对地址编号为0~63,存贮结构如下图所示:

扇区0 块1

扇区1

块2

块3

块0

块1

块2

块3

块0

密码A 存取控制 密码B

密码A 存取控制 密码B

0

扇区15

1

2、第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。

3、每个扇区的块0、块1、块2为数据块,可用于存贮数据。

数据块可作两种应用:

★ 用作一般的数据保存,可以进行读、写操作。

1

1、M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也

数据块

数据块

数据块

控制块

数据块

数据块

数据块

控制块

0

1

2

3

4

5

6

7

数据块

数据块

60

61

62

63

2

3

数据块

密码A 存取控制 密码B 控制块

★ 用作数据值,可以进行初始化值、加值、减值、读值操作。

4、每个扇区的块3为控制块,包括了密码A、存取控制、密码B。具体结构如下:

5、每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取

控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的

存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控

制位,定义如下:

块0: C10 C20 C30

块1: C11 C21 C31

块2: C12 C22 C32

块3: C13 C23 C33

三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如

进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。三个控制

位在存取控制字节中的位置,以块0为例:

对块0的控制:

bit 7 6 5 4 3 2 1 0

字节6

字节7

字节8

字节9

C20_b

A0 A1 A2 A3 A4 A5 FF 07 80 69 B0 B1 B2 B3 B4 B5

密码A(6字节) 存取控制(4字节) 密码B(6字节)

C10_b

C30_b

C10

C30

C20

( 注: C10_b表示C10取反 )

存取控制(4字节,其中字节9为备用字节)结构如下所示:

bit 7 6 5 4 3 2 1 0

字节6

字节7

字节8

字节9

C23_b

C13

C22_b

C21_b

C20_b C13_b

C33_b

C12_b

C32_b

C11_b

C31_b

C10_b

C30_b

C12

C32

C11

C31

C10

C30

C33

C23

C22

C21

C20

( 注: _b表示取反 )

6、数据块(块0、块1、块2)的存取控制如下:

2

控制位(X=0..2)

C1X C2X C3X

访 问 条 件 (对数据块 0、1、2)

Read Write Increment Decrement, transfer,

Restore

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

0

0

0

0

1

1

1

1

KeyA|B KeyA|B KeyA|B

KeyA|B Never

KeyA|B KeyB

KeyA|B KeyB

KeyA|B Never

KeyB

KeyB

Never

KeyB

Never

Never

Never

Never

KeyB

Never

Never

Never

Never

KeyA|B

Never

Never

KeyA|B

KeyA|B

Never

Never

Never

(KeyA|B 表示密码A或密码B,Never表示任何条件下不能实现)

例如:当块0的存取控制位C10 C20 C30=1 0 0时,验证密码A或密码B正确后可读;

验证密码B正确后可写;不能进行加值、减值操作。

7、控制块块3的存取控制与数据块(块0、1、2)不同,它的存取控制如下:

C13

C23

C33 Read

密码A

Write

KeyA|B

Never

KeyB

Never

KeyA|B

KeyB

Never

Never

存取控制

Read

KeyA|B

KeyA|B

KeyA|B

KeyA|B

KeyA|B

KeyA|B

KeyA|B

KeyA|B

Write Read

密码B

Write

KeyA|B KeyA|B

KeyA|B

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

0

0

0

0

1

1

1

1

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

N

ever

KeyA|B

KeyB

KeyB

Never

N

ever

KeyB

N

ever

N

ever

KeyA|B

N

ever

KeyA|B

KeyB

N

ever

N

ever

Never

N

ever

Never

例如:当块3的存取控制位C13 C23 C33=1 0 0时,表示:

密码A:不可读,验证KEYA或KEYB正确后,可写(更改)。

存取控制:验证KEYA或KEYB正确后,可读、可写。

密码B:验证KEYA或KEYB正确后,可读、可写。

三、 工作原理

卡片的电气部分只由一个天线和ASIC组成。

天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。

ASIC:卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个

8K位EEPROM组成。

工作原理:读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,

其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使

3

电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷

送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提

供工作电压,将卡内数据发射出去或接取读写器的数据。

四、 M1射频卡与读写器的通讯

复位应答

Request

防冲突机制

Anti collision Loop

选择卡片

Select Tag

改变扇区

三次相互验证

Authentication

不改变扇区

读 块 写 块 加值 减值 中止

Read Write increment decrement Halt

复位应答(

Answer to request)

M1射频卡的通讯协议和通讯波特率是定义好的,当有卡片进入读写器的操作范围时,

4

读写器以特定的协议与它通讯,从而确定该卡是否为M1射频卡,即验证卡片的卡型。

防冲突机制

(Anticollision Loop)

当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的

则处于空闲模式等待下一次选卡,该过程会返回被选卡的序列号。

选择卡片

(Select Tag)

选择被选中的卡的序列号,并同时返回卡的容量代码。

三次互相确认

(3 Pass Authentication)

选定要处理的卡片之后,读写器就确定要访问的扇区号,并对该扇区密码进行密码校验,

在三次相互认证之后就可以通过加密流进行通讯。(在选择另一扇区时,则必须进行另一扇

区密码校验。)

对数据块的操作

(Read):读一个块;

写 (

Write):写一个块;

(Increment):对数值块进行加值;

(Decrement):对数值块进行减值;

存储

(Restore):将块中的内容存到数据寄存器中;

传输

(Transfer):将数据寄存器中的内容写入块中;

中止

(Halt):将卡置于暂停工作状态;

5

关于非接触式IC智能(射频)卡

及其读写设备内核技术的研究与应用开发

上海华东磁记录电子公司 张敏

前 言

当今的信息技术又到了一个关键的十字路口。单独的PC甚至局域网的时代已为“全球

化网络”时代所代替。互联网INTERNET的产生和今天的飞速发展和广泛渗透就是典范。

IC(集成电路)智能卡正在并已经融入当今信息技术的主流。她以其高度的信息集成,

高度的安全性,正日渐其辉煌和灿烂。

随着金融行业的不断发展,社会经济的日新月异,特别是公共交通行业,无线通信领域,

卫生保健行业,封闭式场所管理,身份识别,电话通信,大楼保安系统等等,人们已愈来愈

多地开始接受和使用IC智能卡。特别是银行服务系统,IC智能卡替代古老的磁卡而服务于

大众已日渐成熟。并且“一卡通”,一卡多用,给我们的生活质量带来了很大的提高。IC智

能卡自动电表抄表系统,煤气/自来水抄表系统,公交/地铁自动售票/检票系统,移动通信手

机中IC 智能SIM卡等等,IC智能卡已愈来愈贴近我们的生活,成为我们生活的一步分。“刷

卡”已成为人们日常生活中不可或缺的一部分。

近几年来,随着IC智能卡中的接触式CPU 卡以及非接触式IC智能射频卡(内建MCU,

ASIC等)的高度安全保密性,使之在IC智能卡领域中异军突起,成为当今IC智能卡中的

流行宠物,应用前景十分广阔。

国外对IC卡的研究和应用较早,特别是在美国,欧洲国家等。IC卡遍布社会各个方方

面面。就象在美国,国民消费总额的20%~~30%是由“刷卡”消费完成的,由此可见IC智

能卡流行和使用的程度。

尽管国外对IC卡已有多年的研究,但真正在IC智能卡中特别是CPU卡类, 非接触式

IC智能射频卡(内建MCU,ASIC等)方面的研究也仅有1~~2年的成熟期。因为他们也看

到了CPU 卡,特别是非接触式IC智能射频卡(内建MCU,ASIC等)代表了整个“刷卡”

领域的发展方向,前景光明。

我国对IC卡行业的发展始于1993年左右,当时的中央领导特别是江泽民同志高度重视

IC卡行业,高瞻远瞩,指示要发展我国自己的IC卡事业,建立“金卡工程”。虽然至今也

只有短短的6年左右时间,但已取得了不小的成就。已研制成功我国自主版权的较大容量的

存储卡,逻辑加密卡等,但是对于尖端的CPU卡及非接触式IC智能射频卡(内建MCU,

ASIC等)的制卡技术及其相应的读/写卡设备技术,仍处于落后状态。这极大地制约了IC

卡行业的发展,特别是在要求有极高安全性和保密性的金融行业中,制约了我国金卡工程的

实施和发展。

6

为了加快IC卡行业的发展,特别是尖端的CPU卡及非接触式IC智能射频卡(内建

MCU,ASIC等)的推广应用,让IC卡行业及其他行业的同行尽快掌握CPU卡及非接触式

IC智能射频卡(内建MCU,ASIC等)的核心技术及其读写设备的软硬件技术及应用设计,

跟上国外的IC卡研究和应用步伐,甚至走在其前面,在上海华东计算机研究所,上海计算

机协会等领导同志的关怀下,在上海华东磁记录设备电子公司吴文总经理的直接支持下,经

过一段时间全身心投入的研发之后,笔者已基本上比较全面地掌握了PHILIPS公司的非接

触式IC智能射频卡(内建MCU,ASIC等)MIFARE 1卡(S50系列)及其卡片读写设备

核心模块MCM(Mifare Core Module)的软硬件技术。使我们发展,应用,甚至超越PHILIPS

公司的非接触式IC智能射频卡(内建MCU,ASIC等)技术及其读写设备技术成为可能。

当今世界上非接触式IC智能射频卡(内建MCU,ASIC等)中的主流主要为PHILIPS

公司的MIFARE技术,已经被制定为国际标准:ISO/IEC 14443 TYPE A标准 。欧洲一些

较大的IC卡片制造商以及IC卡片读写器制造商以及IC卡片软件设计公司等(例如法国的

GEMPLUS公司)大都以MIFARE技术为标准,而发展和推进IC卡行业。

通过阅读本文,相信有一定IC卡经验,技术及具有一定的计算机软/硬件技术(尤其是

微处理单片机MCU技术)的同行定能将本文消化之后而能设计出诸多应用场合的产品,例

如,门禁控制系统(Door Access System),高速公路不停车收费系统,停车场收费管理系统,

地铁非接触式IC智能射频卡的“刷卡”读写器,机关/企业内部考勤管理系统,医疗保险管

理系统,公共交通收费管理系统,出租车收费管理系统,银行服务“一卡通”等等。

第一章 Mifare 1 非接触式IC智能(射频)卡

一. Mifare 1非接触式IC智能射频卡特点

Mifare 1 IC智能(射频)卡的核心是Philips 公司的Mifare 1 IC S50(-01,-02,-03,-04)

系列微模块(微晶片)。它确定了卡片的特性以及卡片读写器的诸多性能。

Mifare 1 IC智能(射频)卡采用先进的芯片制造工艺制作。内建有高速的CMOS

EEPROM,MCU等。卡片上除了IC微晶片及一副高效率天线外,无任何其他元件。

卡片上无源(无任何电池),工作时的电源能量由卡片读写器天线发送无线电载波信号

耦合到卡片上天线而产生电能,一般可达2V以上,供卡片上IC工作。工作频率 13.56MHZ。

Mifare 1射频卡所具有的独特的MIFARE RF(射频)非接触式接口标准已被制定为国

际标准:ISO/IEC 14443 TYPE A 标准。

射频卡标准操作距离为100mm(由MCM500 作为读写器核心模块)和 25 mm (由

MCM200 作为读写器核心模块)。 与卡片读写器的通信速率高达106Kbit/s。

Mifare 1 IC智能(射频)卡上具有先进的数据通信加密并双向验证密码系统;且具有防重

叠功能:能在同一时间处理重叠在卡片读写器天线的有效工作距离内的多张重叠的卡片。

7

Mifare 1 IC智能(射频)卡与读写器通信使用握手式半双工通信协议;卡片上有高速的

CRC协处理器,符合CCITT标准。

卡片制造时具有唯一的卡片系列号,没有重复的相同的两张MIFARE 卡片。

卡片上内建8K(bit) EEPROM存储容量并划分为16个扇区,每个扇区划分为4个数

据存储块,每个扇区可由多种方式的密码管理。

卡片上还内建有增值/减值的专项的数学运算电路,非常适合公交/地铁等行业的检票/收

费系统。典型的检票交易时间最长不超过100ms(0.1秒)(包括卡片的认证,6个扇区的读

(768bit,2个扇区的认证),2个扇区的写操作(256bit))。

卡片上的数据读写可超过10万次以上;数据保存期可达10年以上,且卡片抗静电保护

能力达2KV以上。

二. Mifare 1非接触式IC智能射频卡功能组成

如图所示为MIFARE 1 S50非接触式IC智能射频卡的功能组成图。

MIFARE 1 S50 CARD IC

RF-Interface

射频接口电路

Digital Section

数字电路部分

波形转换

Control &

Clock

ATR

正弦=>方波

Arithm. Un

it

Data

AntiCollision

Modu./DeModu

RAM

调制/解调

ROM

Select Application

POR

Crypto Unit

(复位)

Access Control

Energy

卡片天线

整个卡片包含了两个部分,RF射频接口电路和数字电路部分。

(一). RF射频接口电路

在RF射频接口电路中,主要包括有波形转换模块。它可将卡片读写器上的13.56MHZ

的无线电调制频率接收,一方面送调制/解调模块,另一方面进行波形转换,将正弦波转换

为方波,然后对其整流滤波,由电压调节模块对电压进行进一步的处理,包括稳压等,最

终输出供给卡片上的各电路。

POR模块主要是对卡片上的各个电路进行POWER-ON-RESET(上电复位),使各电路

同步启动工作。

电压调节

Authentication &

8

(二)。 在数字电路部分模块中:

1.

ATR模块:Answer to Request(“请求之应答“)

当一张Mifare 1卡片处在卡片读写器的天线的工作范围之内时,程序员控制读写器向卡

片发出REQUEST all(或REQUEST std) 命令后,卡片的ATR将启动,将卡片Block 0 中的

卡片类型(TagType)号共2个字节传送给读写器,建立卡片与读写器的第一步通信联络。

如果不进行第一步的ATR工作,读写器对卡片的其他操作(Read/Write等)将不会进

行。

卡片的类型(TagType)号共2个字节,可能为:0004H

2.AntiCollision模块:防止(卡片)重叠功能

如果有多张Mifare 1卡片处在卡片读写器的天线的工作范围之内时,AntiCollision模块

的防重叠功能将被启动工作。在程序员控制下的卡片读写器将会首先与每一张卡片进行通

信,取得每一张卡片的系列号。由于Mifare 1卡片每一张都具有其唯一的系列号,决不会相

同,因此卡片读写器根据卡片的序列号来识别,区分已选的卡片,卡片读写器中的MCM中

的AntiCollision防重叠功能配合卡片上的防重叠功能模块,由程序员来控制读写器,根据卡

片的序列号来选定一张卡片。被选中的卡片将直接与读写器进行数据交换,未被选择的卡片

处于等待状态,随时准备与卡片读写器进行通信。

AntiCollision模块(防重叠功能)启动工作时,卡片读写器将得到卡片的序列号Serial

Number。序列号Serial Number存储在卡片的Block 0中,共有5个字节,实际有用的为4

个字节,另一个字节为序列号Serial Number的校验字节,这在以后章节中详细论述,包括

对序列号Serial Number的校验方法等。

序列号Serial Number中实际有用的4个字节,可能为:007e0a42h 。

3.

Select Application 模块:主要用于卡片的选择。

当卡片与读写器完成了上述的二个步骤,程序员控制的读写器要想对卡片进行读写操

作,必须对卡片进行“Select” 操作。以使卡片真正地被选中。

被选中的卡片将卡片上存储在Block 0中的卡片的容量“Size” 字节传送给读写器。当

读写器收到这一字节后,将明确可以对卡片进行深一步的操作了。例如,可以进行密码验证

等等。

读写器收到的“Size” 字节可能为:88h

4.

Authentication & Access Control 模块: 认证及存取控制模块

在确认了上述的三个步骤,确认已经选择了一张卡片时,程序员对卡片进行读写操作之

前,必须对卡片上已经设置的密码进行认证,如果匹配,则允许进一步的Read/Write操作。

Mifare 1 卡片上有16个扇区,每个扇区都可分别设置各自的密码,互不干涉。因此每

个扇区可独立地应用于一个应用场合。整个卡片可以设计成“一卡通”形式来应用。

三遍认证:

如图所示为三遍认证的令牌原理框图。

(A)RB

非接触式卡Mifare 1

(E) (B)TOKEN AB (C)

片读写器 卡片

(D)TOKEN BA

9

认证过程是这样进行的:

(A)环 :由Mifare 1卡片 向读写器 发送一个随机数据 RB;

(B)环 :由读写器收到RB后向Mifare 1卡片发送一个令牌数据TOKEN AB,其中包

含了读写器发出的一个随机数据 RA;

(C)环 :Mifare 1卡片收到 TOKEN AB 后,对TOKEN AB 的加密的部分进行解

密,并校验第一次由(A)环中Mifare 1卡片 发出去的随机数RB是否与

(B)环中接收到的TOKEN AB中的RB相一致;

(D)

环 : 如果(C)环校验是正确的,则Mifare 1卡片 向读写器 发送令牌TOKEN

BA给读写器 ;

(E)环 :读写器 收到令牌TOKEN BA后,读写器将对令牌TOKEN BA中的RB(随

机数)进行解密;并校验第一次由(B)环中读写器发出去的随机数RA

是否与(D)环中接收到 的TOKEN BA中的RA相一致;

如果上述的每一个环都为“真”,都能正确通过验证,则整个的认证过程将成功。读

写器将能对刚刚认证通过的卡片上的这个扇区可以进入下一步的操作(READ/WRITE 等操

作)。

卡片中的其他扇区由于有其各自的密码,因此不能对其进行进一步的操作。如想对其

他扇区进行操作,必须完成上述的认证过程。

认证过程中的任何一环出现差错,整个认证将告失败。必须从新开始。

如果事先不知卡片上的密码,则由于密码的变化可以极其复杂,因此靠猜测密码而想打

开卡片上的一个扇区的可能性几乎为零。

这里提醒一下程序员和卡片的使用者,必须牢记卡片中的16个扇区的每一个密码,否

则,遗忘某一扇区的密码,将使该扇区中的数据不能读写。没有任何办法可以挽救这种低级

错误。但是,卡片上的其他扇区可以照样使用。

上述的叙述已经可以充分地说明了Mifare 1 卡片的高度安全性,保密性,及卡片的应

用场合多样性,一卡多用(一卡通)。

5.

Control & Arithmetic Unit 控制及算术运算单元:

这一单元是整个卡片的控制中心,是卡片的“头脑”。它主要进行对整个卡片的各个单

位进行微操作控制,协调卡片的各个步骤;同时它还对各种收/发的数据进行算术运算处理,

递增/递减处理,CRC运算处理,等等。是卡片中内建的中央微处理机(MCU)单元。

6.

RAM/ROM 单元:

RAM主要配合控制及算术运算单元,将运算的结果进行暂时存储,如果某些数据需要

存储到EEPROM,则由控制及算术运算单元取出送到EEPROM存储器中;如果某些数据需

要传送给读写器,则由控制及算术运算单元取出,经过RF射频接口电路的处理,通过卡片上

的天线传送给卡片读写器。RAM中的数据在卡片失掉电源后(卡片离开读写器天线的有效工

作范围内)将被清除。

同时,ROM中还固化了卡片运行所需要的必要的程序指令,由控制及算术运算单元取

出去对每个单元进行微指令控制。使卡片能有条不紊地与卡片的读写器进行数据通信。

7.

Crypto Unit 数据加密单元:

该单元完成对数据的加密处理及密码保护。加密的算法可以为DES标准算法或其他。

8. EEPROM INTERFACE/EEPROM MEMORY EEPROM存储器及其接口电路:

该单元主要用于存储数据。EEPROM中的数据在卡片失掉电源后(卡片离开读写器天

线的有效工作范围内)仍将被保持。用户所要存储的数据被存放在该单元中。Mifare 1卡片中

的这一单元容量为8196bit(1 Kbyte)。分为16个扇区。

10

三.

Mifare 1 IC智能(射频)卡的物理组成及卡片上天线的研究

在卡片上的微晶片外面一般封装了保护层。保护层可以防止微晶片被折叠,扭曲等众多

对卡片实施非正常的物理性损坏。同时也防止微晶片受到紫外线的辐射,使卡片能长久地被

使用。

但从电性能的角度来看,由于加入了保护层,使IC与卡片上的天线组成的振荡回路的频

率将发生变化。因为,保护层给IC微晶片增加了一个输入回路电容Cmount。尽管这个电容

只有几个pf 至几十个pf,但对于要求频率精度,稳定度等都很高的非接触式IC智能射频卡

来说,也将是很重要的。

带保护层的

IC微晶片

天线线圈

Mifare 1 IC智能(射频)卡

卡片上的等效电路如下:

Rcoil La

Ccoil Cpack Cic Cmount

Lcoil

Lb

不带IC微晶片的天线 IC 微晶片

整个卡片的自由振荡频率计算方法:

F

res

=

1

2

*

3.1415926

*

( Lcoil

*

(Ccoil + Cpack +C ic + C mount ) )

1 / 2

说明:

F

r

es

:卡片的振荡频率,应为13.56MHz

11

Rcoil :天线线圈的电阻,约6.07欧娒

Lcoil :天线线圈的电感,约 3.6 μH

Ccoil :天线线圈的电容,约 5pf

Cpack :天线线圈的封装后引入的电容, 约 5pf

Cic :IC微晶片的电容,约 16pf

Cmount :IC微晶片的安装后引入的电容, 约 几个pf ~ 几十个pf

La :天线线圈与IC微晶片的接触点a

Lb :天线线圈与IC微晶片的接触点b

其中,

天线线圈的电感:

Lcoil = 2 * L [cm] * ( ln ( L [mm] / D [mm] – 1.04 ) * N

L : 天线线圈一圈的长度

N :天线线圈圈数,一般为4圈

D :天线线圈直径或导体的宽度

P :由天线线圈的技术而定的N的指数因子,如下表所示:

P值:

1.8

1.7

1.5 ~~ 1.7

天线线圈结构:

环绕线圈

Etched(蚀刻)线圈

印刷电路板线圈

p

上述天线线圈的电感的公式只能作为首次估测之用,实际的天线线圈的电感必须通

过仪器测量而定,但偏差不会很大。

一般 天线线圈的电感 : Lcoil < 4.2μH, 实际中推荐在 3.6μH 左右为最优。

天线线圈的品质因数 Qcoil :

ω2πfres

*

13.56

Qcoil =

* Lcoil

= =

一般天线线圈的品质因数 30 < Qcoil < 60。

实际中,品质因数 Qcoil在>30后的增加量, 对卡片的操作距离的增加无明显帮

助;品质因数 Qcoil必须 < 60 ,以确保数据通信稳定,可靠,否则天线的有效工作距离

内有死区,而不能可靠地进行数据通信。

天线线圈的矩形面积S

总:

S

必须 > 11200 mm

2

Rcoil Rcoil Rcoil

S

= S

平均

*

N圈

2

所以S

平均

必须 > 11200 mm/ N圈

2

一般,S

平均

>= 2778 mm(当卡片上的天线线圈的矩形面积的 长 X 宽 = 40mm

X 70 mm时)。

2

实际中,推荐S

平均

在3330 mm左右。即,实际设计时,卡片上的天线线圈的矩形

面积的长和宽应为:74mm 和45mm,天线线圈的圈数N为4圈,则这样制作出的卡

片将能保证通信的距离。

12

13

四.Mifare 1卡片的存储结构

Mifare 1卡片的存储容量为8192 BIT X 1位字长(即1K X 8位字长),采用EEPROM

作为存储介质,整个结构划分为16个扇区,编为扇区0 ~~ 15。每个扇区有4个块(Block),

分别为块0,块1,块2和块3。每个块有16个字节。一个扇区共有 16 Byte X 4 = 64 Byte。如

下图:

0

块 0(厂商标志代码)

块 1

块 2

块 3(A密码+存取控制+B密码)

1

Block 0

Block 1

Block 2

Block 3(A密码+存取控制+B密码)

15

Block 0

Block 1

Block 2

块 3(A密码+存取控制+B密码)

每个扇区的块3(即第四块) 包含了该扇区的密码A(6个字节)、存取控制(4个字节)、密

码B(6个字节),是一个特殊的块。其余三个块是一般的数据块。

但扇区0的块0是特殊的,是厂商代码,已固化,不可改写。

其中: 第0~4个字节为卡片的序列号,第5个字节为序列号的校验码;

第6个字节为卡片的容量“SIZE”字节;

第7,8个字节为卡片的类型号字节,即Tagtype字节;

其他字节由厂商另加定义。

Mifare 1 卡片的扇区0中的块0(Block 0)存储的16个字节的内容可能为:

420a7e8174h。

下面将对密码A,密码B,存取控制与数据区的关系加以说明:

存取控制的结构如下:(四个字节中的各位依次命名为)

14

位: 7 6 5 4 3 2 1 0

C2X3_b C2X2_b C2X1_b C2X0_b

C1X3_b C1X2_b C1X1_b C1X0_b

C3X3_b

C2X3

BX3

C3X2_b

C2X2

BX2

C3X1_b

C2X1

BX1

C3X0_b

C2X0

BX0

C1X3

C3X3

BX7

C1X2

C3X2

BX6

C1X1

C3X1

BX5

C1X0

C3X0

BX4

_b 表示取反,如C2X3_b 即C2X3取反;X表示扇区号;Y表示第几块;C表示控制位;

B表示备用位;

存取控制对块3的控制如下:(X=0-15)

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

0

0

0

0

1

1

1

1

密码A

never

never

never

never

never

never

never

never

密码A

Write

KEYA|B

Never

KEYB

Never

KEYA|B

KEYB

Never

Never

存取控制 存取控制 密码B

read

KEYA|B

KEYA|B

KEYA|B

KEYA|B

KEYA|B

KEYA|B

KEYA|B

KEYA|B

write

never

never

never

never

KEYA|B

KEYB

KEYB

never

read

密码B

write C1X3 C2X3 C3X3 read

KEYA|B KEYA|B

KEYA|B never

never

never

never

never

never

KEYB

never

KEYB

never

never

KEYA|B KEYA|B

KEYA|B 表示密码A或密码B;never表示没有条件实现。

对数据块的控制如下表:

(X=0-15扇区、Y=每个扇区的0-2块)

C1XY

0

0

1

1

0

0

1

1

C2XY

0

1

0

1

0

1

0

1

C3XY

0

0

0

0

1

1

1

1

Read Write Increment Decr,Transfer,restore

KEYA|B

never

never

KEYA|B

KEYA|B

never

never

never

never

never

KEYB

never

never

never

never

KEYA|B KEYA|B KEYA|B

KEYA|B never

KEYA|B KEYB

KEYA|B KEYB

KEYA|B never

KEYB

KEYB

Never

KEYB

never

never

块3的初始化值为:a0,a1,a2,a3,a4,a5,ff,07,80,69,b0,b1,b2,b3,b4,b5共16个字节,其中 KEYA

是{a0,a1,a2,a3,a4,a5},KEYB是{b0,b1,b2,b3,b4,b5},控制存取的四个字节为

{0xff,0x07,0x80,0x69}。

存取控制位表示如下(请用户去对照上表以确定初始化状态):

Ff h

位:# 7 6 5 4 3 2 1 0

07h

80h

69h

15

1

0

1

0

1

0

0

1

1

0

0

1

1

0

0

0

1

0

0

1

1

1

0

0

1

1

0

0

1

1

0

1

程序员可以根据自已应用的具体情况,对不同的扇区可选用不用的存取控制,不同的密

码,但应注意其每一位的格式,以免误用!

数据块有两种应用方法,一种是用作一般的数据保存用,直接读写。另一种用法是用作

数值块,可以进行初始化值、加值、减值、读值的运算。系统配用相应的函数完成相应的功

能。

16

MCM内核技术说明

第二章

MCM的硬件内核电路

一.

MCM200/MCM500读写模块说明

Mifare Core Module是MCM的全称,意为Mifare 核心模块。

Philips公司的MCM 主要有两种产品型号,为MCM200和MCM500。这两种智能模块

均被用于读写Mifare 1非接触式IC智能射频卡的读写器中,负责读写器中对非接触式IC智

能射频卡片的读写等功能,一般在读写器中还必须有MCU(微处理单片机)来对MCM进

行控制,及对读写器的其他方面进行控制,例如对键盘,显示,通信等部分的控制等等。

MCM200模块主要应用于对卡片操作距离在 25mm的卡片读写器中;

MCM500模块主要应用于对卡片操作距离在100mm的卡片读写器中。

Mifare所具有的独特的MIFARE RF(射频)非接触式接口标准已被制定为国际标准:

ISO/IEC 14443 TYPE A 标准。

(一)。 MCM200模块说明

A.特性:

1.标准的双列直插32引脚

2.工作频率:13.56MHZ

3.标准的+5V 电源供电,供电范围4.75V至5.25V

4.(典型)电流消耗40MA,最大不超过80MA,最小10MA左右

5.读写卡片距离可达25MM以上

6.与卡片的通信速率可达106KBps

7.模块与卡片通信时,数据加密

8.每个扇区设有3套密码及其认证和密码存储器

9.有防卡片重叠功能

10.

16个字节的FIFO(先进先出)队列接收/发送缓冲寄存器

11.

在模块与卡片通信时自动侦查错误,自动对数据流分析

12.

对RF(射频)通道自动监控

13.

内建8位/16位的CRC协处理器,提供CRC,PARITY等数据校验

14.

支持多种方式的活动天线,并且不需“天调系统”(天线调节系统)对天线

进行补偿调节

15.

标准的MIFARE并行接口与MCM500 100%全兼容

16.

MCM200 的软件与MCM500模块 100%全兼容

17.

可控制,级联MCM500模块

18.

工作温度范围在:-20 ~ +70度

B.MCM200模块引脚说明

如图所示是该模块的引脚排列示意图:

17

D7

D6

D5

D4

D3

D2

D1

D0

BP

NPAUSE1

KOMP1

NRST

DVDD

DGND

NIRQ

TP

MCM200引脚说明如下:

引脚 引脚名称 引脚类型

1 32

2 31

3 30

4 29

5 28

6 27

7 26

8 25

9 24

10 23

11 22

12 21

13 20

14 19

15 18

16 17

KPROG

NCS

NWR

NRD

A0

A1

A2

A3

ALE

USEALE

MODE

NANT

ANT

AVDD

AGND

RX

MCM200模块

将来使用类

引脚 引脚名称 引脚类型

将来使用类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

D7

D6

D5

D4

D3

D2

D1

D0

Bp

NPAUSE1

KOMP1

NRST

DVDD

DGND

NIRQ

TP

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

SUPPLY

O

I(PU)

I

SUPPLY

SUPPLY

O

O(analog)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

I/O(PU)

SUPPLY

O

I(PU)

I

SUPPLY

SUPPLY

O

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

RX

AGND

ACDD

ANT

NANT

MODE

USEALE

ALE

A3

A2

A1

A0

NRD

NWR

NCS

KPROG

I(analog)

SUPPLY

SUPPLY

O

O

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

I(PU)

NC

I(analog)

SUPPLY

SUPPLY

O

O

I(PU)

I(PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

I(ST,PU)

SUPPLY

上述表中:I --------------- 输入引脚 O --------------- 输出引脚

SUPPLY -------电源供电输入 I/O ---------------输入/输出双向引脚

PU ---------------Internal Pull-up 内部有上拉电阻

18

ST---------------- Schmit-Trigger input 施密特触发输入

C.其他说明

MCM200是Philips 公司的产品,另外还有其他公司与之相兼容的产品。

UniVision Engineering Limited (联视工程有限公司)持有Mifare 制造专利,其生产的相

当与MCM200的产品命名为SB201。

SB201与MCM200模块在硬件上有一处不同,表现在软件上有一个MODE方式寄存器

的设置不同。SB201 的MODE 设置为0xD6H;MCM200 的设置为0xC6H(这在以后的章

节中还会论述)。除此以外,两者软/硬件100%全兼容。

法国的GEMPLUS公司向PHILIPS公司购买MCM中核心ASIC RC150或RC170芯片

制造的MCM200模块及读写器与MCM200全兼容等。

(二). MCM500模块说明

A.. 特性:

1.

工作频率:13.56MHZ

2.

标准的+12V电源供电,

3.

工作频率:13.56MHZ

4.

读写卡片距离可达100MM以上

5.

与卡片的通信速率可达106KBps

6.

模块与卡片通信时,数据加密

7.

每个扇区设有3套密码及其认证和密码存储器

8.

有防卡片重叠功能

9.

16个字节的FIFO(先进先出)队列接收/发送缓冲寄存器

10.

在模块与卡片通信时自动侦查错误,自动对数据流分析

11.

对RF(射频)通道自动监控

12.

内建8位/16位的CRC协处理器,提供CRC,PARITY等数据校验

13.

支持多种方式的活动天线,并且不需“天调系统”(天线调节系统)对

天线进行补偿调节

14.

标准的MIFARE并行接口与MCM200 100%全兼容

15.

MCM200 的软件与MCM500模块 100%全兼容

16.

可遥控,级联MCM500模块

17.

工作温度范围在:-20 ~ +70度

B.MCM500模块引脚说明

如图所示是该模块的引脚排列示意图:

次开发 15 1

。。。。。

16 2

17

18

屏 蔽 盒

31

32

19

34

48

。。。。。

33

47

如图所示是该模块的引脚排列示意图:

引脚

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

引脚名称

NPAUSE1

NWR

GATE1

NRD

MOD1

MODE

SYNC1

NCS

WKOMP1

CS

KOMP1

N.T.C.

DGND

N.T.C.

DVDD

CLOCK

RFVDD

N.T.C.

RFGND

N.T.C.

RxKOMP

引脚

类型

O

I

O/NC

I

O/NC

I

I/NC

I

I

I

I

O/NC

O

功 能 描 述

串行数据输出,驱动RF1单元,该引脚必须连到RF单元的

TxNPAUSE端。该引脚的“LOW”信号指示一个能量暂停。

写信号使能端

(未使用)

读信号使能端

(未使用)

并行协议模式,必须用“HIGH”高电平来驱动。

(未使用)

(Not Chip Select)当MCU用“LOW”低电平来驱动 该引脚时,将选中

MCM

(未使用)

(Chip Select)当MCU用“HIGH”高电平来驱动 该引脚时,将选中MCM

(Compartor input of RF1)RF1的比较器输入端,必须连到RF单元的

RXKOMP端

(未使用)

数字电路接地端

(未使用)

电源供应端+5V。内部在RxKOMP端上有上拉电阻。

(未使用)

+12V电源输入,供给RF射频单元

(未使用)

RF射频单元(模拟电路)接地端

(未使用)

RF射频单元的输出信号端。它提供与数字电平兼容的接收信

号。其对地(DGND)为集电极开路输出,并有上拉电阻2K2

接到DVDD端

(Compartor input of RF0)RF0的比较器输入端,必须连到RF单元的

RXKOMP端

22

23

24

25

KOMP0

RxWKOMP

WKOMP0

SYNC

I

O

I

O/NC

(未使用)

(未使用)

(未使用)

20

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

SYNC0

TxMOD

MOD0

RxGATE

GATE0

TxNPAUSE

NPAUSE0

A0

D0

A1

D1

A2

D2

A3

D3

ALE

D4

USEALE

D5

NIRQ

D6

BP

D7

I/NC

I/NC

O/NC

I/NC

O/NC

I

O

I

I/O

I

I/O

I

I/O

I

I/O

I

I/O

I

I/O

O

(未使用)

(未使用)

(未使用)

(未使用)

(未使用)

CMOS兼容电平输入信号至RF射频单元。该信号参考与RFGND接地端。

串行数据输出,驱动RF0单元,该引脚必须连到RF单元的

TxNPAUSE端。该引脚的“LOW”信号指示一个能量暂停。

A0 ~ A3为4位地址线

D0 ~ D7为8位双向数据总线

A0 ~ A3为4位地址线

D0 ~ D7为8位双向数据总线

A0 ~ A3为4位地址线

D0 ~ D7为8位双向数据总线

A0 ~ A3为4位地址线

D0 ~ D7为8位双向数据总线

Address Latch Enable地址锁存使能端

D0 ~ D7为8位双向数据总线

选择器:从内部地址锁存器或A0~A3引脚取地址

D0 ~ D7为8位双向数据总线

当该端为“LOW”时,通知MCU应该按评估MCM的状态寄存器内容,并存取MCM

中的数据

I/O

I/O

D0 ~ D7为8位双向数据总线

后备电池输入端,保护MCM内部密码RAM

D0 ~ D7为8位双向数据总线

上述表中:I --------------- 输入引脚 O --------------- 输出引脚

SUPPLY -------电源供电输入 I/O ---------------输入/输出双向引脚

PU ---------------Internal Pull-up 内部有上拉电阻

NC -------------- 该引脚暂时未使用

上述MCM500引脚功能说明表中,与MCM200引脚定义相一致的,同样适用与对

MCM200的引脚说明。

C.其他说明

MCM500是Philips 公司的产品,另外还有其他公司与之相兼容的产品。

UniVision Engineering Limited (联视工程有限公司)持有Mifare 制造专利,其生产的相

当与MCM200的产品命名为SB601。

SB601与MCM500模块在硬件上有一处不同,表现在软件上有一个MODE方式寄存器

的设置不同。SB601 的MODE 设置为0xD6H;MCM500 的设置为0xC6H(这在以后的章

节中还会论述)。除此以外,两者软/硬件100%全兼容。这一点与上述的MCM200模块/SB201

模块相一致。

法国的GEMPLUS公司向PHILIPS公司购买MCM中核心ASIC RC150或RC170芯片

21

制造的MCM500模块及读写器与MCM500全兼容。 等等。

二. MCM的硬件内核寄存器描述

MCU是通过对MCM 内核特殊的内存寄存器的读写来控制MCM的。这些寄存器位

于MCM中的ASIC(特殊应用IC)的内部。共有16个寄存器可存取。在对MCM进行读

/写操作时,各寄存器担负着不同的功能和作用,并且不是所有的寄存器都是可写或可读的,

即有些寄存器只能读而不能写,有些则反之。

读取MCM, 一般的 指向MIFARE 1卡请求。MCM实际上是MCU与非接触式IC

智能(射频)卡之间信息(数据)交换的”中间人”。任何读取卡片上的数据,或写进卡片上的数据`

均必须通过MCM 来传递。写MCM意味着去控制MCM,例如,送一些类型的指令给它。

以下是MCM中ASIC内核特殊寄存器一览表。

MCM—ASIC 寄存器

寄存器名

DATA

STACON

ENABLE

BCNTS

BCNTR

BAUDRATE

TOC

MODE

CRCDATA

地址

00H 0

01H 1

02H 2

03H 3

04H 4

05H 5

06H 6

07H 7

08H 8

读(READ)

READ-BYTE

DV TE PE CE BE AE --

--

写(WRITE)

WRITE-BYTE

SOR RFS -- -- 1 1 NRF

AC

N/A

N/A

N/A

N/A

N/A

N/A

CRC-BYTE-READ

CV -- -- -- -- -- -- CZ

N/A

1 PR CE CR -- -- -- --

BIT-COUNT-SEND

BIT-COUNT-RECEIVE

-- -- -- -- 1 1 1 BR

TIMEOUT-COUNTER

CRC-BYTE-WRITE

C8 -- -- -- -- -- --

CR

KEY-BYTE-WRITE

1 1 0 0 0 P2 P1 P0 P

CRCSTACON 09H 9

KEYDATA 0AH

10

0BH

11

0CH

12

0DH

KEYSTACON

KEYADDR

-- -- -- -- -- -- -- --

N/A

AL 0 -- -- -- -- KS1

KS0

AL AB A5 A4 A3 A2 A1

A0

22

13

RCODE

0EH

14

0FH

15

N/A

表1 :MCM –ASIC 寄存器

各种特殊寄存器材的具体说明如下:

1.

DATA 寄存器 地址:OOH

寄存器名

DATA

地址

00H 0

读(READ)

READ-BYTE

写(WRITE)

WRITE-BYTE

-- -- -- -- 0 0 RC1 RC0

任何传递到MIFARE 1卡的数据 或 来自MIFRAE 1卡的数据 都必须分别地 被写入

DATA寄存器 或 从DATA寄存器中 读出。

例如, MCU向卡片写数据Xi, 则Xi必须首先被写入到 DATA寄存器中, 然后在MCM

与Mifare 1 卡片进行通信, 由卡片上的ASIC将DATA寄存器中的数据读取并存放在指定

的卡片上的存储器中, 从而完成 MCU向MIFRAE 1卡片写数据的过程。 反之亦然。

DATA寄存器中有一个16 BYTE 的FIFO(先进先出)队列寄存器。 数据写到DATA

寄存器后,被存放在这个16 BYTE 的FIFO(先进先出)队列寄存器中, 等待向卡片上或

MCU传送。

如要进行传送DATA寄存器中数据, 则首先必须先设定要传输 多少位(BIT) 或多少字

节(BYTE), 即必须对BCNTS寄存器进行有效的正确设置,以确定有多少字节将要被传送。

当卡片上的数据流接收 结束或没有被接收时, STACON寄存器中的DV标志被置位”1”,

并且MCM 上的引脚NIRQ也将由”HIGH”变为”LOW”。

如果设置了DV-bit,则STACON寄存器中的error-bits (出错位)将被设置。如果没

有相关的error-bit被设置,则FIFO寄存器中的数据将被假设为正确,且可以被读出。

2. STACON 寄存器 地址:01H

SATCON 是STATUS CONTROL (状态控制)的缩写,是一个状态控制寄存器。

寄存器名

STACON

地址

01H 1

-- --

读(READ) 写(WRITE)

AC

DV TE PE CE BE AE SOR RFS -- -- 1 1 NRF

将数据写到STACON寄存器中将对MCM进行状态控制,见如下表:

Bit Name

位名

SOR

RFS

Name名称

Soft Reset

(软复位)

RF-Select

(RF选择)

23

Function功能

“0” ----表示无作用

“1”:----reset MCMA1,自动地清楚一切

“0”----RF单元0被选中激活

“1”---- RF单元1被选中激活

NRF

AC

NO RF

(无RF)

Anti Collision

(防重叠)

“0”----将活动(激活)RF单元接上

“1”----将活动(激活)RF单元关闭

“0”----无作用

“1”----启动防重叠状态机

这里,应该注意, 当写数据到STACON寄存器时(即对STACON寄存器进行设置),在

写数据到STACON寄存器的这一写周期中,RFS位的设置必须与RF单元相互一致。

另外,设置了AC位,即“AC=1”,将使防重叠状态机启动工作,执行内部存取。这一

存取在设置AC位后的12us开始,至35us结束。在这一间隙时间,不允许MCU向MCM

进行写(WRITE)数据操作。必须延迟35us。这是为了保证防重叠状态机处理软件的正确

运行,让其能识别叠放在一起的多张Mifare 1 卡片,为下一步进行选择一张指定SN(Serial

Number)的Mifare 1卡片进行数据读/写而作准备。Philips公司(或UniVision Engineering

Limited 联视工程公司)推荐至少延迟35us,然后进行写DATA,TOC寄存器等操作。

读取 STACON寄存器,将告诉我们一系列的MCM及卡片的当前状况信息。以下是读

取STACON寄存器后的一系列标志位表。

Bit Name 位名 Name名称

Data Valid

(数据有效)

Timeout Error

(溢出出错)

Parity Error

(奇/偶校验错)

CRC Error

(CRC错)

Bitcount Error

(位记数器出错)

Authentication

(认证出错)

Function功能

卡上的数据传输到FIFO寄存器中 或一个定

时记数器溢出(以在确定TE标志时,是二者

中的那一个溢出)。DV位也可以在正确的

Authentication(认证)操作完成后而被设置。

DV

TE

PE

CE

BE

一个定时记数器溢出发生。

在通讯时有奇/偶校验错

在通讯时有CRC错

在BCNTR寄存器中有大量的指定bits(位)没

有收到。

卡的认证应答码不正确或当执行一个取密码

(KEY Error Load) 操作时指定的ROM

KEY(只读存储器中密码)不正确。

AE

在上述表中,仅当DV(Data Valid数据有效)位被设置有效时(即DV=”1”) ,TE,PE,CE,

BE及AE标志才有效。但有一例外,即 当认证(Authentication)正确完成后,AE标志也

直接有效。

SOR是Software Reset(软件复位)的缩写。当执行SOR后,所有的这些标志将被清除,

且当对MCM的任何一个寄存器执行写周期时,所有的这些标志也将被清除。详见SOR后

的复位表。

当对MCM内的任何一个寄存器执行写周期时,所有的这些标志也将被清除;仅当FIFO是

空时,DV标志将被写周期清除。

有时侯MCM接收少于8 bits(例如 在接收ACK 或NACK时)时,MCM将不影响PE,

CE, 及AE标志。

在MCU与MCM, MCM与Mifare 1卡片进行数据通信时,经常会出现各种错误。例如,

卡片没能认证(Authentication) 通过, 则会使AE出错位置位,等等。

以下是在检查DV位之后,相关的

出错

情况,列为下表:

Command Name (命令名): Relevant Error Flags (相关的出错标志):

24

Answer to Request(Request应答)

Anti Collision (防重叠)

Select Card (卡片选择)

Authentication (认证)

Read Command (读命令)

Read DATA (读数据)

Write Command ( 写命令)

Write DATA (写数据)

InCR。/DeCR。/Rest。 Command

(增/减/复位 命令)

InCR。/DeCR。/Rest。 Value

(增/减/复位 值)

Halt (停机)

出 错 表

TE,BE

TE,BE

TE,BE, PE,CE

TE,BE,PE,AE

TE,BE

TE,BE,PE,CE

TE,BE

TE,BE

TE , BE

TE , BE

TE , BE

注意,送到卡片上的所有的命令和数据都提供奇/偶校验(parity) 和CRC 检查( 但

“REQUEST”命令操作除外)。这是由卡片上的ASIC负责检查。

3。 ENABLE 寄存器,地址:02H

ENABLE 寄存器的设置将影响卡片在通信时对 parity 和CRC 的校验。在ENABLE

寄存器中有针对 parity 和CRC 校验的复位允许位(reset ENABLE bits)。

寄存器名

ENABLE

地址

02H 2

读(READ)

N/A

写(WRITE)

1 PRE CEN CRE -- -- --

--

对ENABLE寄存器进行写操作,将执行对parity 和CRC块的控制。

Bit Name

位名

PR

CE

CR

Name名称

Parity reset

(Parity复位)

CRC ENABLE

(CRC 使能)

CRC Reset

(CRC 复位)

“0”-----无效

Function功能

“1”-----复位parity 块,自动清除

“0”----- 关闭CRC发生器及校验

“1”---- 打开CRC发生器及校验

“0”----- 无效

“1”----- 复位CRC 块,自动清除

在对MCM进行编程的开始时,必须对ENABLE寄存器进行写操作,即必须将CE位关

闭。仅当执行”Select”命令操作时才打开CE位:

由于MCM在电源接通时或在任何数据通信开始时,都会复位 parity 和CRC块,因

此无须额外地去执行这一操作。

4. BCNTS 寄存器,地址: 03H

寄存器名

BCNTS

地址

03H 3

读(READ)

N/A

写(WRITE)

BIT-COUNT-SEND

BCNTS是英文Bit-Counter-for-Sending的缩写,意为传送时的位计数器(寄存器)。 这里的

25

传送指的是CPU向MCM的DATA寄存器写数据。因此BCNTS寄存器实际上是一个字节发

送控制器,它控制了MCU向DATA寄存器中写进的数据字节数目。

例如,设置BCTRS=10H,则可向MCM的DATA寄存器写进的数据字节数目为2个(8位字

长的数据,因为总的bit数目=10H=16D),多余的数据,MCM将不予接收。

由于BCNTS寄存器是控制向DATA寄存器写数据的字节数目,因此这一操作必须在数据

写入DATA寄存器之前完成。使用2进制代码来操作。

在大量的字节数据被写入DATA寄存器之后,MCM自动地与卡片进行通信。写入DATA

寄存器的bits数量由BCNTS寄存器制定,保持。

5。 BCNTR寄存器, 04H

BCNTR是英文Bit-Counter-for-Receiving的缩写,意为接收时的位计数器(寄存器)。

寄存器名

BCNTR

地址

04H 4

读(READ)

N/A

写(WRITE)

BIT-COUNT-RECEIVE

与BCNTS寄存器相反, BCNTR寄存器控制了MCU读取DATA寄存器的数据字节数目

例如,设置BCNTR=20H,则可向MCM的DATA寄存器读取的数据字节数目为4个(8位字

长的数据,因为总的bit数目=20H=32D),多余的数据,MCM将不予理会。

由于BCNTR寄存器是控制向DATA寄存器读取数据的字节数目,因此这一操作必须在读

DATA寄存器之前完成。使用2进制代码来操作。

BCNTR寄存器中的值将与实际接收到的数据字节相比较,如果有差别,则STACON寄

存器中的BE标志被设置。

6。 BAUDRATE 寄存器, 地址: 05H

BAUDRATE 意为数据传输到卡片上或卡片上的数据传到MCM时通信的位速率。虽然

BAUDRATE 寄存器的后四位相关与指定的位速率,但是实际有用于MIFARE 1卡的只是最

后一位。

寄存器名

BAUDRATE

地址

05H 5

读(READ)

N/A

写(WRITE)

-- -- -- -- 1 1 1 BR

BAUDRATE 寄存器的设置将直接影响着MCM与Mifare 1卡片之间的数据通信速率。

MCM中有一个时钟发生器。写数据至BAUDRATE 寄存器,可以控制 时钟发生器(CLOCK

GENERATOR)。以下是位速率的计算公式:

t

bit

=

(BRX+2) X 8

[μs]

13.56

如果BRX = 0x0Eh则有:

t

bit

= 9.44 (us) = 1 / 105.94 kHz

上述BRX = 0x0Eh 为对BAUDRATE 寄存器进行设置的推荐值(对于MIFRARE 1卡

来说BRX(大约)值为0X0Eh,即初始化时BAUDRATE 寄存器应设置为: ”0000 1110b”=0Eh。

7。 TOC 寄存器, 地址: 06H

TOC是Time Out Counter ((定)时间溢出记数器 ) 的缩写。

26

寄存器名

TOC

地址

06H 6

读(READ)

N/A

写(WRITE)

TIMEOUT-COUNTER

对TOC 寄存器的设置即对定时时间的控制。写数据至TOC 寄存器,可以控制 定时

溢出记数器。

定时溢出的计算公式如下:

t

TO

=

10. 128

X TOC [us] = 100 x TOC

[us]

13. 56

如果用0x00 H 写给TOC,即TOC = 0x00 H ,则将关闭定时溢出记数器,即t

TO

= 0。

TOC 寄存器中的值 必须在MCM与MIFARE 1卡片通信时被设置;

TOC 寄存器常用的设置值为:0AH,即定时t

TO

= 100 X 10 us = 1 ms。

TOC 寄存器中的值 (非零值) 将在 没有通信时,永久地被递减。因此,在没有通信时,

或通信刚结束时,TOC 寄存器中的值必须被设置,即设置TOC = 0x00H. 例如: 在FIFO

中的数据有效时,就必须这样做。否则将影响STACON寄存器的TE出错标志。

如果有溢出出现,则TE标志被设置,DV标志被激活。

在完成写数据到DATA寄存器,定时溢出记数器 应该经常被初始化。但有个例外,即

在认证操作(AUTHENCATION)的开始时段,定时溢出记数器 应该在存取“KEYSTACON”

和“KEYADDR”寄存器 之后,在存取DATA寄存器之前 被初始化。

一般地在读取(Read)和保存(save)了STACON寄存器中的数据之后 定时溢出记数

器必须被关闭。

8.

MODE寄存器, 地址: 07H

MODE 意为在与卡片数据相互往来时的数据编码模式 (MODE of DATA coding)。

MODE寄存器的设置控制了MCM在与卡片数据相互通信时的数据编码模式.

MODE寄存器的每一位都与数据通信模式有关,但在使用MIFARE 1卡时,只有最后

3 位(BITS)最为关联。

寄存器名

MODE

地址

07H 7

读(READ)

N/A

写(WRITE)

1 1 0 0 0 P2 P1 P0

写数据至MODE 寄存器,可以控制 接收器和发生器。

以下是通信时的脉冲长度(pause length)(宽度)的计算公式:

pause

=

t

(13+P)/6.78

[us]

MODE 寄存器 中的P2 ,P1 ,及P0位决定了在NPAUSE0 和NPAUSE1引脚上的

各自的脉冲宽度。脉冲宽度的可变范围在 2 ~ 3 us 之间。

在使用MIFARE卡时,P2 ,P1 ,及P0位应被设置为 111 b 或110 b。

这里必须提醒读者注意的是,当我们使用CM200(Philiphs产品)时与使用

SB201(UniVision Engineering Limited联视工程有限公司的产品)时,MODE 寄存器的设置值

将不一样。

使用CM200(Philiphs产品)时, MODE 寄存器的设置值应为: “1100 0110b”,即C6H,但在

使用SB201(UniVision Engineering Limited联视工程有限公司的产品)时, MODE 寄存器的设

置值应为: “1101 0110b”,即D6H。这是两个产品唯一存在的硬件上的不兼容,导致软件的设置

值不同。 否则由于数据通信时的数据编码模式不相同,MCM将不能正常工作,不能读/写

Mifare 1卡片。在实际应用中已有此经验教训。

27

9. CRCDATA 寄存器, 地址: 08H

被计算CRC的数据必须被写入CRCDATA寄存器中。 计算后的CRC必须从

CRCDATA 寄存器中读出。

寄存器名

CRCDATA

地址

08H 8

读(READ)

CRC-BYTE-READ

写(WRITE)

CRC-BYTE-WRITE

在写入一个BYTE(字节)到CRCDATA 寄存器后,计算将开始。计算完成后,STACON

寄存器的CV标志被设置。当我们要写下一个字节到CRCDATA 寄存器之前,或在读取

CRCDATA寄存器以得到CRC之前,或在检查CZ标志之前,都必须先读取CV标志,检

查CV标志。

10.

CRCSTACON寄存器, 地址: 09H

CRCSTACON寄存器是指CRC处理器状态和控制寄存器。

寄存器名

CRCSTACON

地址

09H 9

读(READ)

CV -- -- -- -- -- --

CZ

写(WRITE)

C8 -- -- -- -- -- --

CR

写数据到CRCSTACON寄存器中,即执行对CRC-处理器的控制。

Bit Name

位名

C8

CRE

Name名称

8-bit-CRC

(8位CRC)

CRE

(CRC-复位)

Function功能

“0”---- 选择16位CRC处理器

“1” ---- 选择8 位CRC处理器

“0” ---- 无效

“1” ---- 复位CRC处理器

读取CRCSTACON寄存器后 用户将知道CRC-处理器数据传输的状态。当标志被设置

为“1”时,标志被激活。

Bit Name

位名

CR

CZ

Name名称

CRC-Ready

(CRC-准备)

CRC-Zero

(CRC-零)

Function功能

最后一个字节(BYTE)被处理完成

CRC-寄存器内容=00H,意味着CRC-校验OK

8-bit CRC寄存器值的多项式计算公式为 : X

7

+ X

5

+X

4

+X

3

+1 一般其初值 = 0xE3H

16-bit CRC寄存器值 多项式计算公式为 : X

15

+ X

10

+X

3

+1 一般其初值 = 0x31E3 H

读取16-bit CRC模式时的CRC寄存器 需要2个读周期。第一个读到的字节是16-bit

CRC中的低字节, 第二个读到的字节是16-bit CRC中的低字节。

11.

KEYDATA 寄存器, 地址: 0A H (10)

被存储在MCM中RAM的密码数据必须先被写入KEYDATA 寄存器。

寄存器名

KEYDATA

地址

0AH 10

读(READ)

N/A

写(WRITE)

KEY-BYTE-WRITE

为了能够存取MCM内部RAM中的密码,密码的存放地址必须首先在KEYSTACON

寄存器和KEYADDR寄存器两者中指定。

在做存放密码操作或做密码验证操作之前,首先必须对KEYSTACON 寄存器进行设

28

置; 在密码被准确无误地存进RAM之前,相关的传输密码(Transport KEY)Tkey必须被写入

KEYDATA-寄存器中。传输密码TKey和写入RAM中的密码都是6字节(BYTE)长,连

续被写入KEYDATA 寄存器中。但是,在“AUTHENCATION”(认证)操作时,这一寄

存器不必使用。

12. KEYSTACON – 寄存器 地址:0BH(11)

KEYSTACON 寄存器是指(密码)KEY状态和(密码)KEY控制寄存器。

寄存器名

KEYSTACON

地址

0BH 11

读(READ)

写(WRITE)

AL 0 X X X X KS1

KS0

写入 数据到KEYSTACON – 寄存器进行设置,将确定存取RAM中的密码(KEY)或传

输密码(KEY)的密码地址的一部分。

存放在MCM的RAM中的密码对程序员来说是透明的,不得而知的。因此也是不可读的。

(这里指的是密码本身及存放密码的地址不可读)。

Bit Name

位名

Name名称

Authenticate

AL (认证)

/Load Keys

Key-Set

密码集

Function功能

“0” ---- 准备提取密码

“1” ---- 准备认证

“00” ---- 选择RAM,KEY-set 0

KS1,KS0

“01” ---- 选择RAM,KEY-set 1

“10” ---- 选择RAM,KEY-set 2

“11” ---- 选择传输密码(Transport KEY)

提取密码: AL=0, 表明将要提取密码;

密码认证(Authentication): AL=1, 表明将要认证 “AUTHENTICATION” 操作。

RAM中的密码 和传输密码TKey 二者中允许被选择。

注意:KEYSTACON – 寄存器中的值必须根据所使用的“AUTHENTICATION”命令(60 hex

或61 hex指令代码)来确定。

此外,密码地址通过写数据到KEYSTACON 和KEYADDR寄存器之后而在MCM中

被确定,之后,通过写“命令”(Command)和写“地址”(address)到DATA寄存器之后,

认证密码“AUTHENTICATION” 操作便开始启动执行。

13. KEYADDR-寄存器, 地址:0C H (12)

KEYADDR寄存器将存放RAM(密码)KEY和 传输(密码)KEY各自的 密码

地址的一部分。

寄存器名

KEYADDR

地址

0CH 12

读(READ)

N/A

写(WRITE)

AL AB A5 A4 A3 A2 A1 A0

写入 数据到KEYADDR– 寄存器 将确定存取MCM的RAM中的密码(KEY)或传输

密码(KEY)的密码地址的一部分。

程序员不可能知道密码实际存放在MCM的RAM中的地址,否则密码便没有秘密可言了。

Bit Name Name名称

29

Function功能

位名

Authenticate

AL (认证)

/Load KEYs

AB

A5 … A0

KEY’A’ 或

KEY ‘B’

KEY address

“0” ---- 准备提取密码

“1” ---- 准备认证

“0” ---- 使用密码‘A’

“1” ---- 使用密码‘B’

密码地址A5至A0 指定密码的sector

提取密码: AL=0, 表明将要提取密码;

认证Authentication: AL=1, 表明将要认证 “AUTHENTICATION” 操作。

14.

RCODE –寄存器,地址:0D H (14)

RCODE –寄存器 用于代码接收。

寄存器名

RCODE

地址

0EH 14

读(READ)

N/A

写(WRITE)

X X X X 0 0 RC1 RC2

写入 数据到RCODE 寄存器对其进行设置,将使接收器的译码器参数化。

Bit Name

位名

RC1,RC0

Name名称 Function功能

KOMP引脚上用于引起中断(“HIGH”高电

平)的必不可少的(脉冲)边界数目。

Receive(接收)

RCODE –寄存器中的值一般应设置为0X02 H。 然而,在有些环境中,设置为0x03 H

时,对Mifare 1卡片的操作距离可能会稍为好(远)一点。

三. MCM硬件初始化

为了与MIFARE 1卡通信,必须对MCM各硬件寄存器进行初始化设置。

寄存器

STACON

ENABLE

BAUDRATE

MODE

RCODE

地址

1

2

5

7

13

初始化设置(16进制值)

0x0C

0x4C

0xC0

0x0E

0xC6或0xD6

0x02

一般地,应该先对MCM执行软复位(soft-reset),然后对MCM进行初始化设置,再进行

数据通信。

在任何数据通信之前必须先执行“REQUEST”命令, 以和卡片建立第一步的通信联络。

以下是MCM各硬件寄存器在上电时或在软件复位时的复位表。

MCM 复 位 表

寄存器 地址 POR硬件上电复位 SOR软复位 初始化设置

30

DATA

STACON

ENABLE

BCNTS

BCNTR

BAUDRATE

TOC

MODE

CRCDATA

CRCSTACON

KEYDATA

KEYSTACON

KEYADDR

RCODE

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

xxxx xxxx

00nn 0100

0000 nnnn

0000 0000

0000 0000

Nnnn 1111

0000 0000

0000 0000

xxxx xxxx

xxxx xxxx

xxxx xxxx

00nn nnxx

1000 0000

nnnn nnnn

Nnnn 0011

nnnn nnnn

uuuu uuuu

0unn uu00

0000 nnnn

uuuu uuuu

uuuu uuuu

Nnnn uuuu

uuuu uuuu

uuuu uuuu

xxxx xxxx

xxxx xxxx

uuuu uuuu

00nn nnuu

1uuu uuuu

nnnn nnnn

Nnnn uuuu

nnnn nnnn

0x0C/0x4C

0xC0

0x0E

0xC6/0xD6

0x02

说明:上表中的POR和SOR两列中: X :表示此位不必关注;

N :表示此位没有使用; U :表示此位不变。

四. MCM的硬件内核包括了如下几大部分接口电路:

1.

与MCU(微处理机CPU)接口电路

2.

RF模块接口电路

3.

与天线射频接口电路

4.

与电源接口电路

(一)

MCM与MCU(微处理机CPU)接口电路

MCM可以由标准的MCU接口信号来控制。这些标准的控制信号可以控制MCM的

ASIC进行工作。其间使用了标准的微控制器和微处理机通信协议。

MCM可由外部MCU发出特殊命令来启动运行。任何情况下,MCM都可以由对地址

的选择来启动工作。例如,MCM的RST引脚,-CS引脚和CS引脚的信号设置等。

对MCM内部存储器的存取,意味着将激活-CS和CS信号,以及对地址为00H~~0FH

的寄存器的合适的设置。

通过读特殊I/O地址的信息,可以得到MCM的状态信息。采用不同的MCU及其连接

方法,将会有不同的硬件信号时序及数据信息流信息等。

CS

-CS

-RD

MCU

-WR

MODE

USEALE

ALE

31

MCM

-IRQ

A(0-3)

D(0-7)

(二)

RF模块接口电路

MCM与RF模块的接口一般有如下几个引脚来实现:

通过KOMP0与NPAUSE0可与RF0模块相连接;

通过KOMP1与NPAUSE1可与RF1模块相连接;(仅有MCM500有RF1)

通过RXKOMP与TXNPAUSE可与其他的级联MCM模块相连接;

PAUSE0

KOMP0

RF0

线

模块

MCM

RF1模块(仅

RF1

MCM500有)

线

PAUSE1

模块

KOMP1

(三)

与天线射频接口电路

有二个引脚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。

32

第三章 MCM 软件编程指令

(一)

. 指令集

MCM能执行有限的一些指令,并将这些指令传输到MIFARE 1卡片上。

每一个指令包含7个独立的步骤,程序员在编程执行这些指令时必须小心每一个正确的

(步骤)时序,这些步骤在不同的MCM指令执行中而不一样。以下是MCM通信基本指令

集。

通信基本指令集

MCU《==》MCM《===》MIFARE 1卡片

指 令

Answer to Request

(Request的应答)

Request std

Request all

AntiCollision

(防重叠)

Select Tag

(选卡片)

Authentication

(认证)

Auth_1a

Auth_1b

Load KEY(存取密码)

Read (读)

Write (写)

Increment (增值)

Decrement (减值)

Restore (重储)

Transfer (传送)

Halt (停机)

指令代码(hex)

26

52

93

93

60

61

/

30

A0

C1

C0

C2

B0

50

AE

TE, BE, PE,CE

TE, BE

TE, BE

TE, BE

TE, BE

TE, BE

TE, BE

Data

/

/

/

/

/

/

TE, BE, PE,CE /

TE, BE

TE, BE, PE,CE

Serial Number

Size

TE,BE Tagtype

相关的出错标志 接收卡片上数据

指令代码表

在与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卡片之间的传输已经完成,并且主处理机可能已经从

33

MCM中收到数据。DV标志保持“1”的持续时间,出错标志亦将保持有效。

在有效的数据被存储进FIFO寄存器时,DV标志将持续保持。在向MCM写数据时的写

指令周期内,DV标志将被清除。DV标志也可能会被软复位(soft-reset)清除。

有时,为了确认有些操作的成功完成,必须使用定时溢出(TE)标志。

1 。 “Answer to Request” (“Request”应答)指令

指 令

Answer to Request

(Request的应答)

Request std

Request all

指令代码(hex)

26

52

TE,BE Tagtype

相关的出错标志 接收卡片上数据

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),等等。

8.

“AntiCollision” 防重叠

指 令

AntiCollision

(防重叠)

指令代码(hex)

93

相关的出错标志

TE, BE

接收卡片上数据

Serial Number

如果有多于一张的Mifare 1卡片在MCM之天线的有效的工作范围(距离)内 ,必须

34

使用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” 选择卡片操作

指 令

Select Tag

(选卡片)

指令代码(hex)

93

相关的出错标志

TE, BE, PE,CE

接收卡片上数据

Size

在一个成功的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” 认证操作

指 令

Authentication

(认证)

Auth_1a

Auth_1b

指令代码(hex)

60

61

35

相关的出错标志 接收卡片上数据

TE, BE, PE,CE /

在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://

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

信号。

读者如果已完全理解,读通“门禁控制系统”应用程序的话,完全可在程序中适当的位

置对LED3或喇叭(蜂鸣器)进行任意的程序设置。

电源输入保护电路:在DEMO电路中,加入了简单的电源保护电路。即在电源的输入

端加入一个反向二极管,当电源极性接反时,将输入的电源短路,而不会使DEMO电路损

坏。

6.

其他电路

通信电路:在新版本的DEMO电路中,笔者已经将RS232的通信电路连接上。以利于

用上位PC来具体地控制读写器,并能编制用户界面良好的应用软件,等等。

为了方便读者对于实际应用中不同的通信方式的要求,例如要求长线(长距离)方式(例

如RS422/485等),笔者业已设计完成相应的“全双工RS232《==》RS422/485通信(双向)

转接设备”。该转接设备非常轻巧,低功耗,成本很低,非常适合于各种不同应用类型的计

算机与应用设备之间的转接。例如大楼中的门禁系统中各读写设备与上位计算机之间的长线

方式的通信就应采用这种转接设备。其长线驱动可达1200米以上,且稳定可靠。传统的

RS232通信至多不超过20米。(注:关于“全双工RS232《==》RS422/485通信(双向)转

接设备”的介绍,笔者将会在另外文章中将做详细介绍。)

LCD显示电路:轻巧,低功耗的非接触式卡片读写器已越来越受到欢迎。因此大电流

显示的LED将被LCD显示所取代。笔者在新版本的DEMO电路中,已经将LCD应用于读

写设备中,且为图形方式点阵大屏幕显示。等等 。

二.

DEMO电路的 软件 应用开发

DEMO电路的 软件 应用开发的目标是:主要根据所设计的DEMO硬件电路而进行第

一步,最低层的面向微处理机MCU的应用程序的开发。

由于在DEMO电路中笔者选用的MCU为完全兼容与MCS-51系列微处理机的ATMEL

公司的AT89C52,因此,笔者将重点介绍MCS-51系列的面向硬件操作的最低层的汇编语

言的DEMO电路的应用程序的开发。

应用程序的开发将主要分为两大部分,即对MCM的应用程序的开发及对读写器的其他

电路的应用程序的开发。

程序开发的方式将主要建立一系列的汇编语言函数子程序以供主控程序的随时调用。即

对MCM模块或读写器的其他电路分别编制汇编语言函数子程序。

(一). 对MCM200(SB201)操作指令的程序设计和开发

对MCM指令的说明:

MCU对MCM的控制是以MCU发出MCM的指令来达到的。MCU对MCM的控制事

实上也就是对 Mifare 1 非接触式IC射频卡的控制。

MCM的指令主要有这样一些:Request std, Request all, Anticollision, Select, Load_key,

Authentication(Auth_1a,Auth_1b), Read, Write, Increment, Decrement, Restore, Transfer, Halt

等等。其中比较重要的是前8条指令,以及Halt 停机指令等。因为它们可以完成MCU对

Mifare 1 非接触式IC射频卡的很多应用场合的控制。例如 门禁控制系统(Door Access

System),高速公路不停车收费系统,停车场收费管理系统,公交/地铁非接触式IC智能射频

卡的“刷卡”读写器(收费管理系统),机关/企业内部考勤管理系统,医疗保险管理系统,

出租车收费管理系统,银行服务“一卡通”等等。

41

MCU对MCM的某一指令操作不是简单的一条指令所能完成的,必须有一个程序的序

列来完成,其中有对MCM硬件内核寄存器的设置以及汇编语言软件上的判断和设置。例如

对卡片进行读(READ)操作,则程序员必须对MCM内部的BCNTR寄存器,BCNTS寄存

器,TOC寄存器,STACON寄存器等进行设置,同时还必须对地址进行设置,对每一个状

态进行判别等等,对最终读得的数据还必须进行校验等等。就连一条最简单的停机(Halt)

指令也必须首先对MCM内部的诸多寄存器进行设置,等等。不同的指令将设置不同的MCM

内部寄存器以及应有不同的汇编语言程序序列。

1. 对MCM200(SB201)“Request std”和“ Request all”指令的汇编语言应用程序的

设计

功能:调用该汇编语言子程序,将执行MCM “Request std”或“ Request all”指令操

作,读取Mifare 1 非接触式IC射频卡的TAGTYPE字节,建立与卡片的第一步必不可少的

通信联系。

程序说明:

1. 在以下的汇编语言程序中,如果要调用该MCM指令操作,则应首先设置MCU的

R2的值: R2=”00H” 执行Request std操作;

R2=”01H” 执行Request all操作;

在该指令程序中用到了一些其他的子程序分别为:

D500US: 为500us的延时子程序;

H_SEND_TO_BUF01:

DEMO电路中,将A寄存器中的数据送显示电路中的高四位中的第0,1位,以

准备显示,地址为34H,35H;

H_SEND_TO_BUF23:

DEMO电路中,将A寄存器中的数据送显示电路中的高四位中的第2,3位,以

准备显示,地址为32H,33H;

SEND_TO_BUF01:

DEMO电路中,将A寄存器中的数据送显示电路中的低四位中的第0,1位,以

准备显示,地址为39H,3AH;

SEND_TO_BUF23:

DEMO电路中,将A寄存器中的数据送显示电路中的低四位中的第2,3位,

以准备显示,地址为37H,38H;

DISPLAY:

DEMO电路中,显示8位数据中的低4位数据值。即将存储在37H至3AH显

示内存中的低四位数据显示在LED上。

H_DISPLAY:

DEMO电路中,显示8位数据中的高4位数据值。即将存储在31H至34H显

示内存中的高四位数据显示在LED上。

等等。

2.在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,

这些可能是用于主控程序或是调试而用。特加以说明。

程序清单如下:

;======================== MCM REQUEST OPERATION ===================

request:

42

REPEAT_RQT:

_1_STACON: ;设置MCM中的STACON寄存器为 : 0CH

MOV A,#0CH ;设置A寄存器 = 0CH

MOV R0,#01H ;STACON 寄存器地址为01H

MOVX @R0,A ;将A寄存器内容送入STACON寄存器中

_2_BAUDRATE: ;设置MCM中的BAUDRATE寄存器为:0EH

MOV A,#0EH

MOV R0,#05H

MOVX @R0,A

_3_ENABLE: ;设置MCM中的ENABLE寄存器为:0C0H

MOV A,#0C0H

MOV R0,#02H

MOVX @R0,A

_4_MODE: ;设置MCM中的MODE寄存器为:0C6H

MOV A,#0D6H ;(如果采用SB201,则MODE寄存器应为:0D6H)

MOV R0,#07H

MOVX @R0,A

_5_STACON_AGAIN:

MOV A,#0CH

MOV R0,#01H

MOVX @R0,A

_6_RCODE:

MOV A,#02H

MOV R0,#0EH

MOVX @R0,A

_7_BCNTS:

MOV A,#07H

MOV R0,#03H

MOVX @R0,A

_8_BCNTR:

MOV A,#10H

MOV R0,#04H

MOVX @R0,A

;----------------------------------------------------------------

JUDG_RQT_STD_OR_ALL: ;根据R2值, 判断是执行Request std操作

MOV A,R2 ;还是Request all操作

XRL A,#01H

JNZ RQT_STD

;----------------------------------------------------------------

RQT_ALL:

MOV A,#52H

AJMP _11_RQT_MCM

RQT_STD:

MOV A,#26H

43

_11_RQT_MCM:

MOV R0,#00H

MOVX @R0,A

_12_TOC:

MOV A, #0AH

MOV R0,#06H

MOVX @R0,A ;TOC = 0AH

;----------------------------------------------------------------

RD_STACON:

MOV R0,#01H

MOVX A,@R0 ;READ STACON()

;================================================================

JUDG_DV_BIT:

JNB ACC.7,RD_STACON ; RD_STACON

;================================================================

mov r7,a ;protect A = stacon()

;================================================================

MOV A, #00H

MOV R0,#06H

MOVX @R0,A ;TOC=00H

;================================================================

mov a,r7 ;return stacon() value to A

;================= ;for "BE" and "TE" error-flag

ACALL H_SEND_TO_BUF23 ;DISPLAY R7XX ---> R7 = STACON()

;================================================================

_13_JUDG_ERR:

JB ACC.6,TE_ERR ; TE_ERR

JB ACC.3,BE_ERR ; BE_ERR

;================================================================

MOV R0,#00H ;READ_TAGTYPE_0

MOVX A,@R0

MOV 45H,A

ACALL SEND_TO_BUF01 ;SEND TAGTYPE 0 TO DISP_BUF_LOW

;----------------------------------------------------------------

mov r0,#00h

MOVX A,@R0 ;READ_TAGTYPE_1

MOV 46H,A

ACALL SEND_TO_BUF23 ;SEND TAGETYPE 1 TO DISP_BUF_HIGH

;----------------------------------------------------------------

MOV B,#00H ;"00H" is "OK" flag

;================================================================

mov a,b

44

ACALL H_SEND_TO_BUF01 ;XXBB

;================================================================

SETB P2.6 ;"OK" LAMP NOW WORKING

mov a,#00h

ACALL SPK_ON ;if "ok" then spk on

LJMP request_exit ;exit and RET

;----------------------------------------------------------------

TE_ERR: MOV B,#01 ;"TE" error flag is "01H"

MOV R6,B

LJMP RQT_EXIT

;----------------------------------------------------------------

BE_ERR: MOV R7,#0AH ;READY TO DELAY 500us

ACALL D500US ;延时500us

MOV B,#0BH ;"BE" error flag is "0BH"

; MOV A,#88H

; ACALL SEND_TO_BUF01

; ACALL SEND_TO_BUF23

;----------------------------------------------------------------

RQT_EXIT:

LJMP REPEAT_RQT

;----------------------------------------------------------------

request_exit:

RET

;==================End of MCM Request Operation =======================

2. 对MCM200(SB201)“AntiCollision”(防卡片重叠) 指令的汇编语言应用程序的

设计

功能:调用该汇编语言子程序,将执行MCM “AntiCollision”(防卡片重叠) 指令操作。

如果卡片读写器的天线之有效工作距离内有多张重叠的Mifare 1 非接触式IC射频卡,则该

指令将帮助程序员选择其中指定的一张卡片进行操作。“AntiCollision”(防卡片重叠) 指令

操作将读取卡片的系列号(SERIAL NUMBER)字节。

程序说明:

1.)在以下的汇编语言程序中,用到了一些其他的子程序(和上述的“Request std和

Request all”指令操作中的相同),分别为:

D500US: 为500us的延时子程序;

H_SEND_TO_BUF01:(同上)

H_SEND_TO_BUF23:(同上)

SEND_TO_BUF01:(同上)

SEND_TO_BUF23:(同上)

DISPLAY:(同上)

H_DISPLAY:(同上)

45

2.)在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,

这些可能是用于主控程序或是调试而用。特加以说明。等等。

3.)在本汇编语言子程序中,校验,计算卡片序列号的方法采用了相邻两个字节相互异

或,得出的结果与下一个字节再异或这样一种方法。前四个字节异或的结果与第5个字节应

该相同,即与第5个字节异或的结果应为“00H”,否则MCU读到的卡片的序列号有错。因

此对于我们来说,卡片的序列号前四个字节是有意义的,第5个字节仅仅用于校验之用。并

无实际意义。我们通常所说的序列号指的是前4个字节。并不包括第5个字节。这五个字节

被存储在卡片的第0扇区的第0块中,由卡片的生产商制定,固化,不得更改,且在世面上

流通的Mifare 1 S50系列的非接触式IC射频卡中,每一张卡片的序列号都不相同,都是唯

一的。

例如,某一张卡片的序列号为:007e0a42H,则计算异或方法如下:

00h异或7eh:(第一和第二字节异或)

0000 0000

0111 1110

---------------------------

第一次异或结果为: 0111 1110 为7eh;

将7eh与0ah相异或: 0111 1110

0000 1010

-------------------------------

第二次异或结果为: 0111 0100 为74h;

将74h与42h相异或: 0111 0100

0100 0010

-------------------------------

第三次异或结果为: 0011 0110 为36h;

这样前四个字节得到的异或结果为36H,如果读到的卡片上的序列号的第5个字节为

36H,则证明此次得到的卡片的序列号是有效的。如果读到的卡片上的序列号的第5个字节

不为36H,则证明此次得到的卡片的序列号是无效的。

第四次异或为: 将第三次异或结果36h与第5个字节相异或,如果第5个字节读到的值

为36H,则:

将36h与36h相异或: 0011 0110

0011 0110

-------------------------------

第四次异或结果为: 0000 0000 为00h

这样四次异或结果为00H,表明MCU读取的卡片序列号是有效的。具体的程序如下,

请读者仔细分析,定能理解上述关于卡片序列号的校验方法。

程序清单如下:

;======================== MCM ANTICOLLISION OPERTION ====================

anticollision:

ANTI_REPEAT:

MOV A, #10H

MOV R0,#03H

MOVX @R0,A ;BCNTS = 10H

MOV A, #0CH

46

SETB ACC.0 ;AC = "1"

MOV R0,#01H

MOVX @R0,A

MOV R7,#02H ;DELAY 1000US

ACALL D500US

MOV A, #93H

MOV R0,#00H

MOVX @R0,A ;DATA = 93H (ANTICOLLISION OPERATION CODE)

MOV A, #20H

MOV R0,#00H

MOVX @R0,A ;DATA = 20H

MOV A, #28H

MOV R0,#04H

MOVX @R0,A ;BCNTR = 28H

MOV A, #0AH

MOV R0,#06H

MOVX @R0,A ;TOC = 0AH

ANTI_RD_STACON:

MOV R0,#01H

MOVX A,@R0 ;READ: STACON ==> A

JNB ACC.7,ANTI_RD_STACON ;IF DV = "1"? NO,IT WILL READ AGAIN

;--------------------- NOW DV="1", JUDG OTHER FLAGS---------------------

MOV A, #00H

MOV R0,#06H

MOVX @R0,A ;TOC = 00H

JB ACC.6, ANTI_TE_ERR ;TE ERR

JB ACC.3, ANTI_BE_ERR ;BE ERR

;----------------NOW NO ERRORS OCCUR,CAN READ SNR ----------------

MOV R7,#04H ;R7 IS A COUNTER,FOR READING 4-BYTE SERIAL NUMBER

MOV B,#00H

MOV R1,#40H

MOV R0,#00H

ANTI_LOOP:

MOVX A,@R0

MOV @R1,A ;STORE SNR(1)--(4) IN 40H,41H,42H,43H

XRL B,A ;CACULATE

INC R1

DJNZ R7,ANTI_LOOP

MOVX A,@R0 ;READ 5th CHK_SUM_VALUE

XRL A,B ;CACULATE

JNZ ANTI_CHK_ERR_EXIT ;If "Z"="0"? If Not,CHK_SUM_VALUE ERROR

;------------------------- NOW THE SNR IS VALID ----------------------------

_OK:

;MOV B,#00H ;IF SNR "OK",THEN (B) = 00H <----RETURN_VALUE

47

MOV R1,#40H ;(40H) ==> SNR(1)

MOV A,@R1

ACALL SEND_TO_BUF01 ;SEND SNR(1) TO DISP_BUF_LOW

INC R1 ;(41H) ==> SNR(2)

MOV A,@R1

ACALL SEND_TO_BUF23 ;SEND SNR(2) TO DISP_BUF_HIGH

INC R1 ;(42H) ==> SNR(3)

MOV A,@R1

ACALL H_SEND_TO_BUF01 ;SEND SNR(3) TO H_DISP_BUF_LOW

INC R1 ;(43H) ==> SNR(4)

MOV A,@R1

ACALL H_SEND_TO_BUF23 ;SEND SNR(4) TO H_DISP_BUF_HIGH

SETB P2.6 ;"OK" LAMP NOW WORKING P2.3

ACALL SPK_ON ;if "ok" then spk on

MOV B,#00H ;IF SNR "OK",THEN (B) = 00H <----RETURN_VALUE

AJMP ANTI_OK_EXIT

;----------------------ERROR PROCESS-------------------------------

ANTI_TE_ERR:

MOV B,#01H ;IF "TE_ERR", THEN (B) = 01H

AJMP ANTI_ERR_EXIT

ANTI_BE_ERR:

MOV B,#0AH ;IF "BE_ERR", THEN (B) = 01H

AJMP ANTI_ERR_EXIT

;------------------------------ exit process -----------------------------

ANTI_CHK_ERR_EXIT:

MOV B,#08H

MOV A,B

;ACALL H_SEND_TO_BUF23 ;SEND RETURN_ERR_VALUE TO DISP_BUF_HIGH

ANTI_ERR_EXIT:

ANTI_OK_EXIT:

RET

;-------------------- End of MCM AntiCollision Operation -----------------

3.对MCM200(SB201)“Select”(选卡片) 指令的汇编语言应用程序的设计

功能:调用该汇编语言子程序,将执行MCM “Select”(选卡片) 指令操作。如果卡片

读写器的天线之有效工作距离内有多张重叠的Mifare 1 非接触式IC射频卡,则该指令在程

序员成功完成“AntiCollision”操作之后,将帮助程序员正式选择其中指定的一张卡片进行

操作(包括密码存取,密码认证,卡片上指定扇区的读写,等等。)“Select”(选卡片) 指令

操作将读取卡片的SIZE字节。

程序说明:

1.)在以下的汇编语言程序中,用到了一些其他的子程序(和上述的“Request std和

48

Request all”指令操作中的相同),分别为:

D500US: (与上述功能相同);

H_SEND_TO_BUF01:(与上述功能相同);

H_SEND_TO_BUF23:(与上述功能相同);

SEND_TO_BUF01:(与上述功能相同);

SEND_TO_BUF23:(与上述功能相同);

DISPLAY:(与上述功能相同);

H_DISPLAY:(与上述功能相同);

等等。

2.)在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,

这些可能是用于主控程序或是调试而用。特加以说明。

程序清单如下:

;====================MCM SELECT OPERATION=====================

select:

;SETB PSW.3

;SETB PSW.4

MOV A,#0CH

MOV R0,#01H

MOVX @R0,A ;STACON() = 0CH

MOV A,#0F0H

MOV R0,#02H

MOVX @R0,A ;ENABLE() = F0H

MOV A,#38H

MOV R0,#03H

MOVX @R0,A ;BCNTS() = 38H =56 D

MOV A,#08H

MOV R0,#04H

MOVX @R0,A ;BCNTR() = 08H <--RECEIVE ONE BYTE:"SIZE"BYTE

MOV A,#93H

MOV R0,#00H

MOVX @R0,A ;DATA() = 93H -->"SELECT" INSTRACTION CODE

MOV A,#70H

MOV R0,#00H

MOVX @R0,A ;IMPORTANT: DATA()=70H--BITCOUNT=70Hbits

;-----------------------------------------------------------------------

MOV R7,#04H ;R7 IS A COUNTER,FOR WRITING 04H BYTES TO DATA

MOV B,#00H

MOV R0,#00H

MOV R1,#40H ;THE FIRST ADDRESS OF SNR. 40H---43H

SELECT_WRT_LOOP:

MOV A,@R1

49

MOVX @R0,A

XRL B,A

INC R1

DJNZ R7, SELECT_WRT_LOOP

MOV A,B

MOVX @R0,A ;SEND THE 5th CHK_SUM_VALUE

MOV A,#0AH

MOV R0,#06H

MOVX @R0,A ;TOC() = 0AH

SEL_RD_STACON_AGAIN:

MOV R0,#01H

MOVX A,@R0 ;READ STACON() ==> A

MOV B,A

JNB ACC.7, SEL_RD_STACON_AGAIN ;IF "DV"="1"? IF NOT,REPEAT READ

MOV B,A

;------------- NOW DV="1", DATA VALID ----------------------

MOV A,#00H

MOV R0,#06H

MOVX @R0,A ;TOC() = 00H

;------------- NOW JUDGE ANY DATA ERRORS --------------------

MOV A,B

JB ACC.6, SEL_TE_ERR ;TE ERR

JB ACC.5, SEL_PE_ERR ;PE ERR

JB ACC.3, SEL_BE_ERR ;BE ERR

JB ACC.4, SEL_CE_ERR ;CE ERR

;------------- NOW NO ERRORS,READING CARD SIZE -----------------

MOV R0,#00H

MOVX A, @R0 ;READ SIZE: DATA() ==> A

MOV 44H,A ;STORE "SIZE" IN 44H

ACALL SEND_TO_BUF01 ;SEND "SIZE" TO DISP_BUF_LOW

SETB P2.6 ;"OK" LAMP NOW WORKING P2.3

ACALL SPK_ON ;if "ok" then spk on

MOV B,#00H ;SELECT OPERATION'S "OK" RETURN_VALUE=00H

MOV A,B ;READY FOR DISSPLAY IN DISP_BUF_HIGH(23)

LJMP SEL_OK_EXIT ;IF "OK", EXIT SELECT OPERATION

;-------------------ERRORS PROCESS-------------------------------

SEL_TE_ERR:

MOV B,#01H

LJMP SEL_ERR_EXIT

SEL_PE_ERR:

MOV B,#05H

LJMP SEL_ERR_EXIT

SEL_CE_ERR:

50

MOV B,#02H

LJMP SEL_ERR_EXIT

SEL_BE_ERR:

MOV R7,#0AH

ACALL D500US

MOV B,#0BH

LJMP SEL_ERR_EXIT

;----------------------EXIT------------------------

SEL_ERR_EXIT:

MOV A,B

SEL_OK_EXIT:

ACALL SEND_TO_BUF23 ;SEND ERR_RETURN_VALE TO DISP_BUF_HIGH

RET

;------------------------ End of MCM AntiCollision Operation -----------------

通过以上对MCM的几个指令的软件设计,读者应该能有较大的信心,将MCM其他的

一些指令也能设计成功。以供主控程序随时调用。

51

(二). 对MCM200(SB201)组成的DEMO电路的主控应用程序设计和开发

1.硬件电路请参照所附的DEMO电路图纸

2.软件清单如下

程序清单如下:

;====================================================================

; WRITTEN BY ROCKY, OCT'1999

;====================================================================

ORG 0000H

start:

LJMP MAIN

NOP

NOP

;--------------------------

;ORG 001BH

;LJMP 0500H

;--------------------------

ORG 0080H

MAIN:

MOV SP,#0E1H

NOP

CLR EA ;CLOSE CPU INT

CLR P2.5 ;RESET MCM (-RST="0")

SETB P2.4 ;RESET MCM (-CS ="1")

NOP

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

NOP

CLR P2.6 ;CLOSE "OK" LAMP

setb p2.0 ;disenable KB function

mov p1,#11110000b ;init P1 port:P1.0~~P1.3-->out (line)

; P1.4~~P1.7-->in (colum)

SETB P2.5 ;RESET MCM (-RST="1")

CLR P2.4 ;SELECT MCM (-CS="0")

ACALL D500MS

MOV A,#80H ;SOFTWARE_RESET MCM

MOV R0,#01H

MOVX @R0,A

ACALL D500MS

ACALL SPK_ON ;SPEAK ON

;MOV 21H,#01H ;THE kb_TEST_CHAR

52

KB_LOOKING:

LCALL KB_SCAN

ACALL DISPLAY

ACALL H_DISPLAY

CLR P2.6 ;CLOSE "OK" LAMP P2.3

AJMP KB_LOOKING

KB_ALL_EXIT:

MOV R2,#00H ;SET RQT_STD

SETB P2.5 ;RESET: MCM ON (-RST="1") P1.4

CLR P2.4 ;SELECT MCM ON (-CS="0") P1.5

;------------------------------------

REPEAT:

SETB P2.5 ;RESET: MCM ON (-RST="1")P1.4

CLR P2.4 ;SELECT MCM ON (-CS="0") P1.5

;==================================================

ACALL REQUEST ;MCM REQUEST OPERATION

;==================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500MS

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;=========================================================

ACALL ANTICOLLISION ;MCM ANTICOLLISION OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500MS

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;=========================================================

ACALL SELECT ;MCM SELECT OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500MS

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

53

;+++++++++++++++++++++ set up register/ram for load_key()++++++++++++++++++

mov 7FH,#0ABH

MOV 7EH, #00H ;(7EH) = 00H-->SELECT KEYSET0 (KS1=0;KS0=0)

MOV 7DH,#02H ;(7DH): 1)SELECT KEYA or KEYB

; 2)SELECT sector_ADDRESS :0-15

MOV 7CH,#60H ;(7CH) = 47H-->TKey(1) FIRST ADDRESS

;=========================================================

ACALL LOAD_KEY ;MCM LOAD_KEY OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL d500ms

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;++++++++++++++++++ set up register/ram for Authenticate() ++++++++++++++++++

;mov 7fh,#04h

;7EH:for future use!

MOV 7EH, #80H ;(7EH) = 80H-->SELECT KEYSET0 (KS1=0;KS0=0)

MOV 7DH,#82H ;(7DH): 1)SELECT KEYA or KEYB (for auth_)

; 2)SELECT sector ADDRESS :0-15 (for auth_)

MOV 7CH,#60H ;Select: Auth_ instruction code

;=========================================================

ACALL AUTHENTICATION ;MCM AUTHENTICATE OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500MS

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;++++++++++++++++++ set up register/ram for Write() ++++++++++++++++++

; MOV 7EH, #00H ;(7EH):The first_address(MSB) storing the data which

;7EH:for future use!; you want to write the data to the MCM/CARD

; MOV 7DH,#50h ;(7DH): The first_address(LSB) storing the data which

; you want to write the data to the MCM/CARD

; MOV 7CH,#0BH ;Select: written address(block no.):0~~63

; LCALL WRITE_KEY_A

;=========================================================

; ACALL write ;MCM write OPERATION

54

;=========================================================

; ACALL DISPLAY

; ACALL H_DISPLAY

; ACALL D500MS

; CLR P2.6 ;CLEAR "OK"LAMP P2.3

; ACALL INIT_DISP_BUF

; ACALL DISPLAY

; ACALL H_DISPLAY

;++++++++++++++++++ set up register/ram for Read() ++++++++++++++++++

;MOV 7EH, #00H ;(7EH):The first address(HIGH_byte) which you want to

;7EH:for future use! ;read the data from the MCM/CARD into cpu_ram

MOV 7DH,#50h ;(7DH):The first address(LOW_byte) which you want to

; read the data from the MCM/CARD into cpu_ram

MOV 7CH,#08h ;Select:The address(block no.) you want to read:0-63

;==========================================================

LCALL READ ;MCM READ OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500ms

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;==========================================================

LCALL HALT ;MCM HALT OPERATION

;=========================================================

ACALL DISPLAY

ACALL H_DISPLAY

ACALL D500MS

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;==========================================================

LCALL DISP_RD_BLK ;DISPLAY JUST READ BLOCK VALUES

;=========================================================

LCALL CLEAR_DISP_RD_BLK_IN_CPU ;CLEAR :FILL WITH #11H

;=========================================================

CLR P2.6 ;CLEAR "OK"LAMP P2.3

ACALL INIT_DISP_BUF

ACALL DISPLAY

ACALL H_DISPLAY

;CLR P2.5 ;RESET MCM (-RST="0") P1.4

55

;SETB P2.4 ;RESET MCM (-CS="1") P1.5

MOV A,#80H ;SOFTWARE_RESET MCM

MOV R0,#01H

MOVX @R0,A

;LJMP REPEAT

RET

;----------------------------------------------------

56

D500US:

D500US_LOOP1:

MOV R6,#05H

D500US_LOOP2:

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

DJNZ R6,D500US_LOOP2

DJNZ R7,D500US_LOOP1

RET

;----------------------------------------------------

D500MS:

setb psw.3

setb psw.4

MOV R3,#19H

LOOP_1: MOV R4,#32H

LOOP_2: MOV R5,#64H

LOOP_3: DJNZ R5,LOOP_3

DJNZ R4,LOOP_2

DJNZ R3,LOOP_1

clr psw.3

clr psw.4

RET

;--------------------------

D2S:

setb psw.3

setb psw.4

MOV R6,#06H

LOOP: ACALL D500MS

DJNZ R6,LOOP

clr psw.3

clr psw.4

RET

;--------------------------

SPK_ON:

setb psw.3

setb psw.4

CLR P2.7

ACALL D500MS

57

SETB P2.7

clr psw.3

clr psw.4

RET

;--------------------------

DISPLAY:

SETB PSW.3

SETB PSW.4

CLR P2.2 ;SELECT MC14499'S "-ENB"

MOV R0,#36H ;DISPLAY BUF FIRST ADDRESS

MOV R1,#05H ;R1 AS A COUNTER

NEXT_CHAR: MOV A , @R0

SWAP A

ACALL DISP_ONE

INC R0

DJNZ R1,NEXT_CHAR

SETB P2.2 ;RELEASE MC14499'S "-ENB"

CLR PSW.3

CLR PSW.4

RET

;--------------------------

DISP_ONE:

MOV R2,#04H

NEXT_BIT:SETB P2.1 ;SELECT MC14499'S "CLK"=1

RLC A ;ONE BIT MOVE TO PSW.C

MOV P2.0, C

CLR P2.1 ;"CLK"=0

DJNZ R2, NEXT_BIT

RET

;--------------------------

H_DISPLAY:

SETB PSW.3

SETB PSW.4

CLR P2.3 ; -ENB

MOV R0,#31H

MOV R1,#05H

NOP

NOP

H_NEXT_CHAR: MOV A, @R0

SWAP A

ACALL H_DISP_ONE

INC R0

DJNZ R1,H_NEXT_CHAR

SETB P2.3 ; -ENB

58

CLR PSW.3

CLR PSW.4

RET

;----------------------------

H_DISP_ONE:

MOV R2,#04H

H_NEXT_BIT: SETB P2.1 ; CLK

RLC A

MOV P2.0, C ; DATA

CLR P2.1 ; CLK

DJNZ R2, H_NEXT_BIT

RET

;===========================

INIT_DISP_BUF:

SETB PSW.3

SETB PSW.4

MOV R0,#0AH

MOV R1,#31H

INIT_AGAIN: MOV @R1,#00H ;SET 31H--40H UNITS AS 00H

INC R1

DJNZ R0, INIT_AGAIN

CLR PSW.3

CLR PSW.4

RET

;--------------------------

SEND_TO_BUF01:

SETB PSW.3

SETB PSW.4

MOV B,A

MOV 3AH,A ;(3AH)

SWAP A

MOV 39H,A ;(39H)

MOV A,B

CLR PSW.3

CLR PSW.4

RET

;--------------------------

SEND_TO_BUF23:

SETB PSW.3

SETB PSW.4

MOV B,A

MOV 38H,A ;(38H)

SWAP A

MOV 37H,A ;(37H)

59

MOV A,B

CLR PSW.3

CLR PSW.4

RET

;--------------------------

H_SEND_TO_BUF01:

SETB PSW.3

SETB PSW.4

MOV B,A

MOV 35H,A ;(35H)

SWAP A

MOV 34H,A ;(34H)

MOV A,B

CLR PSW.3

CLR PSW.4

RET

;--------------------------

H_SEND_TO_BUF23:

SETB PSW.3

SETB PSW.4

MOV B,A

MOV 33H,A ;(33H)

SWAP A

MOV 32H,A ;(32H)

MOV A,B

CLR PSW.3

CLR PSW.4

RET

;--------------------------

SET_POINT0:

SETB PSW.4

SETB PSW.3

MOV R1,#36H ;(36H)

MOV @R1,#01H

MOV R1,#31H ;(31H)

MOV @R1,#02H

CLR PSW.3

CLR PSW.4

RET

;--------------------------

INDICATE:

CLR P2.6 ;INDICATE P2.6 AS "0-1-0"

SETB P2.6

ACALL D500MS

60

CLR P2.6

RET

;-----------------------------

61

;====================MCM REQUEST OPERATION====================

request:

RET

;--------------------------------------------------------------------

;===============MCM ANTICOLLISION OPERTION=============

anticollision:

RET

;--------------------------------------------------------------------

;====================MCM SELECT OPERATION=====================

select:

RET

;--------------------------------------------------------------------

;========================= AUTHENTICATION ========================

authentication:

RET

;--------------------------------------------------------------------

;========================= LOAD KEY =========================

LOAD_KEY:

RET

;--------------------------------------------------------------------

;====================MCM WRITE OPERATION=====================

write:

RET

;--------------------------------------------------------------------

;====================MCM read OPERATION=====================

read:

RET

;--------------------------------------------------------------------

62

;========================= HALT OPERATION==============================

halt:

MOV A,#10H

MOV R0,#03H

MOVX @R0,A

MOV A,#04H

MOV R0,#04H

MOVX @R0,A

MOV A,#50H

MOV R0,#00H

MOVX @R0,A

MOV A,#00H

MOV R0,#00H

MOVX @R0,A

;------------------------- SET TOC()= 0AH --------------------------

MOV A,#0AH

MOV R0,#06H

MOVX @R0,A ;TOC() = 0AH

;--------------------------- READ STACON() -------------------------

HALT_RD_STACON_AGAIN:

MOV R0,#01H

MOVX A,@R0 ;READ STACON()

;-------------------JUDGE DV FLAG ----------------------------------

JNB ACC.7,HALT_RD_STACON_AGAIN

;------------------- CLOSE TOC() -----------------------------------

MOV B,A

MOV A,#00AH

MOV R0,#06H

MOVX @R0,A ;TOC() = 00H

MOV A,B

;-------------------------JUDG ANY ERRORS --------------------------

JB ACC.6, HALT_OK_EXIT ;TE="1" IS HALT "OK" FLAG

;-----------------------HAVE ANY ERRORS ----------------------------

MOV B,#06H

LJMP HALT_ERR_EXIT

;-------------------------- EXIT -----------------------------------

HALT_OK_EXIT:

MOV B,#66H ;“ok”disp_flag

SETB P2.6 ;"OK" LAMP NOW WORKING P2.3

ACALL SPK_ON ;if "ok" then spk on

HALT_ERR_EXIT:

MOV A,B

ACALL SEND_TO_BUF01 ;SEND RETURN_VALE TO DISP_BUF_LOW

RET

63

;========================= End of MCM HALT OPERATION =======================

64

;-------------------- DISPLY READ BLOCK VALUE(16 BYTES) ---------------

DISP_RD_BLK:

MOV R0,#50H

MOV R7,#04H

DISP_RD_BLK_LOOP:

MOV A,@R0

LCALL H_SEND_TO_BUF23 ;SEND RETURN_VALE TO DISP_BUF_LOW

INC R0

MOV A,@R0

LCALL H_SEND_TO_BUF01 ;SEND RETURN_VALE TO DISP_BUF_HIGH

INC R0

MOV A,@R0

LCALL SEND_TO_BUF23 ;SEND RETURN_VALE TO H_DISP_BUF_LOW

INC R0

MOV A,@R0

LCALL SEND_TO_BUF01 ;SEND RETURN_VALE TO H_DISP_BUF_HIGH

INC R0

LCALL DISPLAY

LCALL H_DISPLAY

LCALL D500MS

LCALL D500MS

DJNZ R7,DISP_RD_BLK_LOOP

RET

;-------------CLEAR DISPLY_READ_BLOCK VALUE(16 BYTES) IN CPU RAM ----------

CLEAR_DISP_RD_BLK_IN_CPU:

MOV R0,#50H

MOV R7,#10H

CLEAR_DISP_RD_BLK_LOOP:

MOV @R0,#11H ;SEND #11H TO DISP_RD_BLK_IN_CPU

INC R0

DJNZ R7,CLEAR_DISP_RD_BLK_LOOP

RET (待续)

65

发布评论

评论列表 (0)

  1. 暂无评论