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

📄 m500auc.lst

📁 RC500的函数库
💻 LST
📖 第 1 页 / 共 5 页
字号:
 949   1                            MRcvBuffer,
 950   1                            &MInfo);
 951   1        
 952   1         if (status)      // error occured
 953   1         {
 954   2            *atq = 0;
 955   2         } 
 956   1         else 
 957   1         {
 958   2            if (MInfo.nBitsReceived != 16) // 2 bytes expected
 959   2            {
 960   3               *atq = 0;
 961   3               status = MI_BITCOUNTERR;
 962   3            } 
 963   2            else 
 964   2            {
 965   3               status = MI_OK;
 966   3               memcpy(atq,MRcvBuffer,2);
 967   3            }
 968   2         }
 969   1         return status; 
 970   1      }
 971          
 972          ///////////////////////////////////////////////////////////////////////
 973          //          M I F A R E    A N T I C O L L I S I O N
 974          // for standard select
 975          ///////////////////////////////////////////////////////////////////////
 976          char M500PiccAnticoll (unsigned char bcnt,
 977                               unsigned char *snr)
 978          {
 979   1         return M500PiccCascAnticoll(0x93,bcnt,snr); // first cascade level
 980   1      }
 981          
 982          ///////////////////////////////////////////////////////////////////////
 983          //          M I F A R E    A N T I C O L L I S I O N
 984          // for extended serial numbers
