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

📄 m500aucend.lst

📁 51单片机进行mifare1射频卡开发
💻 LST
📖 第 1 页 / 共 5 页
字号:
 723                  //WriteIO(RegPage,0x80);
 724                  if (ReadIO(RegCommand) != 0x00)
 725                  {
 726                      status = MI_INTERFACEERR;
 727                  }
 728              }
 729              return status;
 730          }
 731          
 732          ///////////////////////////////////////////////////////////////////////
 733          // Configures the MF RC500
 734          ///////////////////////////////////////////////////////////////////////
 735          char M500PcdConfig(void)
 736          {
 737              char idata status;
 738          
 739              if ((status = M500PcdReset()) == MI_OK)
 740              {
 741                  WriteIO(RegClockQControl,0x00);
 742                  WriteIO(RegClockQControl,0x40);
 743                  delay_50us(2);
 744                  ClearBitMask(RegClockQControl,0x40);
 745                  WriteIO(RegBitPhase,0xAD);
 746                  WriteIO(RegRxThreshold,0xFF);
 747                  WriteIO(RegRxControl2,0x01);
 748                  WriteIO(RegFIFOLevel,0x1A);
C51 COMPILER V7.03   M500AUCEND                                                            05/07/2004 12:23:37 PAGE 15  

 749                  WriteIO(RegTimerControl,0x02);
 750                  WriteIO(RegIRqPinConfig,0x03);
 751                  M500PcdRfReset(1);
 752              }
 753              return status;
 754          }
 755          
 756          ///////////////////////////////////////////////////////////////
 757          // Key loading into the MF RC500's EEPROM
 758          ///////////////////////////////////////////////////////////////
 759          char M500PcdLoadKeyE2(unsigned char key_type,
 760                                 unsigned char sector,
 761                                 unsigned char *uncoded_keys)
 762          {
 763              signed char status = MI_OK;
 764              unsigned int e2addr = 0x80 + sector * 0x18;
 765              unsigned char coded_keys[12];
 766          
 767              if (key_type == PICC_AUTHENT1B)
 768              {
 769                  e2addr += 12;           // key B offset
 770              }
 771              if ((status = M500HostCodeKey(uncoded_keys,coded_keys)) == MI_OK)
 772              {
 773                  status = PcdWriteE2(e2addr,12,coded_keys);
 774              }
 775              return status;
 776          }
 777          
 778          ///////////////////////////////////////////////////////////////////////
 779          // Write the MF RC500's EEPROM
 780          ///////////////////////////////////////////////////////////////////////
 781          char PcdWriteE2(unsigned int startaddr,
 782                          unsigned char length,
 783                          unsigned char* _data)
 784          {
 785              char status = MI_OK;
 786              ResetInfo(MInfo);
 787              SerBuffer[0] = startaddr & 0xFF;
 788              SerBuffer[1] = (startaddr >> 8) & 0xFF;
 789              memcpy(SerBuffer + 2,_data,length);
 790          
 791              MInfo.nBytesToSend   = length + 2;
 792          
 793              status = M500PcdCmd(PCD_WRITEE2,
 794                                 SerBuffer,
 795                                 &MInfo);
 796              return status;
 797          }
 798          
 799          ///////////////////////////////////////////////////////////////////////
 800          // Select Command defined in ISO14443(MIFARE)
 801          ///////////////////////////////////////////////////////////////////////
 802          char M500PcdMfOutSelect(unsigned char type)
 803          {
 804              WriteIO(RegMfOutSelect,type&0x7);
 805              return MI_OK;
 806          }
 807          
 808          ///////////////////////////////////////////////////////////////////////
 809          // Request Command defined in ISO14443(MIFARE)
 810          // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
