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

📄 m500auc.lst

📁 本程序是基于FM1702的射频卡读写器的单片机控制的C语言程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
 945   1         ResetInfo(MInfo);   
 946   1         MSndBuffer[0] = req_code;
 947   1         MInfo.nBytesToSend   = 1;   
 948   1         status = M500PcdCmd(PCD_TRANSCEIVE,
 949   1                            MSndBuffer,
 950   1                            MRcvBuffer,
 951   1                            &MInfo);
 952   1        
 953   1         if (status)      // error occured
 954   1         {
 955   2              //      printf("status = %d    error occured \r\n");
 956   2            *atq = 0;
 957   2         } 
 958   1         else 
 959   1         {
 960   2      //              printf("MInfo.nBitsReceived = %d\r\n", MInfo.nBitsReceived);
 961   2            if (MInfo.nBitsReceived != 16) // 2 bytes expected
 962   2            {
 963   3               *atq = 0;
 964   3               status = MI_BITCOUNTERR;
 965   3            } 
 966   2            else 
 967   2            {
 968   3               status = MI_OK;
 969   3               memcpy(atq,MRcvBuffer,2);
 970   3            }
 971   2         }
 972   1      //      printf("status = %d\r\n", status);
 973   1         return status; 
 974   1      }
 975          
 976          ///////////////////////////////////////////////////////////////////////
 977          //          M I F A R E    A N T I C O L L I S I O N
 978          // for standard select
 979          ///////////////////////////////////////////////////////////////////////
 980          char M500PiccAnticoll (unsigned char bcnt,
 981                               unsigned char *snr)
 982          {
 983   1         return M500PiccCascAnticoll(0x93,bcnt,snr); // first cascade level
 984   1      }
C51 COMPILER V7.06   M500AUC                                                               12/04/2007 19:24:45 PAGE 17  

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

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

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

1171   1                             MRcvBuffer,
1172   1                             &MInfo);
1173   1      
1174   1         *sak = 0;   
1175   1         if (status == MI_OK)    // no timeout occured
1176   1         {
1177   2            if (MInfo.nBitsReceived != 8)    // last byte is not complete
1178   2            {
1179   3               s

⌨️ 快捷键说明

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