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

📄 m500auc.lst

📁 学校水POS读卡程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
 953   1      }
 954          
 955          ///////////////////////////////////////////////////////////////////////
 956          //          W R I T E   R E G I S T E R
 957          ///////////////////////////////////////////////////////////////////////
 958          char M500PcdWriteRegister(unsigned char Reg, unsigned char value)
 959          {
 960   1         WriteIO(Reg,value);
 961   1         return MI_OK;
 962   1      }
 963          
 964          ///////////////////////////////////////////////////////////////////////
 965          //          R E A D   R E G I S T E R
 966          ///////////////////////////////////////////////////////////////////////
 967          char M500PcdReadRegister(unsigned char Reg)
 968          {
 969   1         char value;
 970   1      
 971   1         value = ReadIO(Reg);
 972   1         return (value);
 973   1      }
 974          
 975          ///////////////////////////////////////////////////////////////////////
 976          //          M I F A R E    R E Q U E S T
 977          ///////////////////////////////////////////////////////////////////////
 978          char M500PiccRequest(unsigned char req_code, // request code ALL = 0x52
 979                                                       // or IDLE = 0x26
 980                             unsigned char *atq)     // answer to request
 981          {
 982   1         return M500PiccCommonRequest(req_code,atq);
 983   1      }
 984          