C51 COMPILER V7.07   M500AUC                                                               06/01/2008 12:44:07 PAGE 17  

 985          ///////////////////////////////////////////////////////////////////////
 986          char M500PiccCascAnticoll (unsigned char select_code,
 987                                     unsigned char bcnt,       
 988                                     unsigned char *snr)       
 989          {
 990   1         char idata status = MI_OK;
 991   1         char idata snr_in[4];     // copy of the input parameter snr
 992   1         char idata nbytes = 0;
 993   1         char idata nbits = 0;
 994   1         char idata complete = 0;
 995   1         char idata i        = 0;
 996   1         char idata byteOffset = 0;
 997   1         unsigned char idata snr_crc;
 998   1         unsigned char idata snr_check;
 999   1         unsigned char dummyShift1;       // dummy byte for snr shift
1000   1         unsigned char dummyShift2;       // dummy byte for snr shift   
1001   1       
1002   1         //************* Initialisation ******************************
1003   1         M500PcdSetTmo(106);
1004   1         memcpy(snr_in,snr,4);   
1005   1         
1006   1         WriteIO(RegDecoderControl,0x28); // ZeroAfterColl aktivieren   
1007   1         ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
1008   1            
1009   1         //************** Anticollision Loop ***************************
1010   1         complete = 0;
1011   1      //   bcnt = 0;   // no part of the snr is known
1012   1         while (!complete && (status == MI_OK) )
1013   1         {
1014   2            ResetInfo(MInfo);           
1015   2            WriteIO(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
1016   2            nbits = bcnt % 8;   // remaining number of bits
1017   2            if (nbits)
1018   2            {
1019   3               WriteIO(RegBitFraming,nbits << 4 | nbits); // TxLastBits/RxAlign auf nb_bi
1020   3               nbytes = bcnt / 8 + 1;   
1021   3               // number of bytes known
1022   3      
1023   3               // in order to solve an inconsistancy in the anticollision sequence
1024   3               // (will be solved soon), the case of 7 bits has to be treated in a
1025   3               // separate way - please note the errata sheet
1026   3               if (nbits == 7)
1027   3               {
1028   4                  MInfo.cmd = PICC_ANTICOLL1;   // pass command flag to ISR        
1029   4                  WriteIO(RegBitFraming,nbits); // reset RxAlign to zero
1030   4               }
1031   3            } 
1032   2            else
1033   2            {
1034   3               nbytes = bcnt / 8;
1035   3            }
1036   2      
1037   2            MSndBuffer[0] = select_code;
1038   2            MSndBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits; //number of bytes send
1039   2                     
1040   2            for (i = 0; i < nbytes; i++)  // Sende Buffer beschreiben
1041   2            {
1042   3               MSndBuffer[i + 2] = snr_in[i];
1043   3            }
1044   2            MInfo.nBytesToSend   = 2 + nbytes;   
1045   2       
1046   2            status = M500PcdCmd(PCD_TRANSCEIVE,
C51 COMPILER V7.07   M500AUC                                                               06/01/2008 12:44:07 PAGE 18  

1047   2                               MSndBuffer,
1048   2                               MRcvBuffer,
1049   2                               &MInfo);
1050   2         
1051   2          
1052   2            // in order to solve an inconsistancy in the anticollision sequence
1053   2            // (will be solved soon), the case of 7 bits has to be treated in a
1054   2            // separate way 
1055   2            if (nbits == 7)
1056   2            {
1057   3               // reorder received bits
1058   3               dummyShift1 = 0x00;
1059   3               for (i = 0; i < MInfo.nBytesReceived; i++)
1060   3               {
1061   4                  dummyShift2 = MRcvBuffer[i];
1062   4                  MRcvBuffer[i] = (dummyShift1 >> (i+1)) | (MRcvBuffer[i] << (7-i));
1063   4                  dummyShift1 = dummyShift2;
1064   4               }
1065   3               MInfo.nBitsReceived -= MInfo.nBytesReceived; // subtract received parity bits
1066   3               // recalculation of collision position
1067   3               if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
1068   3            }
1069   2               
1070   2            if ( status == MI_OK || status == MI_COLLERR)    // no other occured
1071   2            {
1072   3               // R e s p o n s e   P r o c e s s i n g   
1073   3               if ( MInfo.nBitsReceived != (40 - bcnt) ) // not 5 bytes answered
1074   3               {
1075   4                  status = MI_BITCOUNTERR; // Exit with error
1076   4               } 
1077   3               else 
1078   3               {
1079   4                  byteOffset = 0;
1080   4                  if( nbits != 0 ) // last byte was not complete
1081   4                  {
1082   5                      snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
1083   5                      byteOffset = 1;
1084   5                  }
1085   4      
1086   4                  for ( i =0; i < (4 - nbytes); i++)     
1087   4                  {
1088   5                     snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
1089   5                  }
1090   4        
1091   4                  if (status != MI_COLLERR ) // no error and no collision
1092   4                  {
1093   5                     // SerCh check
1094   5                     snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
1095   5                     snr_check = MRcvBuffer[MInfo.nBytesReceived - 1];
1096   5                     if (snr_crc != snr_check)
1097   5                     {
1098   6                        status = MI_SERNRERR;
1099   6                     } 
1100   5                     else   
1101   5                     {
1102   6                        complete = 1;
1103   6                     }
1104   5                  }
1105   4                  else                   // collision occured
1106   4                  {
1107   5                     bcnt = bcnt + MInfo.collPos - nbits;
1108   5                     status = MI_OK;
C51 COMPILER V7.07   M500AUC                                                               06/01/2008 12:44:07 PAGE 19  

1109   5                  }
1110   4               }
1111   3            }
1112   2         }
1113   1         if (status == MI_OK)
1114   1         {
1115   2            // transfer snr_in to snr
1116   2            memcpy(snr,snr_in,4);
1117   2         }
1118   1         else
1119   1         {
1120   2            memcpy(snr,"0000",4);
1121   2         }
1122   1      
1123   1         //----------------------Einstellungen aus Initialisierung ruecksetzen 
1124   1         ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
1125   1         
1126   1         return status;  
1127   1      }
1128          
1129          ///////////////////////////////////////////////////////////////////////
1130          //          M I F A R E    S E L E C T 
1131          // for std. select
1132          ///////////////////////////////////////////////////////////////////////
1133          char M500PiccSelect(unsigned char *snr, 
1134                            unsigned char *sak)
1135          {
1136   1         return M500PiccCascSelect(0x93,snr,sak); // first cascade level
1137   1      }
1138          
1139          ///////////////////////////////////////////////////////////////////////
1140          //          M I F A R E    C A S C A D E D   S E L E C T 
1141          //  for extended serial number
1142          ///////////////////////////////////////////////////////////////////////
1143          char M500PiccCascSelect(unsigned char select_code, 
1144                                  unsigned char *snr,
1145                                  unsigned char *sak)
1146          {
1147   1         char idata status = MI_OK; 
1148   1       
1149   1         M500PcdSetTmo(106);
1150   1              
1151   1         WriteIO(RegChannelRedundancy,0x0F); // RxCRC,TxCRC, Parity enable
1152   1         ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
1153   1      
1154   1         //************* Cmd Sequence ********************************** 
1155   1         ResetInfo(MInfo);   
1156   1         MSndBuffer[0] = select_code;
1157   1         MSndBuffer[1] = 0x70;         // number of bytes send
1158   1         
1159   1         memcpy(MSndBuffer + 2,snr,4);
1160   1         MSndBuffer[6] = MSndBuffer[2] 
1161   1                         ^ MSndBuffer[3] 
1162   1                         ^ MSndBuffer[4] 
1163   1                         ^ MSndBuffer[5];
1164   1         MInfo.nBytesToSend   = 7;
1165   1         status = M500PcdCmd(PCD_TRANSCEIVE,
1166   1                             MSndBuffer,
1167   1                             MRcvBuffer,
1168   1                             &MInfo);
1169   1      
1170   1         *sak = 0;   
C51 COMPILER V7.07   M500AUC                                                               06/01/2008 12:44:07 PAGE 20  

1171   1         if (status == MI_OK)    // no timeout occured
1172   1         {
1173   2            if (MInfo.nBitsReceived != 8)    // last byte is not complete
1174   2            {
1175   3               status = MI_BITCOUNTERR;
1176   3            }
1177   2            else
1178   2            {
1179   3               *sak = MRcvBuffer[0];
1180   3               memcpy(MLastSelectedSnr,snr,4);            
1181   3            } 
1182   2         }
1183   1        
1184   1         re

⌨️ 快捷键说明

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