⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfrc500.lst

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
 854   2              SndBuffer[0] = 0x93;
 855   2              SndBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits;
 856   2      
 857   2              for (i = 0; i < nbytes; i++)
 858   2              {
C51 COMPILER V8.00   MFRC500                                                               04/23/2009 15:56:15 PAGE 15  

 859   3                  SndBuffer[i + 2] = Snr[i];
 860   3              }
 861   2              MInfo.nBytesToSend   = 2 + nbytes;
 862   2      
 863   2              status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
 864   2              if (nbits == 7)
 865   2              {
 866   3                  dummyShift1 = 0x00;
 867   3                  for (i = 0; i < MInfo.nBytesReceived; i++)
 868   3                  {
 869   4                      dummyShift2 = RcvBuffer[i];
 870   4                      RcvBuffer[i] = (dummyShift1 >> (i+1)) | (RcvBuffer[i] << (7-i));
 871   4                      dummyShift1 = dummyShift2;
 872   4                  }
 873   3                  MInfo.nBitsReceived -= MInfo.nBytesReceived;
 874   3                  if ( MInfo.collPos )
 875   3                      MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
 876   3              }
 877   2      
 878   2              if ( status == MI_OK || status == MI_COLLERR)    // no other occured
 879   2              {
 880   3      
 881   3                  byteOffset = 0;
 882   3                  if( nbits != 0 )
 883   3                  {
 884   4                      Snr[nbytes - 1]|= RcvBuffer[0];
 885   4                      byteOffset = 1;
 886   4                  }
 887   3                  for ( i =0; i < (4 - nbytes); i++)
 888   3                  {
 889   4                      Snr[nbytes + i] = RcvBuffer[i + byteOffset];
 890   4                  }
 891   3                  if (status != MI_COLLERR )
 892   3                  {
 893   4                      snr_crc = Snr[0] ^Snr[1] ^Snr[2] ^Snr[3];
 894   4                      snr_check = RcvBuffer[MInfo.nBytesReceived - 1];
 895   4                      if (snr_crc != snr_check)
 896   4                      {
 897   5                          status = MI_SERNRERR;
 898   5                      }
 899   4                      else
 900   4                      {
 901   5                          complete = 1;
 902   5                      }
 903   4                  }
 904   3                  else
 905   3                  {
 906   4                      bcnt = bcnt + MInfo.collPos - nbits;
 907   4                      status = MI_OK;
 908   4                  }
 909   3              }
 910   2          }
 911   1          ClearBitMask(RegDecoderControl,0x20);
 912   1          return status;
 913   1      }
 914          
 915          uchar M500Select(uchar *Snr)
 916          {
 917   1      
 918   1          uchar idata status = MI_OK;
 919   1          uchar idata size;
 920   1      
C51 COMPILER V8.00   MFRC500                                                               04/23/2009 15:56:15 PAGE 16  

 921   1      
 922   1          M500PcdSetTmo(2);   // 1    050418
 923   1      
 924   1          WriteIO(RegChannelRedundancy,0x0F);
 925   1          ClearBitMask(RegControl,0x08);
 926   1      
 927   1          ResetInfo(&MInfo);
 928   1          SndBuffer[0] = 0x93;
 929   1          SndBuffer[1] = 0x70;
 930   1          memcpy(SndBuffer + 2,Snr,4);
 931   1      
 932   1          SndBuffer[6] = SndBuffer[2]^SndBuffer[3]^SndBuffer[4]^SndBuffer[5];
 933   1          MInfo.nBytesToSend   = 7;
 934   1          status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
 935   1          if (status == MI_OK)
 936   1          {
 937   2              if (MInfo.nBitsReceived != 8)
 938   2              {
 939   3                  status = MI_BITCOUNTERR;
 940   3              }
 941   2              else
 942   2              {
 943   3                 size = RcvBuffer[0];
 944   3              }
 945   2          }
 946   1          return status;
 947   1      }
 948          
 949          // cook key
 950          void M500HostCodeKey(uchar *uncoded,uchar *coded)
 951          {
 952   1          uchar idata cnt = 0;
 953   1          uchar idata ln  = 0;
 954   1          uchar idata hn  = 0;
 955   1      
 956   1          for (cnt = 0; cnt < 6; cnt++)
 957   1          {
 958   2              ln = uncoded[cnt] & 0x0F;
 959   2              hn = uncoded[cnt] >> 4;
 960   2              coded[cnt * 2 + 1] = (~ln << 4) | ln;
 961   2              coded[cnt * 2 ] = (~hn << 4) | hn;
 962   2          }
 963   1      }
 964          
 965          ///////////////////////////////////////////////////////////////////////
 966          //          M I F A R E     H A L T
 967          ///////////////////////////////////////////////////////////////////////
 968          /*
 969          char M500Halt(void)
 970          {
 971             char status = MI_CODEERR;
 972          
 973             M500PcdSetTmo(3);//106);
 974             // ************* Cmd Sequence ********************************** 
 975             ResetInfo(&MInfo);   
 976             SndBuffer[0] = PICC_HALT ;     // Halt command code
 977             SndBuffer[1] = 0x00;         // dummy address
 978             MInfo.nBytesToSend   = 2;
 979             status = M500PcdCmd(PCD_TRANSCEIVE,
 980                                 SndBuffer,
 981                                 RcvBuffer,
 982                                 &MInfo);   
C51 COMPILER V8.00   MFRC500                                                               04/23/2009 15:56:15 PAGE 17  

 983             if (status)
 984             {
 985               // timeout error ==> no NAK received ==> OK
 986               if (status == MI_NOTAGERR || status == MI_ACCESSTIMEOUT)
 987                  status = MI_OK;
 988             }
 989              //reset command register - no response from tag
 990             WriteIO(RegCommand,PCD_IDLE);
 991             return status; 
 992          }
 993          */
 994          
 995          uchar M500PiccAuthState(uchar AuthMode, uchar *snr, uchar Sector)
 996          {
 997   1          uchar idata status = MI_OK;
 998   1      
 999   1          status = ReadIO(RegErrorFlag);
1000   1      
1001   1          if (status != MI_OK)
1002   1          {
1003   2              if (status & 0x40)
1004   2                  status = MI_KEYERR;
1005   2              else
1006   2                  status = MI_AUTHERR;
1007   2          }
1008   1          else
1009   1          {
1010   2              SndBuffer[0] = AuthMode;
1011   2              SndBuffer[1] = Sector*4+3;
1012   2              memcpy(SndBuffer + 2, snr, 4);
1013   2              ResetInfo(&MInfo);
1014   2              MInfo.nBytesToSend = 6;
1015   2              M500PcdSetTmo(3); // 3
1016   2              if ((status = M500PcdCmd(PCD_AUTHENT1, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
1017   2              {
1018   3                  if (ReadIO(RegSecondaryStatus) & 0x07)
1019   3                  {
1020   4                      status = MI_BITCOUNTERR;
1021   4                  }
1022   3                  else
1023   3                  {
1024   4                      ResetInfo(&MInfo);
1025   4                      MInfo.nBytesToSend = 0;
1026   4                      if ((status = M500PcdCmd(PCD_AUTHENT2, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
1027   4                      {
1028   5                          if ( ReadIO(RegControl) & 0x08 )
1029   5                          {
1030   6                              status = MI_OK;
1031   6                          }
1032   5                          else
1033   5                          {
1034   6                              status = MI_AUTHERR;
1035   6                          }
1036   5                      }
1037   4                  }
1038   3              }
1039   2          }
1040   1          return status;
1041   1      }
1042          
1043          uchar M500Auth(uchar Mode, uchar *snr, uchar *Keys, uchar Sector)
1044          {
C51 COMPILER V8.00   MFRC500                                                               04/23/2009 15:56:15 PAGE 18  

1045   1          uchar idata status = MI_OK;
1046   1          uchar idata keycoded[12];
1047   1          uchar idata offset;
1048   1      
1049   1          offset = (Mode == PICC_AUTHENT1A) ? 0 : 6;
1050   1          M500HostCodeKey(Keys,keycoded);
1051   1          FlushFIFO();
1052   1          ResetInfo(&MInfo);
1053   1          memcpy(SndBuffer,keycoded,12);
1054   1          MInfo.nBytesToSend = 12;
1055   1          if ((status = M500PcdCmd(PCD_LOADKEY, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
1056   1          {
1057   2              status = M500PiccAuthState(Mode, snr, Sector);
1058   2          }
1059   1          return status;
1060   1      }
1061          
1062          uchar M500Read(uchar Address,uchar *DataBuff)
1063          {
1064   1      
1065   1          uchar idata status = MI_OK;
1066   1          uchar idata tmp    = 0;
1067   1      
1068   1          FlushFIFO();
1069   1          M500PcdSetTmo(4); //3
1070   1          WriteIO(RegChannelRedundancy,0x0F);
1071   1          ResetInfo(&MInfo);
1072   1          SndBuffer[0] = PICC_READ;
1073   1          SndBuffer[1] = Address;
1074   1          MInfo.nBytesToSend = 2;
1075   1          status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
1076   1          if (status != MI_OK)
1077   1          {
1078   2              if (status != MI_NOTAGERR )
1079   2              {
1080   3                  if (MInfo.nBitsReceived == 4)
1081   3                  {
1082   4                      RcvBuffer[0] &= 0x0f;
1083   4                      if ((RcvBuffer[0] & 0x0a) == 0)
1084   4                      {
1085   5                          status = MI_NOTAUTHERR;
1086   5                      }
1087   4                      else
1088   4                      {
1089   5                          status = MI_CODEERR;
1090   5                      }
1091   4                  }
1092   3              }
1093   2          }
1094   1          else
1095   1          {
1096   2              if (MInfo.nBytesReceived != 16)
1097   2              {
1098   3                  status = MI_BYTECOUNTERR;
1099   3              }
1100   2              else
1101   2              {
1102   3                  memcpy(DataBuff,RcvBuffer,16);
1103   3              }
1104   2          }
1105   1          return status;
1106   1      }
C51 COMPILER V8.00   MFRC500                                                               04/23/2009 15:56:15 PAGE 19  

1107          
1108          uchar M500Write(uchar Address,uchar *DataBuff)
1109          {
1110   1      
1111   1          uchar idata status = MI_OK;
1112   1      
1113   1          ResetInfo(&MInfo);
1114   1          SndBuffer[0] = PICC_WRITE;
1115   1          SndBuffer[1] = Address;
1116   1          MInfo.nBytesToSend = 2;
1117   1          status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
1118   1      
1119   1          if (status != MI_NOTAGERR)
1120   1          {
1121   2              if (MInfo.nBitsReceived != 4)
1122   2              {
1123   3                  status = MI_BITCOUNTERR;
1124   3              }
1125   2              else
1126   2              {
1127   3                  RcvBuffer[0] &= 0x0f;
1128   3                  if ((RcvBuffer[0] & 0x0a) == 0)
1129   3                  {
1130   4                      status = MI_NOTAUTHERR;
1131   4                  }
1132   3                  else
1133   3                  {
1134   4                      if (RcvBuffer[0] == 0x0a)
1135   4                      {
1136   5                          status = MI_OK;
1137   5                      }
1138   4                      else
1139   4                      {
1140   5                          status = MI_CODEERR;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -