802.SerBuffer[6]=SerBuffer[2]^SerBuffer[3]^SerBuffer[4]^SerBuffer[5];/*序号中四字节按位异或得到crc校 验字节*/
803.MInfo.nBytesToSend=7;/*给rc500的相关信息?与指令相配合?须发送的字节数*/
804.//////////////////////////////////////////////////////////////////////////////////////////////////////////////
805.status=M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);/*执行命令函数m500pcdcmd()?返回STATUS*/ 806.
807.*sak=0;/*sak选卡回应值先置0*/
808.if(status==MI_OK)/*返回值为执行成功标志MI_OK*/ 809.{
810.if(MInfo.nBitsReceived!=8)/*如果接收到的不是一个字节*/ 811.{
812.status=MI_BITCOUNTERR;/*则置标志位为MI_BITCOUNTERR*/ 813.}
814.else/*如果接收到的是一个字节*/ 815.{
816.*sak=SerBuffer[0];/*则将该值存于SAK中*/ 817.} 818.}
819.returnstatus;/*返回状态值*/ 820.} 821.
822.///////////////////////////////////////////////////////////////////////
823.//KeyloadingintotheMFRC500'sEEPROM
824.//将RC500的EEROM中的密钥载入密钥缓冲区,校验卡密码(E2)
825.///////////////////////////////////////////////////////////////////////
826.charM500PiccAuthE2(unsignedcharauth_mode,unsignedchar*snr, 827.unsignedcharkeynr,unsignedcharblock)
828./*入口参数?AUTH_MODE:A/B卡型号?SNR:卡序列号?KEYNR:密钥所在扇区数?BLOCK:密钥所在数据块*/ 829.{
830.charidatastatus=MI_OK;
831.unsignedinte2addr=0x80+keynr*0x18;/*得出密钥在EEROM中的位置*/ 832.//unsignedchar*e2addrbuf=(unsignedchar*)&e2addr; 833.unsignedchar*e2addrbuf; 834.
835.e2addrbuf=(unsignedchar*)&e2addr;
836.if(auth_mode==PICC_AUTHENT1B)/*如果是B类卡*/ 837.{
838.e2addr+=12;/*密钥地址加12*/ 839.}
840.FlushFIFO();
841.ResetInfo(MInfo); 842.
843.memcpy(SerBuffer,e2addrbuf,2);/*从E2ADDRBUF中取出存密钥的EEROM地址?两个字节?*/
844.SerBuffer[2]=SerBuffer[0]; 845.SerBuffer[0]=SerBuffer[1]; 846.SerBuffer[1]=SerBuffer[2]; 847.MInfo.nBytesToSend=2;
848.if((status=M500PcdCmd(PCD_LOADKEYE2,SerBuffer,&MInfo))==MI_OK) 849.{/*下载密钥成功*/
850.status=M500PiccAuthState(auth_mode,snr,block); 851.}/*三轮认证*/
852.returnstatus;/*返回状态值*/ 853.} 854.
855.///////////////////////////////////////////////////////////////////////
856.//Authenticationkeycoding 857./*将密钥换成标准密钥形式*/
858.///////////////////////////////////////////////////////////////////////
859.charM500HostCodeKey(unsignedchar*uncoded,unsignedchar*coded) 860.{
861.charidatastatus=MI_OK; 862.unsignedcharidatacnt=0; 863.unsignedcharidataln=0; 864.unsignedcharidatahn=0;
865.for(cnt=0;cnt6;cnt++)/*密钥由6字节转成12字节*/ 866.{
867.ln=uncoded[cnt]&0x0F;/*密钥一字节的低四位*/ 868.hn=uncoded[cnt]>>4;/*密钥一字节的高四位*/ 869.coded[cnt*2+1]=(~ln<4)|ln; 870.coded[cnt*2]=(~hn<4)|hn; 871.}
872.returnMI_OK; 873.} 874.
875.///////////////////////////////////////////////////////////////////
876.//AuthenticationwithdirectkeyloadingfromtheuC
877./*直接校验从单片机载入的密码?针对卡中的某一块数据来说?16块?每
块64字节?*/
878.//////////////////////////////////////////////////////////////////
879.charM500PiccAuthKey(unsignedcharauth_mode, 880.unsignedchar*snr, 881.unsignedchar*keys, 882.unsignedcharblock) 883.{
884.charidatastatus=MI_OK; 885.//PcdSetTmo(2); 886.FlushFIFO();
887.ResetInfo(MInfo);
888.memcpy(SerBuffer,keys,12); 889.MInfo.nBytesToSend=12;
890.if((status=M500PcdCmd(PCD_LOADKEY,SerBuffer,&MInfo))==MI_OK) 891.{/*直接从单片机载入密码到FIFO,然后再载入密钥缓冲区*/ 892.status=M500PiccAuthState(auth_mode,snr,block); 893.}/*三轮认证*/ 894.returnstatus; 895.}/*返回状态值*/ 896.
897.///////////////////////////////////////////////////////////////////////
898./*三轮认证函数*/
899.///////////////////////////////////////////////////////////////////////
900.charM500PiccAuthState(unsignedcharauth_mode,unsignedchar*snr,unsignedcharblock)
901.{/*入口参数?AUTH_MODE:A/B卡型号?SNR:卡序列号?BLOCK:要访问所在数据块*/
902.charidatastatus=MI_OK; 903.unsignedcharidatai=0; 904.
905.status=ReadIO(RegErrorFlag);/*读RC500中的错误标志寄存器*/ 906.if(status!=MI_OK)/*载入密钥不成功*/ 907.{
908.if(status&0x40) 909.{
910.status=MI_KEYERR;/*密钥出错标志*/ 911.} 912.else 913.{
914.status=MI_AUTHERR;/*认证出错标志*/ 915.}
916.}
917.else/*载入密钥成功*/ 918.{/*三轮认证开始*/ 919.
920.SerBuffer[0]=auth_mode; 921.SerBuffer[1]=block;
922.memcpy(SerBuffer+2,snr,4); 923.ResetInfo(MInfo);
924.MInfo.nBytesToSend=6;
925./*上面为认证命令1的入口参数?卡型?要访问的数据块?序列号?相关流动信息?要发送的字节数*/
926.if((status=M500PcdCmd(PCD_AUTHENT1,SerBuffer,&MInfo))==MI_OK) 927.{
928.if(ReadIO(RegSecondaryStatus)&0x07) 929.{
930.status=MI_BITCOUNTERR;/*认证不成功?置比特计数标志*/ 931.} 932.else 933.{
934.ResetInfo(MInfo);
935.MInfo.nBytesToSend=0;
936./*上面为认证命令2的入口参数?相关流动信息?要发送的字节数*/ 937.if((status=M500PcdCmd(PCD_AUTHENT2, 938.SerBuffer,
939.&MInfo))==MI_OK) 940.{
941.if(ReadIO(RegControl)&0x08) 942.{
943.status=MI_OK;/*认证成功?RC500会自动置CRYTON=1*/ 944.} 945.else 946.{
947.status=MI_AUTHERR;/*认证不成功?置认证错标志*/ 948.} 949.} 950.} 951.} 952.}
953.returnstatus;/*返回状态值*/ 954.} 955.
956.//////////////////////////////////////////////////////////////// 957.//Readthemifarecard
958./*读卡?一次读出16字节?一整块BLOCK?*/
959.//////////////////////////////////////////////////////////////// 960.charM500PiccRead(unsignedcharaddr,unsignedchar*_data)
961.{/*addr=卡的EEROM数据块地址?_data=读出数据的存放区首址*/ 962.charidatastatus=MI_OK; 963.charidatatmp=0; 964.
965.FlushFIFO();/*清缓冲区*/ 966.
967.M500PcdSetTmo(3);
968.WriteIO(RegChannelRedundancy,0x0F);/*16比特CRC检测?奇校验*/ 969.ResetInfo(MInfo);
970.SerBuffer[0]=PICC_READ; 971.SerBuffer[1]=addr; 972.MInfo.nBytesToSend=2;
973./*上面为读卡命令的入口参数?读指令?块地址?发送字节数*/ 974.status=M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);/*读卡*/ 975.
976.if(status!=MI_OK)/*读卡命令执行不成功*/ 977.{
978.if(status!=MI_NOTAGERR) 979.{
980.if(MInfo.nBitsReceived==4) 981.{
982.SerBuffer[0]&=0x0f;
983.if((SerBuffer[0]&0x0a)==0) 984.{
985.status=MI_NOTAUTHERR;/*认证不成功?或说无权访问*/ 986.} 987.else 988.{
989.status=MI_CODEERR;/*编码错误*/ 990.} 991.} 992.}
993.memcpy(_data,\执行不成功则返回00*/ 994.}
995.else/*读卡命令执行成功*///ResponseProcessing 996.{
997.if(MInfo.nBytesReceived!=16)/*如果返回的字节个数不是16*/ 998.{
999.status=MI_BYTECOUNTERR;/*则置字节计数错*/
1000.memcpy(_data,\返回00*/ 1001.}
1002.else/*如果返回的字节个数是16*/