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

📄 mfrc500uc.lst

📁 C++ 非接触读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
 742   3               if (nbits)
 743   3               {
 744   4                  WriteRC(RegBitFraming,nbits << 4 | nbits); // TxLastBits/RxAlign auf nb_bi
 745   4                  nbytes = bcnt / 8 + 1;   
 746   4                  // number of bytes known
 747   4         
 748   4                  // in order to solve an inconsistancy in the anticollision sequence
 749   4                  // (will be solved soon), the case of 7 bits has to be treated in a
 750   4                  // separate way
 751   4                  if (nbits == 7 )
 752   4                  {
 753   5                      MInfo.RxAlignWA = 1;
 754   5                     MInfo.nBitsReceived = 7; // set flag for 7 bit anticoll, which is evaluated
 755   5                                              // in the ISRnBitsReceived        
 756   5                     WriteRC(RegBitFraming,nbits); // reset RxAlign to zero
 757   5                  }
 758   4               } 
 759   3               else
 760   3               {
 761   4                  nbytes = bcnt / 8;
 762   4               }
 763   3        
 764   3               MSndBuffer[0] = select_code;
 765   3               MSndBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits; //number of bytes send
 766   3                        
 767   3               for (i = 0; i < nbytes; i++)  // Sende Buffer beschreiben
 768   3               {
 769   4                  MSndBuffer[i + 2] = snr_in[i];
 770   4               }
 771   3               MInfo.nBytesToSend   = 2 + nbytes;    
 772   3      
 773   3               status = PcdSingleResponseCmd(PCD_TRANSCEIVE,
 774   3                                  MSndBuffer,
 775   3                                  MRcvBuffer,
 776   3                                  &MInfo);
 777   3      
 778   3                // in order to solve an inconsistancy in the anticollision sequence
 779   3                // (will be solved soon), the case of 7 bits has to be treated in a
 780   3                // separate way 
 781   3               if (MInfo.RxAlignWA)
 782   3               {
 783   4                  // reorder received bits
 784   4                  dummyShift1 = 0x00;
 785   4                  for (i = 0; i < MInfo.nBytesReceived; i++)
 786   4                  {
 787   5                      dummyShift2 = MRcvBuffer[i];
 788   5                      MRcvBuffer[i] = (dummyShift1 >> (i+1)) | (MRcvBuffer[i] << (7-i));
 789   5                      dummyShift1 = dummyShift2;
 790   5                  }
 791   4                  MInfo.nBitsReceived -= MInfo.nBytesReceived; // subtract received parity bits
 792   4                  // recalculation of collision position
 793   4                  if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
 794   4               }
 795   3               
 796   3               if ( status == MI_OK || status == MI_COLLERR)    // no other occured
 797   3               {
 798   4      
 799   4                  byteOffset = 0;
C51 COMPILER V7.00  MFRC500UC                                                              03/05/2004 15:25:52 PAGE 14  

 800   4                  if ( nbits != 0 )           // last byte was not complete
 801   4                  {
 802   5                     snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
 803   5                     byteOffset = 1;
 804   5                  }
 805   4                  for ( i =0; i < (4 - nbytes); i++)     
 806   4                  {
 807   5                     snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
 808   5                  }
 809   4                  // R e s p o n s e   P r o c e s s i n g   
 810   4                  if ( MInfo.nBitsReceived != (40 - bcnt) ) // not 5 bytes answered
 811   4                  {
 812   5                     status = MI_BITCOUNTERR;
 813   5                  } 
 814   4                  else 
 815   4                  {
 816   5                     if (status != MI_COLLERR ) // no error and no collision
 817   5                     {
 818   6                        // SerCh check
 819   6                        snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
 820   6                        snr_check = MRcvBuffer[MInfo.nBytesReceived - 1];
 821   6                        if (snr_crc != snr_check)
 822   6                        {
 823   7                           status = MI_SERNRERR;
 824   7                        } 
 825   6                        else   
 826   6                        {
 827   7                           complete = 1;
 828   7                        }
 829   6                     }
 830   5                     else                   // collision occured
 831   5                     {
 832   6                        bcnt = bcnt + MInfo.collPos - nbits;
 833   6                        status = MI_OK;
 834   6                     }
 835   5                  }
 836   4              }
 837   3            }
 838   2         }
 839   1         // transfer snr_in to snr - even in case of an error - for 
 840   1         // debugging reasons
 841   1         memcpy(snr,snr_in,4);
 842   1      
 843   1         //----------------------Einstellungen aus Initialisierung ruecksetzen 
 844   1         ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
 845   1         
 846   1         return status;  
 847   1      }
 848          
 849          ///////////////////////////////////////////////////////////////////////
 850          //          M I F A R E    S E L E C T 
 851          // for std. select
 852          ///////////////////////////////////////////////////////////////////////
 853          char Mf500PiccSelect(unsigned char *snr, 
 854                            unsigned char *sak)
 855          {
 856   1         return Mf500PiccCascSelect(0x93,snr,sak); // first cascade level
 857   1      }
 858          
 859          ///////////////////////////////////////////////////////////////////////
 860          //          M I F A R E    C A S C A D E D   S E L E C T 
 861          //  for extended serial number