C51 COMPILER V7.03   M500AUCEND                                                            05/07/2004 12:23:37 PAGE 16  

 811          // 寻卡,防冲突,选择卡    返回卡类型(2 bytes)+ 卡系列号(4 bytes)
 812          ///////////////////////////////////////////////////////////////////////
 813          char M500PiccCommonRequest(unsigned char req_code,unsigned char *atq)
 814          {
 815              char idata status = MI_OK;
 816          
 817              M500PcdSetTmo(3);
 818              WriteIO(RegChannelRedundancy,0x03);
 819              ClearBitMask(RegControl,0x08);
 820              WriteIO(RegBitFraming,0x07);
 821              SetBitMask(RegTxControl,0x03);
 822              ResetInfo(MInfo);
 823              SerBuffer[0] = req_code;
 824              MInfo.nBytesToSend = 1;
 825          
 826              status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
 827              if (status)
 828              {
 829                  *atq = 0;
 830              }
 831              else
 832              {
 833                  if (MInfo.nBitsReceived != 16)
 834                  {
 835                      *atq = 0;
 836                      status = MI_BITCOUNTERR;
 837                  }
 838                  else
 839                  {
 840                      status = MI_OK;
 841                      memcpy(atq,SerBuffer,2);
 842                  }
 843              }
 844              return status;
 845          }
 846          
 847          ///////////////////////////////////////////////////////////////////
 848          // Cascaded Anti-Collision Command defined in ISO14443(MIFARE)
 849          // 防冲突 读卡的系列号 MLastSelectedSnr
 850          ///////////////////////////////////////////////////////////////////
 851          char M500PiccCascAnticoll (unsigned char bcnt,unsigned char *snr)
 852          {
 853              char idata status = MI_OK;
 854              char idata snr_in[4];
 855              char idata nbytes = 0;
 856              char idata nbits = 0;
 857              char idata complete = 0;
 858              char idata i        = 0;
 859              char idata byteOffset = 0;
 860              unsigned char dummyShift1;
 861              unsigned char dummyShift2;
 862          
 863              M500PcdSetTmo(106);
 864              memcpy(snr_in,snr,4);
 865          
 866              WriteIO(RegDecoderControl,0x28);
 867              ClearBitMask(RegControl,0x08);
 868              complete = 0;
 869              while (!complete && (status == MI_OK) )
 870              {
 871                  ResetInfo(MInfo);
 872                  WriteIO(RegChannelRedundancy,0x03);
C51 COMPILER V7.03   M500AUCEND                                                            05/07/2004 12:23:37 PAGE 17  

 873                  nbits = bcnt % 8;
 874                  if(nbits)
 875                  {
 876                      WriteIO(RegBitFraming,nbits << 4 | nbits);
 877                      nbytes = bcnt / 8 + 1;
 878                      if (nbits == 7)
 879                      {
 880                          MInfo.cmd = PICC_ANTICOLL1;
 881                          WriteIO(RegBitFraming,nbits);
 882                      }
 883                  }
 884                  else
 885                  {
 886                      nbytes = bcnt / 8;
 887                  }
 888                  SerBuffer[0] = 0x93;
 889                  SerBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits;
 890          
 891                  for (i = 0; i < nbytes; i++)
 892                  {
 893                      SerBuffer[i + 2] = snr_in[i];
 894                  }
 895                  MInfo.nBytesToSend   = 2 + nbytes;
 896          
 897                  status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
 898                  if (nbits == 7)
 899                  {
 900                      dummyShift1 = 0x00;
 901                      for (i = 0; i < MInfo.nBytesReceived; i++)
 902                      {
 903                          dummyShift2 = SerBuffer[i];
 904                          SerBuffer[i] = (dummyShift1 >> (i+1)) | (SerBuffer[i] << (7-i));
 905                          dummyShift1 = dummyShift2;
 906                      }
 907                      MInfo.nBitsReceived -= MInfo.nBytesReceived;
 908                      if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
 909                  }
 910                  if ( status == MI_OK || status == MI_COLLERR)
 911                  {
 912                      if ( MInfo.nBitsReceived != (40 - bcnt) )
 913                      {
 914                          status = MI_BITCOUNTERR;
 915                      }
 916                      else
 917                      {
 918                          byteOffset = 0;
 919                          if( nbits != 0 )
 920                          {
 921                              snr_in[nbytes - 1] = snr_in[nbytes - 1] | SerBuffer[0];
 922                              byteOffset = 1;
 923                          }
 924          
 925                          for ( i =0; i < (4 - nbytes); i++)
 926                          {
 927                              snr_in[nbytes + i] = SerBuffer[i + byteOffset];
 928                          }
 929          
 930                          if (status != MI_COLLERR )
 931                          {
 932                              dummyShift2 = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
 933                              dummyShift1 = SerBuffer[MInfo.nBytesReceived - 1];
 934                              if (dummyShift2 != dummyShift1)
C51 COMPILER V7.03   M500AUCEND                                                            05/07/2004 12:23:37 PAGE 18  

 935                              {
 936                                  status = MI_SERNRERR;
 937                              }
 938                              else
 939                              {
 940                                  complete = 1;
 941                              }
 942                          }
 943                          else
 944                          {
 945                              bcnt = bcnt + MInfo.collPos - nbits;
 946                              status = MI_OK;
 947                          }
 948                      }
 949                  }
 950              }
 951              if (status == MI_OK)
 952              {
 953                  memcpy(snr,snr_in,4);
 954              }
 955              else
 956              {
 957                  memcpy(snr,"0000",4);
 958              }
 959              ClearBitMask(RegDecoderControl,0x20);
 960          
 961              return status;
 962          }
 963          
 964          //////////////////////////////////////////////////////////////////
 965          // Cascaded Select command defined in ISO14443(MIFARE)
 966          // 选择卡 Select Card
 967          //////////////////////////////////////////////////////////////////
 968          char M500PiccCascSelect(unsigned char *snr,unsigned char *sak)
 969          {
 970              char idata status = MI_OK;
 971          
 972              M500PcdSetTmo(106);
 973          
 974              WriteIO(RegChannelRedundancy,0x0F);
 975              ClearBitMask(RegControl,0x08);
 976              ResetInfo(MInfo);
 977              SerBuffer[0] = 0x93;
 978              SerBuffer[1] = 0x70;
 979          
 980              memcpy(SerBuffer + 2,snr,4);
 981              SerBuffer[6] = SerBuffer[2] ^ SerBuffer[3] ^ SerBuffer[4] ^ SerBuffer[5];
 982              MInfo.nBytesToSend   = 7;
 983              status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
 984          
 985              *sak = 0;
 986              if (status == MI_OK)
 987              {
 988                  if (MInfo.nBitsReceived != 8)
 989                  {
 990                      status = MI_BITCOUNTERR;
 991                  }
 992                  else
 993                  {
 994                          *sak = SerBuffer[0];
 995                  }
 996              }
C51 COMPILER V7.03   M500AUCEND                                                            05/07/2004 12:23:37 PAGE 19  

 997              return status;
 998          }
 999          
1000          ///////////////////////////////////////////////////////////////////////
1001          // Key loading into the MF RC500's EEPROM
1002          // 校验卡密码(E2)

⌨️ 快捷键说明

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