介绍了philips公司的mifare 1非接触ic卡读写器芯片mcm200的主要特性、引脚功能、内部的物理功能寄存器和基本指令集。重点介绍了mifare 1非接触ic卡和mcm200数据通信的一些重要模块的编程思路和编程方法,给出了两个编程实例。
mifare 1 ic智能(射频)卡的核心是philips 公司的mifare 1 ic s50(-01,-02,-03,-04)系列微模块(微晶片)。其相应的读写器模块为philips公司的mcm200和mcm500。其中,mcm200模块主要应用于操作距离在 25mm的卡片读写器中;mcm500模块主要应用于操作距离在100mm的卡片读写器中。
1 mcm200模块的主要特性
mcm200读写器模块的主要特性如下:
●采用标准的双列直插式32引脚封装;
●工作频率为13.56mhz,采用标准的+5v电源供电,典型电流消耗为40ma;
●读写卡片距离可达25mm以上;
●与卡片的通信速率可达106kbps;
●每个扇区均包含有3套密码,同时包含有认证密码用的存储器;
●有防卡片重叠功能;
●带有16字节的fifo(先进先出)队列接收/发送缓冲寄存器;
●在模块与卡片通信时可自动侦查错误,对数据流可自动分析;
●可对rf(射频)通道进行自动监控;
●有内建8位/16位crc协处理器,可提供crc、arity等数据校验;
●支持多种方式的活动天线,并且不需天线调节系统即可对天线进行补偿调节;
●带有标准的mifare 并行接口?可直接由标准的mcu接口信号控制。
2 mcm200模块的引脚说明
mcm200的引脚排列如图1所示。各引脚的功能如下:
d0~d7:8位双向数据总线;
a0~a3:4位地址线;
bp:后备电池输入端,用于保护mcm内部密码ram;
npause1:串行数据输出,用于驱动rf单元,该引脚必须连到rf单元的tp端。
nwr:写信号使能端;
nrd:读信号使能端;
ncs:该脚为低电平时选中mcm;
komp1:rf的比较器输入端,使用时必须连到rf单元的rx端;
nirq:mcu数据处理控制端。当该端为低时,mcu将用mcm状态寄存器中的内容来对mcm中的数据进行处理;
ale:地址锁存使能端;
useale:选择从内部地址锁存器或a0~a3引脚取地址;
dgnd:数字电路接地端;
dvdd:+5v电源端。
mode:并行协议模式选择引脚,可用高电平驱动。
avdd:+5v模拟电源输入引脚,用于rf射频单元;
agnd:rf射频单元(模拟电路)接地端;
nant、ant:天线连接端。
3 mcm200内部特殊功能寄存器
mcm200器件内部共有16个特殊功能寄存器,表1所列是这16种特殊功能寄存器的地址和读写情况。实际上,mcu主要通过对mcm寄存器的读写来控制mcm的工作。mcm是mcu与非接触式ic卡之间进行信息交换的接口,系统对卡片上的数据进行任何读写均须通过mcm 来传递。
表1 mcu200中的物理功能寄存器
寄存器名 地 址 读(read) 写(write)
data 00h read-byte write-byte
stacon 01h dv te pe ce be ae - - - - sor rfs - - - - 1 1 nrf ac
enable 02h n/a 1 pr ce cr - - - - - - - -
bcnts 03h n/a bit-count-send
bcntr 04h n/a bit-count-receive
baudrate 05h n/a - - - - - - - - 1 1 1 br
toc 06h n/a timeout-counter
mode 07h n/a 1 1 0 0 0 p2 p1 p0 p0
crcdata 08h crc-byte-read crc-byte-write
crcstacon 09h cv - - - - - - - - - - - - cz c8 - - - - - - - - - - - - cr
keydata 0ah n/a key-byte-write
keystacon 0bh - - - - - - - - - - - - - - - - al 0 - - - - - - - - ks1 ks0
keyaddr 0ch n/a al ab a5 a4 a3 a2 a1 a0
0dh
rcode 0eh n/a - - - - - - - - 0 0 rc1 rc0
表2 mcm2000的基本指令集
指 令 指令代码(hex) 相关的出错标志 接收卡片上数据
answer to request(request的应答) te,be tagtype
request std 26
request all 52
anticollision(防重叠) 93 te,be serial number
select tag(选卡片) 93 te,be,pe,ce size
authentication(认证) te,be,pe,ce /
auth-1a 60
auth-1b 61
load key(存取密码) / ae
read(读) 30 te,be,pe,ce data
write(写) a0 te,be /
increment(增值) c1 te,be /
decrement(减值) c0 te,be /
restore(重储) c2 te,be /
transfer(传送) b0 te,be /
halt(停机) 50 te,be /
4 mcm200的指令和软件设计
mcu通过特殊指令来启动mcm200并运行,同时将这些指令传输到mifare 1卡片上。mcm200的基本指令集如表2所列。mifare 1 ic卡与mcm200之间的通信使用握手式半双工通信协议,卡片带有高速crc协处理器,符合ccitt标准。卡片的rom中固化了其运行所需的必要程序指令,它能使卡片有条不紊地与卡片读写器进行数据通信。但mcu对mcm200的指令操作通常不是简单的一条指令,而是用一个程序序列来完成,其中包括对mcm200硬件内核寄存器的设置。mcm对ic卡的操作流程如图2所示。现将其中各主要子程序模块的编程方法作以说明。
4.1 request操作子程序
request 指令用于通知mcm200在天线有效的工作距离内寻找mifare 1卡片。如果 mifare 1卡片存在,就和mifare 1通信,并读取卡片类型号tagtype(2个字节),然后由mcu根据tagtype区别不同类型的卡片。request 指令分为request std指令和re-quest all指令。request std指令是连续性的读卡指令。request all指令是非连续性的读卡指令,只读一次。request all指令在成功地读取一张卡片之后,会一直等待使用者拿走这一张卡片,直到有新一张卡片进入mcm的天线有效工作范围之内。request操作的汇编语言程序如下:
request: mov a,#0ch ?;设置mcm中的stacon 寄存器为0ch
mov r0,#01h
movx @r0,a
mov a,#0eh ?;设置mcm中的bau-drate寄存器为0eh
mov r0,#05h
movx @r0,a
mov a,#0c0h ;设置mcm中的enable寄存器为0c0h
mov r0,#02h
movx @r0,a
mov a,#0c6h ?;设置mcm中的mode寄存器为0c6h
mov r0?#07h
movx @r0?a
mov a?#02h ;设置mcm中的rcode
寄存器为02h
mov r0?#0eh
movx @r0?a
mov a?#07h ;设置mcm中的bcnt
s
寄存器为07h
mov r0?#03h
movx @r0?a
mov a?#10h ;设置mcm中的bcntr
寄存器为?10h
mov r0?#04h
movx @r0?a
jb f0, rstd ;根据f0标志判断是执
行request std操作还是
request all操作
reqall? mov a?#52h ;request all指令代码→a
ajmp rqtmcm
rstd: mov a?#26h ;request std 指令代码→a
rqtmcm?mov r0?#00h
movx @r0?a ;request all指令或request
std 指令写入data
mov a? #0ah ?toc = 0ah
mov r0?#06h
movx @r0?a
mov r0?#01h ;读stacon状态
movx a?@r0
jnb acc.7?rd stacon ? tagtype没
有到fifo(dv=0)?重新读stacon状态
mov r7,a ? stacon值暂存在r7中
mov a, #00h ?toc=00h
mov r0,#06h
movx @r0,a
mov a,r7 ;取暂存在r7中stacon值到a
jb acc.6?te_err ?; 定时计数器溢出错转te_err
jb acc.3,be_err ?; 位计数器错转be_err
mov r0,#00h ;读卡片的卡片类型号tagtype 0存入45h单元
movx a,@r0
mov 45h?a
mov r0,#00h
movx a,@r0 ;读卡片上的卡片类型号tagtype1存入46h单元
mov 46h,a
ret ?; ret
te_err: ?;“te” 错误处理
ret
be_err: ?; “be”错误处理
ret
4.2 “anticollision”?防卡片重叠 操作子程序
如果有多张mifare 1卡片处在卡片读写器的天线工作范围之内,anticollision指令将启动anticolli-sion模块的防重叠功能,同时mcm200将有序地读所有处在其天线有效工作距离内的mifare 1卡片的40bit长的序列号sn。mcu接收到这5个字节的sn后,会进行校验。其校验、计算卡片序列号的方法是:采用相邻两个字节相互异或得出的结果与下一个字节再异或,前四个字节异或的结果与第5个字节应该相同,否则认为mcu读到的卡片的序列号有错,因此卡片的序列号的前四个字节是有意义的,第5个字节仅仅用于校验之用。这五个字节被存储在ic卡片的第0扇区的第0块中,它由卡片的生产商制定并固化,不得更改,所以在市面上流通的mifare 1 s50系列的非接触式ic射频卡中,每一张卡片的序列号都是唯一的。“anticollision”?防卡片重叠 操作子程序清单如下:
anti? nop
mov a? #10h ?bcnts = 10h,控制
mcu向data寄存器
发送 2个字节数据
mov r0?#03h
movx @r0?a
mov a? #0ch ;设置mcm中的
stacon寄存器
setb acc.0 ?ac =“1”,启动防重
叠状态机
mov r0?#01h
movx @r0?a
acall d1000us ?delay 1000us
mov a? #93h ;anticollision?防卡片
重叠 指令码写入data
mov r0?#00h
movx @r0?a
mov a? #20h
mov r0?#00h
movx @r0?a
mov a? #28h
mov r0?#04h
movx @r0?a ?bcntr = 28h ,接
收5个字节的数据
mov a? #0ah
mov r0?#06h
movx @r0?a ?toc = 0ah
mov r0?#01h
again: movx a?@r0 ? 读stacon状态
jnb acc.7? again ?如果 dv=“0”重
读stacon
mov r7,a
mov a? #00h
mov r0?#06h
movx @r0?a ?toc = 00h
mov a,r7
jb acc.6? te err ? 定时计数器溢出
错转te err
jb acc.3? be err ?位计数器错转
be err
mov r7?#04h ?读4个字节的sn值
存入40h~43h单元,
前四个字节进行异或
mov b?#00h
mov r1?#40h
mov r0?#00h
loop? movx a?@r0
mov @r1?a ?存sn的前四个字节在
单片机内部ram的
40h?41h?42h?43h单元
xrl b?a ?相邻字节相互异或
inc r1
djnz r7? loop
movx a?@r0 ?前四个字节异或的结
果和接收的第5个字
节进行比较,若不等则
xrl a?b 转错误处理
jnz antierr
ret
te err?
ret
be err?
ret
antierr:
ret
4.3 “select”?选卡片 操作子程序
该程序用于mcm200与卡片的真正联络。选择一张卡片通常由mcu向mcm200发送“select”命令来完成。mcu发送“select”命令后,会同时在“anticollision” 操作中得到mifare 1卡片的40bit长的序列号的前四个字节以及前四个字节的异或结果,同时再重新发送给mifare 1卡,只有本身的序列号和接收的序列号相同的卡片才被真正地选中。select指令成功执行后,mcu将得到mcm data寄存器传来的一个字节长的卡片容量信息(size字节)。size字节被存储在mifare 1卡片上的第00h扇区中的第00h 块中。
4.4 “authentication”认证操作子程序
mifare 1卡的每个扇区的块3包含该扇区的密码a?6个字节 、存取控制?4个字节 、密码b?6个字节 ,它是一个特殊的块。在确认了上述三个步骤后,就表示已经选择了一张卡片,在对卡片进行读写操作之前,还必须对卡片上已经设置的密码进行认证,如果匹配,则允许进一步的read/write操作。也可以通过选择存储在mcm的ram密码集中的一组密码来进行认证操作。mcm能够存储3个密码集keyset0、keyset1和keyset2。每一个keyset又包含了keya及keyb 等。在"authentication"指令发出之前,必须设置密码控制寄存器keystacon,使al=1,然后设置ks0和ks1以指定一套密码集。同时,还必须设置密码地址寄存器keyaddr,当ab为“1”时,选择keya,ab为“0”时选择keyb,a5~a0用于选择mcm-ram中存放密码的扇区地址(0~63), keyaddr寄存器中的“ab”设置必须匹配"authentication"命令,因为在"authentication"命令中,60h代码用于认证keya;61h代码用于认证keyb。正确地设置keystacon 和keyaddr寄存器之后,通过写"authentication" 认证命令代码和写“地址”(mifare
卡要认证的扇区地址是0~15)到data寄存器?认证密码操作的模块便开始启动执行。如果三遍认证的每一个环都为“真”,且都能正确通过验证,则整个认证成功。这时读写器即可对刚刚认证通过的卡片上的这个扇区进行下一步read/write 等操作。
4.5 “read"或“write"操作子程序
read指令允许mcu通过mcm来读取mifare 1卡片上完整的16个bytes的数据块。read指令操作只能一个块(block)一个块地读,即一次只能读取16个字节。如果只要求读取某block中的几个字节的数据,也只能一个整块16个字节一起读取,再由程序员选取指定的字节。从卡片上读到的数据必须由mcu进行校验,以确保数据的有效。
“write” 写指令允许用户写数据到mifare卡片上(完整的16 个bytes的数据块)。只有在“authentication” 认证指令完成后,才允许对数据扇区或数据块进行“write”写指令操作。写入的数据块的数据结构如下:
15 14 13 12 11 10 9 8
address address address address v a l ue
7 6 5 4 3 2 1 0
v a l ue v a l ue
通过一个写操作可将存储的数据在每一个block块中写3次并反写1次,从而完成数据块的初始化。块的地址必须写4次,其中2次为反向写入。正/负数据值将以标准的二进制补码格式来表示。
4.6 “increment”或 “decrement”增值或减值子程序
通过mifare 1内部电路能够执行“increment” &“decrement”增值/减值操作,在根据key a 和key b 进行“increment”&“decrement”增值/减值操作时; “increment”增值表示将指定的值加到卡片的存储器中;“decrement”减值则表示从卡片的存储器中减去指定的值。每一个“increment”& “decrement”增值/减值操作都必须跟随一条“transfer” 传送指令,这样才能真正地将数据结果传送到卡片上。如果没有传送指令,数据结果仍将保持在数据缓冲寄存器中。
中国移动和鞍钢正在2.0的实践过程中,并积极开展3.0的探索
NASA阿波罗制导计算机系统设计探秘(图文)
Innoviz为丰富其产品线推出了新一代激光雷达传感器InnovizTwo
关于74.29% 的光伏业主对自家电站运行的分析和应用
5G网络未来的发展重点应该放在哪里
MCM200读写器模块的主要特性、引脚功能及应用实例分析
汉云亮相2019中国工业互联网大会 发布首个五金产业集群方案
特斯拉上海工厂招聘开启 三倍工资抢人
检测冷热一体机, 电机测试冷热一体机供应
未来5年国产OLED屏幕市场规模将超越三星、LG
不懂什么是智慧工厂,看这篇文章就够了!
连接器的分类
骨传导耳机的原理是什么?骨传导耳机是否会对听力造成损害?
单模光纤和多模光纤有哪些区别?-科兰
浅谈自动驾驶技术常用坐标系统关联和转换
ch32f103和stm32的区别
不到一周跌40% 比特币从网络走进现实道阻且长_以太坊杀出:价值创历史新高
高压XPEL电缆缓冲层故障简析
苹果siri的10大应用
干货!晶振材质及性能分类汇总