C51 COMPILER V7.00  MFRC500UC                                                              03/05/2004 15:25:52 PAGE 15  

 862          ///////////////////////////////////////////////////////////////////////
 863          char Mf500PiccCascSelect(unsigned char select_code, 
 864                                  unsigned char *snr,
 865                                  unsigned char *sak)
 866          {
 867   1         char   status = MI_OK; 
 868   1      
 869   1         if ((status = Mf500PcdSetDefaultAttrib()) == MI_OK)
 870   1         {
 871   2            PcdSetTmo(106);
 872   2          
 873   2            WriteRC(RegChannelRedundancy,0x0F); // RxCRC,TxCRC, Parity enable
 874   2            ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
 875   2         
 876   2            //************* Cmd Sequence ********************************** 
 877   2            ResetInfo(MInfo);   
 878   2            MSndBuffer[0] = select_code;
 879   2            MSndBuffer[1] = 0x70;         // number of bytes send
 880   2            
 881   2            memcpy(MSndBuffer + 2,snr,4);
 882   2            MSndBuffer[6] = MSndBuffer[2] 
 883   2                            ^ MSndBuffer[3] 
 884   2                            ^ MSndBuffer[4] 
 885   2                            ^ MSndBuffer[5];
 886   2            MInfo.nBytesToSend   = 7;
 887   2            MInfo.DisableDF = 1;
 888   2            status = PcdSingleResponseCmd(PCD_TRANSCEIVE,
 889   2                                MSndBuffer,
 890   2                                MRcvBuffer,
 891   2                                &MInfo);
 892   2         
 893   2            *sak = 0;   
 894   2            if (status == MI_OK)    // no timeout occured
 895   2            {
 896   3               if (MInfo.nBitsReceived != 8)    // last byte is not complete
 897   3               {
 898   4                  status = MI_BITCOUNTERR;
 899   4               }
 900   3               else
 901   3               {
 902   4                  memcpy(MLastSelectedSnr,snr,4);            
 903   4               }
 904   3            }
 905   2            // copy received data in any case - for debugging reasons
 906   2            *sak = MRcvBuffer[0];
 907   2         }
 908   1         return status;
 909   1      }
 910          
 911          ///////////////////////////////////////////////////////////////////////
 912          //       M I F A R E   P I C C   A C T I V A T I O N    S E Q E N C E
 913          ///////////////////////////////////////////////////////////////////////
 914          char Mf500PiccActivateIdle(unsigned char br,
 915                                     unsigned char *atq, 
 916                                     unsigned char *sak, 
 917                                     unsigned char *uid, 
 918                                     unsigned char *uid_len)
 919          {
 920   1        unsigned char cascade_level;
 921   1        unsigned char sel_code;
 922   1        unsigned char uid_index;
 923   1        signed char status;
C51 COMPILER V7.00  MFRC500UC                                                              03/05/2004 15:25:52 PAGE 16  

 924   1        unsigned char cmdASEL;
 925   1      
 926   1        *uid_len      = 0;
 927   1      
 928   1        //call activation with def. divs
 929   1        status = Mf500PcdSetDefaultAttrib();
 930   1        if (status == MI_OK)
 931   1        {
 932   2           status = Mf500PiccCommonRequest(PICC_REQIDL,atq);
 933   2        }
 934   1        if (status == MI_OK)
 935   1        {
 936   2           if((atq[0] & 0x1F) == 0x00) // check lower 5 bits, for tag-type
 937   2                                       // all tags within this 5 bits have to
 938   2                                       // provide a bitwise anticollision
 939   2           {
 940   3              status = MI_NOBITWISEANTICOLL;
 941   3           }
 942   2        }
 943   1        if (status == MI_OK)
 944   1        {
 945   2            //Get UID in 1 - 3 levels (standard, [double], [triple] )
 946   2            //-------
 947   2            switch(br)
 948   2            {
 949   3               case 0: cmdASEL = PICC_ANTICOLL1; break;
 950   3               case 1: cmdASEL = PICC_ANTICOLL11; break;
 951   3               case 2: cmdASEL = PICC_ANTICOLL12; break;
 952   3               case 3: cmdASEL = PICC_ANTICOLL13; break;
 953   3               default:
 954   3                    status = MI_BAUDRATE_NOT_SUPPORTED; break;
 955   3            }
 956   2        }
 957   1        if (status == MI_OK)
 958   1        {
 959   2            cascade_level = 0;
 960   2            uid_index     = 0;
 961   2            do
 962   2            {
 963   3              //Select code depends on cascade level
 964   3              sel_code   = cmdASEL + (2 * cascade_level);
 965   3              cmdASEL = PICC_ANTICOLL1; // reset anticollistion level for calculation
 966   3              //ANTICOLLISION
 967   3              status = Mf500PiccCascAnticoll(sel_code, 0, &uid[uid_index]);
 968   3              //SELECT
 969   3              if (status == MI_OK)
 970   3              {
 971   4                 status = Mf500PiccCascSelect(sel_code, &uid[uid_index], sak);
 972   4                 if (status == MI_OK)
 973   4                 {
 974   5                    cascade_level++;
 975   5      
 976   5                    //we differ cascaded and uncascaded UIDs
 977   5                    if (*sak & 0x04) // if cascaded, bit 2 is set in answer to select
 978   5                    {
 979   6                       //this UID is cascaded, remove the cascaded tag that is
 980   6                       //0x88 as first of the 4 byte received
 981   6                       memmove(&uid[uid_index], &uid[uid_index + 1], 3);
 982   6                       uid_index += 3;
 983   6                       *uid_len += 3;
 984   6                    }
 985   5                    else
C51 COMPILER V7.00  MFRC500UC                                                              03/05/2004 15:25:52 PAGE 17  

 986   5                    {
 987   6                       //this UID is not cascaded -> the length is 4 bytes
 988   6                       uid_index += 4;
 989   6                       *uid_len += 4;
 990   6                    }
 991   5                 }

⌨️ 快捷键说明

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