射频 rc500代码完全注释(5)

2019-09-01 23:58

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*/


射频 rc500代码完全注释(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:质量和密度复习学案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: