基于RFID的门禁控制系统研究设计(刘珊) 下载本文

湖南人文科技学院毕业论文(设计)

}

附 录2

unsignedeharMf5OOCaseAniieoll(unsigned char selectcode,unsigned char bcnt unsigned char*snr)

{

Unsigned char complete; Unsigned char status; complete=0; status=MI_OK;

while((complete=0)&&(status=MI_OK)) {

nBytesReceived=0;

/*禁止RxCRC和TxCRC,校验使能*/ regwrite(RegChannelRedundancy,ox03): nbits=bent%8;//位个数 if(nbits) {

regwrite(RegBitFraming,nbits<<4nbits); nbytes=ben/8+1://字节个数 } else

nbytes=bcnt/8; for(i=0;i

NVB=0x20+(bcnt/8)<<4)+nbits;//要发送的字节数 regwrite(ReglntemiptEn,ox7F;//禁止所有中断 regwrite(ReglntemipRq,ox7F);//复位request中断

regwrite(Regcommand,PCD IDLE);//中止可能正在运行的程序 regwrite(RegControl,regread(Regcontrol)}ox0l);//清空FIFO regwrite(RegFIFOData,ox93);//写入SEL命令代码 regwrite(RegFIFOData,NVB);//写入NVB命令代码 for(i=0:i

regwrite(RegInterruptEn,ox84);//TimerIRq和IdleIRq使能 regwrite(RegCommand,pcD_CRANscEIVE)://命令开始执行 mrc500_cnt==0x00;

while((!(regreed(RegPrimaryStatus)&ox08))&&(mre500secnt<200)) mre500escnt+=1;//超时或命令结束判断 if(mrc500_cnt>=200)//超时时的处理 {

regwrite(RegCommand,PCD_DLE);//中止程序 status=MI_ACCESSTIMEOUT: return status; }

36

湖南人文科技学院毕业论文(设计)

status=regread(RegErrorFlag)&ox07;//读取错误标志 //错误判断 if(status) {

If(status&oxol)

status=MI_COLERR;//判断为冲突检测错误 if(status&ox02)

status=MI_PARITYERR;//判断为校验错误 if(status&0x04)

status=MI_FRAMINGERR;//判断为帧错误

nBytesReceived=regread(RegFIFOLength)://读取数据长度 for (i=0:i

coll_data[i]=regread(RegFIFOData);

if(regread(RegFIFOLength)>=ox04)//判断接收的数据长度是否正确 {for(status=0:status<4;status++)

snr_nr[status]=regread(RegFIFOData); status=MI_OK; } ??

if(status=MI_OK) {

memcpy(snr,snr_in,4);//保存snr ?? } else

memcpy(snr,”0000”,4); /*冲突禁止后置0*/

regwrite(RegDecderControl,regread(RegDecoderControl)&(}ox20)); regwrite(RegCommand,PCDwe IDLE)://中止程序 retomStatus; }

附 录3

Unsigned char Mf500CaseSelect(unsigned char select code,unsigned char*snr,unsigned char*sak)

{??

regwdte(RegInterruptEn,ox7F)://禁止所有中断 regwrite(RegInterruptRq,ox7F)://复位request中断

regwrite(RegCommand,PCD_DLE);//中止可能正在运行的其它程序 regwrite(RegControl,regread(RegControl)|oxol);//清空FIFO regwrite(RegFIFOData,ox93);//写入SEL命令代码 regwrite(RegFIFOData,ox70);//写入NVB命令代码 for(satus=0;status<4;status++)

regwrite(RegFIFOData,snr[status]);//写snr到FIFO

37

湖南人文科技学院毕业论文(设计)

status=snr[0]^snr[l]^snr[2]^snr[3];//计算BCC

regwrite(RegFIFOData,status);//将BCC写入FIFO

regwrite(ReglnterruptEn,oxA4)://使能TimerIRq和IdleIRq regwrite(RegCommand,PCD TRANSCEIVE);//命令开始执行 mrc500_cnt=0x00:

while((!(regread(RegPrimaryStatus)&0x08))&&(mre500_cnt<100)) mrc500_cnt+=l;//超时或命令结束判断 if(mrc 500_cnt>=100)//超时时的处理 {

regwrite(RegCommand,PEDIDLE)://超时时中止程序 status=MI_ACCESSTIMEOUT;//置超时标志 return status; }

status=regread(RegErrorFlag)&ox07;//未超时时读取错误标志 if (status) {

if(status&oxol)

status“MI_COLLERR;//判断为冲突检测错误 if(status&0x02)

status=MI_PARITYERR;//判断为校验错误 if(status&0x04)

status=MI_FRAMINGERR;//判断为帧错误 }else

If (regread(RegFIFOLength)==oxol) {//判断接收数据长度是否正确 if(regread(RegFIFOData)&0x04)

status=MI_SAKERR;//判断为SAK错误 else status=MI_OK:

}else status=MI BITCOUNTERR;//数据长度不符合则为计数错误 regwrite(RegCommand,PCD_IDLE)://程序终止 return status; }

附 录4

unsignedeharMf500Read(unsigned char block_add,unsigned char value[]) {

restart_Watch_Dog;//复位看门狗

regwrite(RegInterruptEn,ox7F);//禁止所有中断 regwrite(RegInterruptRq,ox7F)://复位request中断

rewrite(Regcommand,PCDweIDLE)://中止可能正在运行的其它程序 regwrite(RegControl,regread(RegControl)!ox0l);//清空FIFO regwrite(RegFIFOData,PICCee_READ)://写入read命令 regwrite(RegFIFOData,block_add);//写入block_add参数 regwrite(RegInterruptEn,ox84)://使能IdleIRq中断

38

湖南人文科技学院毕业论文(设计)

regwrite(RegCommand,PCD_TRANSCEIVE)://写入命令代码 mrc500_cnt=0;

while((!(regread(RegPrimaryStatus)&ox08))&&(mrc500_cnt<200)) mrc500_cnt+=l;//超时或命令结束判断 if(mrc500_cnt>=200) {

regwrite(RegCommand,PCD IDLE)://超时时的处理 status=MI_CCESSTIMEOUT; return status; }

status=regread(RegErrorFlag)&ox0e;//读取错误标志 if(status) {

if(status&ox02)

status=MI_ACCESSTYERR;//判断为校验错误 if(status&ox04)

status=MI_FRAMINGERR;//判断为帧错误 if(status&ox08)

status=MI_CRCERR;//判断为CRC错误 } else {

if(regread(RegFIFOLength)==ox10)//判断所接收到的数据长度是否正确州数据长度正确时的处理

for(status=0;status<16;status++)

value[status]=regread(RegFIFOData);//读取一个扇区中的1个数据块 statu=MI_OK; } else

status=MI_BITCOUNTERR;//置数据长度出错标志 }

regwrite(RegCommand,PCD_IDLE)://程序终止 return status; }

39