C51 COMPILER V7.06   M500AUC                                                               02/25/2005 08:31:58 PAGE 17  

 985          ///////////////////////////////////////////////////////////////////////
 986          //          M I F A R E   C O M M O N   R E Q U E S T
 987          ///////////////////////////////////////////////////////////////////////
 988          char M500PiccCommonRequest(unsigned char req_code,
 989                                   unsigned char *atq)
 990          {
 991   1         char data status = MI_OK;
 992   1      
 993   1          //************* initialize ******************************
 994   1         WriteIO(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
 995   1         Temp = ReadIO(RegChannelRedundancy);
 996   1      
 997   1         ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
 998   1         WriteIO(RegBitFraming,0x07);        // set TxLastBits to 7
 999   1         SetBitMask(RegTxControl,0x03);    // Tx2RF-En, Tx1RF-En enable
1000   1      
1001   1         ResetInfo(MInfo);
1002   1         MSndBuffer[0] = req_code;
1003   1         MInfo.nBytesToSend   = 1;
1004   1         status = M500PcdCmd(PCD_TRANSCEIVE,   //PCD_TRANSCEIVE:收发数据命令 
1005   1                            MSndBuffer,
1006   1                            MRcvBuffer,
1007   1                            &MInfo);
1008   1      
1009   1         if (status)      // error occured
1010   1         {
1011   2            *atq = 0;
1012   2         }
1013   1         else
1014   1         {
1015   2            if (MInfo.nBitsReceived != 16) // 2 bytes expected
1016   2            {
1017   3               *atq = 0;
1018   3               status = MI_BITCOUNTERR;
1019   3            }
1020   2            else
1021   2            {
1022   3               status = MI_OK;
1023   3               Pt = MRcvBuffer;
1024   3               memcpy(atq,MRcvBuffer,2);
1025   3            }
1026   2         }
1027   1         return status;
1028   1      }
1029          
1030          ///////////////////////////////////////////////////////////////////////
1031          //          M I F A R E    A N T I C O L L I S I O N
1032          // for standard select
1033          ///////////////////////////////////////////////////////////////////////
1034          char M500PiccAnticoll (unsigned char bcnt,
1035                               unsigned char *snr)
1036          {
1037   1         return M500PiccCascAnticoll(0x93,bcnt,snr); // first cascade level
1038   1      }
1039          
1040          ///////////////////////////////////////////////////////////////////////
1041          //          M I F A R E    A N T I C O L L I S I O N
1042          // for extended serial numbers
1043          ///////////////////////////////////////////////////////////////////////
1044          char M500PiccCascAnticoll (unsigned char select_code,
1045                                     unsigned char bcnt,
1046                                     unsigned char *snr)
C51 COMPILER V7.06   M500AUC                                                               02/25/2005 08:31:58 PAGE 18  

1047          {
1048   1         char data status = MI_OK;
1049   1         char data snr_in[4];     // copy of the input parameter snr
1050   1         char data nbytes = 0;
1051   1         char data nbits = 0;
1052   1         char data complete = 0;
1053   1         char data i        = 0;
1054   1         char data byteOffset = 0;
1055   1         unsigned char data snr_crc;
1056   1         unsigned char data snr_check;
1057   1         unsigned char dummyShift1;       // dummy byte for snr shift
1058   1         unsigned char dummyShift2;       // dummy byte for snr shift
1059   1      
1060   1         //************* Initialisation ******************************
1061   1         M500PcdSetTmo(106);
1062   1         memcpy(snr_in,snr,4);
1063   1      
1064   1         WriteIO(RegDecoderControl,0x28); // ZeroAfterColl aktivieren
1065   1         Temp = ReadIO(RegDecoderControl);
1066   1         ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
1067   1      
1068   1         //************** Anticollision Loop ***************************
1069   1         complete = 0;
1070   1      //   bcnt = 0;   // no part of the snr is known
1071   1         while (!complete && (status == MI_OK) )
1072   1         {
1073   2            ResetInfo(MInfo);
1074   2            WriteIO(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
1075   2            nbits = bcnt % 8;   // remaining number of bits
1076   2            if (nbits)
1077   2            {
1078   3               WriteIO(RegBitFraming,nbits << 4 | nbits); // TxLastBits/RxAlign auf nb_bi
1079   3               nbytes = bcnt / 8 + 1;
1080   3               // number of bytes known
1081   3      
1082   3               // in order to solve an inconsistancy in the anticollision sequence
1083   3               // (will be solved soon), the case of 7 bits has to be treated in a
1084   3               // separate way - please note the errata sheet
1085   3               if (nbits == 7)
1086   3               {
1087   4                  MInfo.cmd = PICC_ANTICOLL1;   // pass command flag to ISR
1088   4                  WriteIO(RegBitFraming,nbits); // reset RxAlign to zero
1089   4               }
1090   3            }
1091   2            else
1092   2            {
1093   3               nbytes = bcnt / 8;
1094   3            }
1095   2      
1096   2            MSndBuffer[0] = select_code;
1097   2            MSndBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits; //number of bytes send
1098   2      
1099   2            for (i = 0; i < nbytes; i++)  // Sende Buffer beschreiben
1100   2            {
1101   3               MSndBuffer[i + 2] = snr_in[i];
1102   3            }
1103   2            MInfo.nBytesToSend   = 2 + nbytes;
1104   2            
1105   2            status = M500PcdCmd(PCD_TRANSCEIVE,
1106   2                               MSndBuffer,
1107   2                               MRcvBuffer,
1108   2                               &MInfo);
C51 COMPILER V7.06   M500AUC                                                               02/25/2005 08:31:58 PAGE 19  

1109   2      
1110   2      
1111   2            // in order to solve an inconsistancy in the anticollision sequence
1112   2            // (will be solved soon), the case of 7 bits has to be treated in a
1113   2            // separate way
1114   2            if (nbits == 7)
1115   2            {
1116   3               // reorder received bits
1117   3               dummyShift1 = 0x00;
1118   3               for (i = 0; i < MInfo.nBytesReceived; i++)
1119   3               {
1120   4                  dummyShift2 = MRcvBuffer[i];
1121   4                  MRcvBuffer[i] = (dummyShift1 >> (i+1)) | (MRcvBuffer[i] << (7-i));
1122   4                  dummyShift1 = dummyShift2;
1123   4               }
1124   3               MInfo.nBitsReceived -= MInfo.nBytesReceived; // subtract received parity bits
1125   3               // recalculation of collision position
1126   3               if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
1127   3            }
1128   2      
1129   2            if ( status == MI_OK || status == MI_COLLERR)    // no other occured
1130   2            {
1131   3               // R e s p o n s e   P r o c e s s i n g
1132   3               if ( MInfo.nBitsReceived != (40 - bcnt) ) // not 5 bytes answered
1133   3               {
1134   4                  status = MI_BITCOUNTERR; // Exit with error
1135   4               }
1136   3               else
1137   3               {
1138   4                  byteOffset = 0;
1139   4                  if( nbits != 0 ) // last byte was not complete
1140   4                  {
1141   5                      snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
1142   5                      byteOffset = 1;
1143   5                  }
1144   4      
1145   4                  for ( i =0; i < (4 - nbytes); i++)
1146   4                  {
1147   5                     snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
1148   5                  }
1149   4      
1150   4                  if (status != MI_COLLERR ) // no error and no collision
1151   4                  {
1152   5                     // SerCh check
1153   5                     snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
1154   5                     snr_check = MRcvBuffer[MInfo.nBytesReceived - 1];
1155   5                     if (snr_crc != snr_check)
1156   5                     {
1157   6                        status = MI_SERNRERR;
1158   6                     }
1159   5                     else
1160   5                     {
1161   6                        complete = 1;
1162   6                     }
1163   5                  }
1164   4                  else                   // collision occured
1165   4                  {
1166   5                     bcnt = bcnt + MInfo.collPos - nbits;
1167   5                     status = MI_OK;
1168   5                  }
1169   4               }
1170   3            }
C51 COMPILER V7.06   M500AUC                                                               02/25/2005 08:31:58 PAGE 20  

1171   2         }
1172   1         if (status == MI_OK)
1173   1         {
1174   2            // transfer snr_in to snr
1175   2            memcpy(snr,snr_in,4);
1176   2         }
1177   1         else
1178   1         {
1179   2            memcpy(snr,"0000",4);
1180   2         }
1181   1      
1182   1         //----------------------Einstellungen aus Initialisierung ruecksetzen
1183   1         ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
1184   1      
1185   1         return status;
1186   1      }
1187          
1188          ///////////////////////////////////////////////////////////////////////
1189          //          M I F 

⌨️ 快捷键说明

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