• 270 likes • 562 Views
IC 卡公交收费机设计(三) —— MIFARE 1 卡读写软件设计. 电子与信息工程学院. 课 程 目 标. 非接触式 IC 卡读写控制 MIFARE 1 卡读写控制功能的实现. 项目开发 —— IC 卡公交收费系统. 系统需求分析: 具备小额电子钱包功能,定额方式收费 操作方便快捷 工作距离 <50cm 具备显示余额、异常报警(非法卡或余额不足) 可将当班收款额上传总站数据库 公交公司可调整定额额度 卡遗失可挂失 抗干扰能力强. 项目设计之三 —— 软件设计. 读写器与 M1 卡交换数据的过程:
E N D
IC卡公交收费机设计(三)——MIFARE 1卡读写软件设计 电子与信息工程学院
课 程 目 标 • 非接触式IC卡读写控制 • MIFARE 1卡读写控制功能的实现
项目开发——IC卡公交收费系统 • 系统需求分析: • 具备小额电子钱包功能,定额方式收费 • 操作方便快捷 • 工作距离<50cm • 具备显示余额、异常报警(非法卡或余额不足) • 可将当班收款额上传总站数据库 • 公交公司可调整定额额度 • 卡遗失可挂失 • 抗干扰能力强
项目设计之三——软件设计 • 读写器与 M1卡交换数据的过程: 1)由读写器MCU(微控制器)发送指令给MCM, 2)MCM执行指令并将其转换为射频信号发送给卡; 3)卡接收到来自MCM的指令后,按指令完成其内部的各种处理,并回送应答信号/数据给MCM; 4)MCM接收卡回送的射频信号并将其转换为数字信号输出给MCU,读写器MCU读取MCM接收到的应答/数据,即可完成与M1卡的数据交换。
SOR/LOAD KEY MIFARE 1卡操作步骤 REQUEST 卡应答:TAGTYPE(2B) 卡应答:SN(4B)+校验码(1B) ANTICOLLISION SELECT 卡应答:SIZE(1B) AUTHENTICATION 卡应答:AE位 READ/WRITE/INC/DEC HALT
MIFARE 1卡的读写操作步骤 • 激活MCM • MCM软复位 • 向MCM下载密码(LOAD KEY),校验传输密码正确后可向MCM的KEY-RAM写入用户自己设定的密码,以上操作与卡无关。 • 请求应答(ANSWER TO REQUEST):寻卡 • 防冲突(ANTICOLLISION):选择唯一一张卡 • 选择标记(SELECT):激活所选择的卡 • 认证 (AUTHENTICATION):安全性 • 读写操作(读、写、加值、减值):交换数据(READ/WRITE/INCREAMENT/DECREMENT) • 停止(HALT):置卡为停止模式,防止重复操作。
MIFARE 1卡读写范例程序 #include <string.h> #include <intrins.h> #include <stdio.h> #include <MFA.h> #include <mfreg632.h> #include <PcdUtils.h> #include <PcdShare.h> #include <MfErrNo.h> #include <TG12864.h> #include <MAIN.h> #define uchar unsigned char #define uint unsigned int #define ulong unsigned long //----- external control----------- #define LED P3_4 #define BP P3_5 //========function declare========= void rc500_init(void); void init(void); void delay10us(void); void delay100us(void); void delay10ms(void); void delay100ms(void);
main(void) { uchar blockdata[16] ;块数据 uchar TagType[2] ;卡类型号TagType uchar SN[4] ;卡序列号SN uchar sak1 ;卡容量字节Size uchar cmd=1; uchar i=0; uchar Status; rc500_init(); //RC500 INIT M500PcdConfig(); // config mifare init(); //SYSTEM INIT InitLCD()
while(1) { Status = M500PiccRequest(PICC_REQSTD, &TagType[2]) ;寻卡,卡应答TagType if(Status==MI_OK) { Status = M500PiccAnticoll(0, &SN) ;防冲突,卡应答SN } if(Status==MI_OK) { memcpy(card_snr,&SN,4); // store serial number in globle var } if(Status==MI_OK) { Status = M500PiccSelect(&SN, &sak1) ;选择应用,卡应答Size }
if(Status==MI_OK) { Status=M500PiccAuthE2(PICC_AUTHENT1A,card_snr,0,3) ;密码认证 } if(Status==MI_OK) { Status=M500PiccRead(3, blockdata) ;读块(读余额) blockdata[5]=blockdata[5]-0x05 ;修改块数据 } if(Status==MI_OK) { Status= M500PiccWrite(4,blockdata) ;写块(扣款) } if(Status==MI_OK) { Status =M500PiccHalt() ;暂停,与REQUEST STD组合使用,防止重复操作 } } }
Answer to Request (请求应答)操作 • Request 指令将通知MCM在天线有效的工作范围(距离)内寻找MIFARE 1卡。 • 函数: • char M500PiccRequest(unsigned char req_code, // request code REQ_ALL = 0x52 or REQ_STD = 0x26 unsigned char *atq) // answer to request • 命令码:52H或26H。 • 卡应答: TAGTYPE(2个字节)
Difference between “request std” & “request all” • With a “request std” instruction only cards which are not set into a “HALT-mode” will respond to this request,or it may be expanded to all cards in the field with a “request all” option.The first option is needed to prevent the MCM from selecting one card several times.
初始化与防冲突(AntiCollion) • 如果有2张或2张以上的IC卡进入读写器的工作范围,称之为冲突(或碰撞Collion),此时就需要解决如何对多张IC卡逐一处理的问题——防冲突AntiCollion。 • 防冲突方案: 位帧防冲突(Bit AntiCollision) 动态时隙-ALOHA法(Slotted-ALOHA法)
AntiCollision 防冲突 • 如果有多于一张的Mifare 1卡处在MCM天线的有效工作范围(距离)内,则发生了冲突。AntiCollision操作使MCM能在多张Mifare 1卡中选择某一张卡。 • AntiCollision操作由一个AntiCollision Loop(防冲突循环,内部处理)来实现。MCM发送AntiCollision命令(93H+20H),每张天线范围内的MIFARE 1卡接收AntiCollision命令后,都将回送自己的SN作为应答。 • 由于每张卡的SN各不相同,MCM接收到的信息(即SN)至少有1位即是0又是1(即该位的前、后半部都有负载波调制),防冲突循环找到第1个冲突位将其置1(排除该位为0的卡),然后查第2个,依次排除,最后不再有冲突的SN即为最后读取的SN。
MIFARE 1卡防冲突特性 • 利用每张卡全球唯一的SN实现二进制树状搜索防冲突算法。 例: SN1:420A7E00 SN2:420A7E01 SN3:421A7E01 冲突1 选择SN2、SN3 冲突2 选择SN3
POWER OFF状态 MIFARE 卡 防冲突流程 RESET IDLE状态 REQUEST 命令 READY状态 ANTICOLLISION命令 启动防冲突循环 读取卡回送的UID(SN) SELECT UID命令 应用:AUTENTICATION/READ/WRITE/INC/DEC命令 WAKE UP 命令 ACTIVE状态 HALT命令 HALT状态
防冲突(AntiCollision)操作 • Anticollision命令启动防冲突循环,卡收到命令后回送SN作为应答,防冲突循环将在收到的所有SN中选择某一个SN作为应答。 • 函数 • char M500PiccAnticoll (unsigned char bcnt, unsigned char *snr) • 块地址:bcnt=0 • 卡应答:SN(4B)
选择应用(Select)操作 • Select命令将选中的SN发送给卡,与之相同SN的卡被选择,进入ACTIVE状态,而其他卡留在IDLE状态。 • 函数 • char M500PiccSelect(unsigned char *snr, unsigned char *sak) • 入口参数:SN • 卡应答:Size(1B)
认证(Authentication )操作 • MCM中设有专用的密码存储器,用于存储3个密码集KEYSET0,KEYSET1,KEYSET2,每一个KEYSET又包含了各个扇区的KEY A 及KEY B。 Authentication操作就是将密码存储器中的密码与卡中对应的密码进行三次相互认证。 • 函数 • char M500PiccAuthE2( unsigned char auth_mode, // KEYA, KEYB unsigned char *snr, // 4 bytes card serial number unsigned char key_sector, // key address in reader storage, // 0 <= key_sector <= 15 unsigned char block) // block number which should be authenticated // 0 <= block <= 256 • 卡应答:以AE位给出;AE=1/0,密码出错/正确,未能通过/通过认证; 用状态STATUS表示
READ/WRITE操作 • READ/WRITE均需整块操作。 • READ: char M500PiccRead( unsigned char addr, // 0 <= blockaddr <= 256 unsigned char *_data //return block data) • WRITE: char M500PiccWrite( unsigned char addr, // 0 <= blockaddr <= 256 unsigned char *_data //data that will be written into EEPROM)
Value Operate 值操作 • MIFARE卡专门为公交/地铁等行业的定额收费系统设有值操作命令,包括INCREAMENT/DECREAMENT/ TRANSFER/RESTORE • 对某块进行值操作的前提是该块已被初始化为“值块”(Value Block)并且Access Bits允许值操作。初始化“值块”的方法是用WRITE操作按规定的“值块”格式写入初始数据。
Increment/Decrement/Transfer • Increment: adds the specified value to thememory value • Decrement: subtracts the specified value from the memory value • Transfer: Each Increment or Decrement instruction manipulating a standard value block has to be followed by a Transfer intruction which actually stores the calculated result in the card memory. Until then, the result is kept in an internal value buffer resgister.
Increment/Decrement/Transfer • 函数 char M500PiccValue(unsigned char dd_mode, unsigned char addr, unsigned char *value, unsigned char trans_addr) //dd_mode : Inc,Dec command code // addr:0 <= blockaddr <= 256 // value:4B value // trans_addr: 0 <= blockaddr <= 256
HALT操作 • set card into “HALT-mode”, to prevent the MCM from selecting one card several times. • 函数 char M500PiccHalt(void)
实训 非接触式IC卡读写控制程序设计与调试 第一阶段:用WRITE形式扣款,调试程序,设置断点,查看操作流程中各操作步骤的卡应答。 第二阶段:防冲突与防止重复扣款的编程实现与调试。 然后将该数据块中的数据读出并存入读写器MCU的片内RAM中。 第三阶段:修改程序,实现用DECTEMENT形式扣款。
实训步骤 • 用非接触式IC卡读写软件SZPTReader向MCM中下载密码,读出并记录2张MIFARE1卡的TAGTYPE、SN、SIZE,在卡中某数据块(如扇区1块0)分别写入公交卡金额(模拟充值)。 • 取出非接触式IC卡开发板上的MCU芯片,将仿真头插入MCU的IC座。 • 设置断点运行实训程序,分别对1#、2#卡进行读写操作,查看并记录操作流程中各操作步骤的卡应答 。 • 将2张卡同时置入天线工作范围内,设置断点循环运行实训程序,查看并记录操作流程中各操作步骤的卡应答 。 • 修改程序,实现DECREMENT形式的扣款。