609.
610.status=M500PcdCmd(PCD_WRITEE2,/*执行写RC500'sEEPROM命令*/ 611.SerBuffer, 612.&MInfo);
613.returnstatus;/*返回状态值*/ 614.} 615.
616.///////////////////////////////////////////////////////////////////////
617.//SelectCommanddefinedinISO14443(MIFARE) 618./*配置MFOUT/MFIN两脚输出内容*/
619.///////////////////////////////////////////////////////////////////////
620.charM500PcdMfOutSelect(unsignedchartype)/*TYPE为MFOUT输出的信号是什么类型*/ 621.{
622.WriteIO(RegMfOutSelect,type&0x7);/*MFOUTSELECT寄存器?26H?=TYPE--低三位有效*/ 623.returnMI_OK; 624.} 625.
626.///////////////////////////////////////////////////////////////////////
627.//RequestCommanddefinedinISO14443(MIFARE)
628.//Request,Anticoll,Select,returnCardType(2bytes)+CardSerialNo(4bytes)
629.//寻卡?防冲突?选择卡返回卡类型?2bytes?+卡系列号(4bytes)
630.///////////////////////////////////////////////////////////////////////
631.charM500PiccCommonRequest(unsignedcharreq_code,unsignedchar*atq) 632.{/*ATQ=ANSWERTOREQUEST:响应信息?两个字节*/ 633.charidatastatus=MI_OK; 634.
635.M500PcdSetTmo(3);/*计数器工作于模式3*/
636.WriteIO(RegChannelRedundancy,0x03);/*通道冗余寄存器置3--奇校验?每个字节后附加一个校验位?无CRC校验*/
637.ClearBitMask(RegControl,0x08);/*清加密算法位?09H?*/
638.WriteIO(RegBitFraming,0x07);/*最后三位为111?表示最后一字节须传送的位数为1?0FH?*/
639.SetBitMask(RegTxControl,0x03);/*TX脚发送被数据调制好的能量载波信号?11H?*/ 640.
641.ResetInfo(MInfo);/*信息接口*/
642.SerBuffer[0]=req_code;/*REQ_CODE=26H:REQUESTALL,REQ_CODE=52H:REQ
UESTIDLE,*/
643.MInfo.nBytesToSend=1;
644./*上面是REQUEST指令相关信息*/
645.status=M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);/*执行TRANSCEIVE指令?寻卡--REQUEST?*/ 646.
647.if(status)/*返回标志为1*/ 648.{
649.*atq=0;/*则响应值置0*/ 650.}
651.else/*返回标志为0--成功了一半*/ 652.{
653.if(MInfo.nBitsReceived!=16)/*如果收到的比特数不是16?则命令执行失败*/ 654.{
655.*atq=0;/*则响应值置0*/
656.status=MI_BITCOUNTERR;/*置状态寄存器为比特计数器错*/ 657.} 658.else 659.{
660.status=MI_OK;/*是16?命令执行成功*/
661.memcpy(atq,SerBuffer,2);/*从单片机数据缓冲区中读取响应信号?ATQ?*/ 662.} 663.}
664.returnstatus;/*返回状态值*/ 665.} 666.
667.///////////////////////////////////////////////////////////////////
668.//CascadedAnti-CollisionCommanddefinedinISO14443(MIFARE) 669./*防冲突读卡的系列号MLastSelectedSnr四位的序列号*/
670.///////////////////////////////////////////////////////////////////
671.charM500PiccCascAnticoll(unsignedcharbcnt,unsignedchar*snr) 672.{/*BCNT=0--32,比特计数器?SNR=序列号存储缓冲区4个字节?*/ 673.charidatastatus=MI_OK; 674.charidatasnr_in[4]; 675.charidatanbytes=0; 676.charidatanbits=0; 677.charidatacomplete=0; 678.charidatai=0;
679.charidatabyteOffset=0; 680.unsignedchardummyShift1;
681.unsignedchardummyShift2; 682.
683.M500PcdSetTmo(106);/*初始化计时器--方式106*/ 684.memcpy(snr_in,snr,4);/*序列号复制*/ 685.
686.WriteIO(RegDecoderControl,0x28);/*任何在比特碰撞出现之后接收到的信号位进被屏蔽为0?大大简化ISO14443A标 准*/
687.ClearBitMask(RegControl,0x08);/*清加密算法位?09H?*/ 688.complete=0;
689.while(!complete&&(status==MI_OK))/*如果这两个条件都成立则在此循环*/ 690.{
691.ResetInfo(MInfo);
692.WriteIO(RegChannelRedundancy,0x03);/*通道冗余寄存器置3--奇校验?每个字节后附加一个校验位?无CRC校 验*/
693.nbits=bcnt%8;/*NBIT=BCNT除以8的余数*/ 694.if(nbits)/*如果不为0*/ 695.{
696.WriteIO(RegBitFraming,nbits<4|nbits);/*如果不为0*/ 697.nbytes=bcnt/8+1;/*NBYTES为收到的序列号字节数?要加一*/ 698.if(nbits==7) 699.{
700.MInfo.cmd=PICC_ANTICOLL1;
701.WriteIO(RegBitFraming,nbits);/**/ 702.} 703.}
704.else/*余数为0*/ 705.{
706.nbytes=bcnt/8;/*NBYTES为收到的序列号字节数*/ 707.}
708.SerBuffer[0]=0x93;/*标准选卡命令*/ 709.SerBuffer[1]=0x20+((bcnt/8)<4)+nbits; 710.
711.for(i=0;inbytes;i++) 712.{
713.SerBuffer[i+2]=snr_in[i];/*序列号输入接口*/ 714.}
715.MInfo.nBytesToSend=2+nbytes;/*输入字节个数*/ 716.
717.status=M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo); 718.if(nbits==7)
719.{/*反碰撞处理过程?*/
720.dummyShift1=0x00;
721.for(i=0;iMInfo.nBytesReceived;i++) 722.{
723.dummyShift2=SerBuffer[i];
724.SerBuffer[i]=(dummyShift1>>(i+1))|(SerBuffer[i]<(7-i)); 725.dummyShift1=dummyShift2; 726.}
727.MInfo.nBitsReceived-=MInfo.nBytesReceived;
728.if(MInfo.collPos)MInfo.collPos+=7-(MInfo.collPos+6)/9; 729.}
730.if(status==MI_OK||status==MI_COLLERR) 731.{
732.if(MInfo.nBitsReceived!=(40-bcnt)) 733.{
734.status=MI_BITCOUNTERR; 735.} 736.else 737.{
738.byteOffset=0; 739.if(nbits!=0) 740.{
741.snr_in[nbytes-1]=snr_in[nbytes-1]|SerBuffer[0]; 742.byteOffset=1; 743.} 744.
745.for(i=0;i(4-nbytes);i++) 746.{
747.snr_in[nbytes+i]=SerBuffer[i+byteOffset]; 748.} 749.
750.if(status!=MI_COLLERR) 751.{
752.dummyShift2=snr_in[0]^snr_in[1]^snr_in[2]^snr_in[3]; 753.dummyShift1=SerBuffer[MInfo.nBytesReceived-1]; 754.if(dummyShift2!=dummyShift1) 755.{
756.status=MI_SERNRERR; 757.} 758.else 759.{
760.complete=1; 761.} 762.} 763.else
764.{
765.bcnt=bcnt+MInfo.collPos-nbits; 766.status=MI_OK; 767.} 768.} 769.} 770.}
771.if(status==MI_OK)/*如果状态标志成功*/ 772.{
773.memcpy(snr,snr_in,4);/*保存序列号*/ 774.} 775.else 776.{
777.memcpy(snr,\不成功?则返回0000*/ 778.}
779.ClearBitMask(RegDecoderControl,0x20);/*清掉反碰撞位*/ 780.
781.returnstatus;/*返回状态值*/ 782.} 783.
784.//////////////////////////////////////////////////////////////////
785.//CascadedSelectcommanddefinedinISO14443(MIFARE) 786./*选择卡?确定序列号是否大于4字节*/
787.//////////////////////////////////////////////////////////////////
788.charM500PiccCascSelect(unsignedchar*snr,unsignedchar*sak) 789.{/*snr为序列号首址?sak为一字节选卡回应值*/ 790.charidatastatus=MI_OK; 791.
792.M500PcdSetTmo(106);/*计时器初始化*/ 793.
794.WriteIO(RegChannelRedundancy,0x0F);/*通道冗余寄存器置f--16bitcrc校验?确定数据帧最后两个字节为crc字节? 奇校验?每个字节后附加一个校验位*/
795.ClearBitMask(RegControl,0x08);/*清加密算法位?09H?*/
796./////////////////////////////////////////////////////////////////////////////////////////////////////////////
797./*送rc500FIFO的相关信息?与命令函数m500pcdcmd()配合*/ 798.ResetInfo(MInfo);/*给rc500的相关信息?与指令相配合*/
799.SerBuffer[0]=0x93;/*给rc500的相关信息?写入指令?选卡?数据*/ 800.SerBuffer[1]=0x70;/*给rc500的相关信息?写入数据*/
801.memcpy(SerBuffer+2,snr,4);/*将原指针snr对应的序列号拷贝到发送缓冲区serbuffer中去*/