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

📄 m500auc.lst

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
 944   1      }
 945          
 946          ///////////////////////////////////////////////////////////////////////
 947          //          M I F A R E   C O M M O N   R E Q U E S T 
 948          ///////////////////////////////////////////////////////////////////////
 949          char M500PiccCommonRequest(unsigned char req_code, 
 950                                   unsigned char *atq)
 951          {
 952   1         char idata status = MI_OK;
 953   1      
 954   1          //************* initialize ******************************
 955   1         WriteIO(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
 956   1         ClearBitMask(RegControl,0x08);    // disable crypto 1 unit   
 957   1         WriteIO(RegBitFraming,0x07);        // set TxLastBits to 7 
 958   1         SetBitMask(RegTxControl,0x03);    // Tx2RF-En, Tx1RF-En enable
 959   1         
 960   1         ResetInfo(MInfo);   
 961   1         MSndBuffer[0] = req_code;
 962   1         MInfo.nBytesToSend   = 1;   
 963   1         status = M500PcdCmd(PCD_TRANSCEIVE,
 964   1                            MSndBuffer,
 965   1                            MRcvBuffer,
 966   1                            &MInfo);
 967   1        
 968   1         if (status)      // error occured
 969   1         {
 970   2            *atq = 0;
 971   2         } 
 972   1         else 
 973   1         {
 974   2            if (MInfo.nBitsReceived != 16) // 2 bytes expected
 975   2            {
 976   3               *atq = 0;
 977   3               status = MI_BITCOUNTERR;
 978   3            } 
 979   2            else 
C51 COMPILER V7.02a   M500AUC                                                              07/24/2003 11:05:36 PAGE 17  

 980   2            {
 981   3               status = MI_OK;
 982   3               memcpy(atq,MRcvBuffer,2);
 983   3            }
 984   2         }
 985   1         return status; 
 986   1      }
 987          
 988          ///////////////////////////////////////////////////////////////////////
 989          //          M I F A R E    A N T I C O L L I S I O N
 990          // for standard select
 991          ///////////////////////////////////////////////////////////////////////
 992          char M500PiccAnticoll (unsigned char bcnt,
 993                               unsigned char *snr)
 994          {
 995   1         return M500PiccCascAnticoll(0x93,bcnt,snr); // first cascade level
 996   1      }
 997          
 998          ///////////////////////////////////////////////////////////////////////
 999          //          M I F A R E    A N T I C O L L I S I O N
1000          // for extended serial numbers
1001          ///////////////////////////////////////////////////////////////////////
1002          char M500PiccCascAnticoll (unsigned char select_code,
1003                                     unsigned char bcnt,       
1004                                     unsigned char *snr)       
1005          {
1006   1         char idata status = MI_OK;
1007   1         char idata snr_in[4];     // copy of the input parameter snr
1008   1         char idata nbytes = 0;
1009   1         char idata nbits = 0;
1010   1         char idata complete = 0;
1011   1         unsigned char idata i        = 0;
1012   1         char idata byteOffset = 0;
1013   1         unsigned char idata snr_crc;
1014   1         unsigned char idata snr_check;
1015   1         unsigned char dummyShift1;       // dummy byte for snr shift
1016   1         unsigned char dummyShift2;       // dummy byte for snr shift   
1017   1       
1018   1         //************* Initialisation ******************************
1019   1         M500PcdSetTmo(106);
1020   1         memcpy(snr_in,snr,4);   
1021   1         
1022   1         WriteIO(RegDecoderControl,0x28); // ZeroAfterColl aktivieren   
1023   1         ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
1024   1            
1025   1         //************** Anticollision Loop ***************************
1026   1         complete = 0;
1027   1      //   bcnt = 0;   // no part of the snr is known
1028   1         while (!complete && (status == MI_OK) )
1029   1         {
1030   2            ResetInfo(MInfo);           
1031   2            WriteIO(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
1032   2            nbits = bcnt % 8;   // remaining number of bits
1033   2            if (nbits)
1034   2            {
1035   3               WriteIO(RegBitFraming,nbits << 4 | nbits); // TxLastBits/RxAlign auf nb_bi
1036   3               nbytes = bcnt / 8 + 1;   
1037   3               // number of bytes known
1038   3      
1039   3               // in order to solve an inconsistancy in the anticollision sequence
1040   3               // (will be solved soon), the case of 7 bits has to be treated in a
1041   3               // separate way - please note the errata sheet
C51 COMPILER V7.02a   M500AUC                                                              07/24/2003 11:05:36 PAGE 18  

1042   3               if (nbits == 7)
1043   3               {
1044   4                  MInfo.cmd = PICC_ANTICOLL1;   // pass command flag to ISR        
1045   4                  WriteIO(RegBitFraming,nbits); // reset RxAlign to zero
1046   4               }
1047   3            } 
1048   2            else
1049   2            {
1050   3               nbytes = bcnt / 8;
1051   3            }
1052   2      
1053   2            MSndBuffer[0] = select_code;
1054   2            MSndBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits; //number of bytes send
1055   2                     
1056   2            for (i = 0; i < nbytes; i++)  // Sende Buffer beschreiben
1057   2            {
1058   3               MSndBuffer[i + 2] = snr_in[i];
1059   3            }
1060   2            MInfo.nBytesToSend   = 2 + nbytes;   
1061   2       
1062   2            status = M500PcdCmd(PCD_TRANSCEIVE,
1063   2                               MSndBuffer,
1064   2                               MRcvBuffer,
1065   2                               &MInfo);
1066   2         
1067   2          
1068   2            // in order to solve an inconsistancy in the anticollision sequence
1069   2            // (will be solved soon), the case of 7 bits has to be treated in a
1070   2            // separate way 
1071   2            if (nbits == 7)
1072   2            {
1073   3               // reorder received bits
1074   3               dummyShift1 = 0x00;
1075   3               for (i = 0; i < MInfo.nBytesReceived; i++)
1076   3               {
1077   4                  dummyShift2 = MRcvBuffer[i];
1078   4                  MRcvBuffer[i] = (dummyShift1 >> (i+1)) | (MRcvBuffer[i] << (7-i));
1079   4                  dummyShift1 = dummyShift2;
1080   4               }
1081   3               MInfo.nBitsReceived -= MInfo.nBytesReceived; // subtract received parity bits
1082   3               // recalculation of collision position
1083   3               if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
1084   3            }
1085   2               
1086   2            if ( status == MI_OK || status == MI_COLLERR)    // no other occured
1087   2            {
1088   3               // R e s p o n s e   P r o c e s s i n g   
1089   3               if ( MInfo.nBitsReceived != (40 - bcnt) ) // not 5 bytes answered
1090   3               {
1091   4                  status = MI_BITCOUNTERR; // Exit with error
1092   4               } 
1093   3               else 
1094   3               {
1095   4                  byteOffset = 0;
1096   4                  if( nbits != 0 ) // last byte was not complete
1097   4                  {
1098   5                      snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
1099   5                      byteOffset = 1;
1100   5                  }
1101   4      
1102   4                  for ( i =0; i < (4 - nbytes); i++)     
1103   4                  {
C51 COMPILER V7.02a   M500AUC                                                              07/24/2003 11:05:36 PAGE 19  

1104   5                     snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
1105   5                  }
1106   4        
1107   4                  if (status != MI_COLLERR ) // no error and no collision
1108   4                  {
1109   5                     // SerCh check
1110   5                     snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
1111   5                     snr_check = MRcvBuffer[MInfo.nBytesReceived - 1];
1112   5                     if (snr_crc != snr_check)
1113   5                     {
1114   6                        status = MI_SERNRERR;
1115   6                     } 
1116   5                     else   
1117   5                     {
1118   6                        complete = 1;
1119   6                     }
1120   5                  }
1121   4                  else                   // collision occured
1122   4                  {
1123   5                     bcnt = bcnt + MInfo.collPos - nbits;
1124   5                     status = MI_OK;
1125   5                  }
1126   4               }
1127   3            }
1128   2         }
1129   1         if (status == MI_OK)
1130   1         {
1131   2            // transfer snr_in to snr
1132   2            memcpy(snr,snr_in,4);
1133   2         }
1134   1         else
1135   1         {
1136   2            memcpy(snr,"0000",4);
1137   2         }
1138   1      
1139   1         //----------------------Einstellungen aus Initialisierung ruecksetzen 
1140   1         ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
1141   1         
1142   1         return status;  
1143   1      }
1144          
1145          ///////////////////////////////////////////////////////////////////////
1146          //          M I F A R E    S E L E C T 
1147          // for std. select
1148          ///////////////////////////////////////////////////////////////////////
1149          char M500PiccSelect(unsigned char *snr, 
1150                            unsigned char *sak)
1151          {
1152   1         return M500PiccCascSelect(0x93,snr,sak); // first cascade level
1153   1      }
1154          
1155          ///////////////////////////////////////////////////////////////////////
1156          //          M I F A R E    C A S C A D E D   S E L E C T 
1157          //  for extended serial number
1158          ///////////////////////////////////////////////////////////////////////
1159          char M500PiccCascSelect(unsigned char select_code, 
1160                                  unsigned char *snr,
1161                                  unsigned char *sak)
1162          {
1163   1         char idata status = MI_OK; 
1164   1       
1165   1         M500PcdSetTmo(106);
C51 COMPILER V7.02a   M500AUC                                                              07/24/2003 11:05:36 PAGE 20  

1166   1              
1167   1         WriteIO(RegChannelRedundancy,0x0F); // RxCRC,TxCRC, Parity enable
1168   1         ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
1169   1      
1170   1         //************* Cmd Sequence ********************************** 
1171   1         ResetInfo(MInfo);   
1172   1         MSndBuffer[0] = select_code;
1173   1         MSndBuffer[1] = 0x70;         // number of bytes send
1174   1         
1175   1         memcpy(MSndBuffer + 2,snr,4);
1176   1         MSndBuffer[6] = MSndBuffer[2] 
1177   1                         ^ MSndBuffer[3] 
1178   1                         ^ MSndBuffer[4] 

⌨️ 快捷键说明

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