关 闭

新闻中心

EEPW首页 > 安全与国防 > 设计应用 > Mifare 1非接触式IC卡读写核心模块MCM200

Mifare 1非接触式IC卡读写核心模块MCM200

作者: 时间:2008-03-07 来源:网络 收藏
A

   A#10H ;设置MCM中的BCNTR

  寄存器为10H

   R0#04H

  X @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 1卡要认证的扇区地址是0~15)到DATA寄存器认证密码操作的便开始启动执行。



评论


相关推荐

技术专区

关闭