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

📄 mfucfunc.lst

📁 此程序为13.56MHz的RFID底层读写卡程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
 462   6                        snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
 463   6                        byteOffset = 1;
 464   6                     }
 465   5                     for ( i =0; i < (4 - nbytes); i++)
 466   5                     {
 467   6                        snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
 468   6                     }
 469   5      
 470   5                     if (status != MI_COLLERR ) // no error and no collision
 471   5                     {
 472   6                        // SerCh check
 473   6                        snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
 474   6                        snr_check = MRcvBuffer[MInfo.nBytesReceived - 1];
 475   6                        if (snr_crc != snr_check)
 476   6                        {
 477   7                           status = MI_SERNRERR;
 478   7                        }
 479   6                        else
 480   6                        {
 481   7                           complete = 1;
 482   7                        }
 483   6                     }
 484   5                     else                   // collision occured
 485   5                     {
 486   6                        bcnt = bcnt + MInfo.collPos - nbits;
 487   6                        status = MI_OK;
 488   6                     }
 489   5                  }
 490   4              }
 491   3            }
 492   2         }
 493   1         if (status == MI_OK)
 494   1         {
 495   2            // transfer snr_in to snr
 496   2            memcpy(snr,snr_in,4);
 497   2         }
 498   1         else
 499   1         {
 500   2            memcpy(snr,"0000",4);
 501   2         }
 502   1      
 503   1         //----------------------Einstellungen aus Initialisierung ruecksetzen
 504   1         ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
 505   1      
 506   1         return status;
 507   1      }
 508          
 509          ///////////////////////////////////////////////////////////////////////
 510          //          M I F A R E    S E L E C T
 511          // for std. select
 512          ///////////////////////////////////////////////////////////////////////
 513          char Mf500PiccSelect(unsigned char   *snr,
 514                            unsigned char   *sak)
 515          {
 516   1         return Mf500PiccCascSelect(0x93,snr,sak); // first cascade level
 517   1      }
 518          
 519          ///////////////////////////////////////////////////////////////////////
 520          //          M I F A R E    C A S C A D E D   S E L E C T
 521          //  for extended serial number
C51 COMPILER V4.01,  MFUCFUNC                                                              19/08/04  14:33:23  PAGE 9   

 522          ///////////////////////////////////////////////////////////////////////
 523          char Mf500PiccCascSelect(unsigned char   select_code,
 524                                  unsigned char   *snr,
 525                                  unsigned char   *sak)
 526          {
 527   1         char   status = MI_OK;
 528   1      
 529   1         if ((status = Mf500PcdSetDefaultAttrib()) == MI_OK)
 530   1         {
 531   2            PcdSetTmo(106);
 532   2      
 533   2            WriteRC(RegChannelRedundancy,0x0f); // RxCRC,TxCRC, Parity enable
 534   2            ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
 535   2      
 536   2            //************* Cmd Sequence **********************************
 537   2            ResetInfo(MInfo);
 538   2            MRcvBuffer[0] = select_code;
 539   2            MRcvBuffer[1] = 0x70;         // number of bytes send
 540   2      
 541   2            memcpy(MRcvBuffer + 2,snr,4);
 542   2            MRcvBuffer[6] = MRcvBuffer[2]
 543   2                            ^ MRcvBuffer[3]
 544   2                            ^ MRcvBuffer[4]
 545   2                            ^ MRcvBuffer[5];
 546   2            MInfo.nBytesToSend   = 7;
 547   2            status = PcdSingleResponseCmd(PCD_TRANSCEIVE,
 548   2                                MRcvBuffer,
 549   2                                MRcvBuffer,
 550   2                                &MInfo);
 551   2      
 552   2            *sak = 0;
 553   2            if (status == MI_OK)    // no timeout occured
 554   2            {
 555   3               if (MInfo.nBitsReceived != 8)    // last byte is not complete
 556   3               {
 557   4                  status = MI_BITCOUNTERR;
 558   4               }
 559   3               else
 560   3               {
 561   4                  *sak = MRcvBuffer[0];
 562   4                  memcpy(MLastSelectedSnr,snr,4);
 563   4               }
 564   3            }
 565   2         }
 566   1         return status;
 567   1      }
 568          
 569          ///////////////////////////////////////////////////////////////////////
 570          //       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
 571          ///////////////////////////////////////////////////////////////////////
 572          /*char Mf500PiccActivateIdle(unsigned char   br,
 573                                     unsigned char    *atq,
 574                                     unsigned char   *sak,
 575                                     unsigned char   *uid,
 576                                     unsigned char   *uid_len)
 577          {
 578            unsigned char   cascade_level;
 579            unsigned char   sel_code;
 580            unsigned char   uid_index;
 581            signed char   status;
 582            unsigned char   cmdASEL;
 583          
 584            *uid_len      = 0;
 585          
 586            //call activation with def. divs
 587            status = Mf500PcdSetDefaultAttrib();
C51 COMPILER V4.01,  MFUCFUNC                                                              19/08/04  14:33:23  PAGE 10  

 588            if (status == MI_OK)
 589            {
 590               status = Mf500PiccCommonRequest(PICC_REQIDL,atq);
 591            }
 592            if (status == MI_OK)
 593            {
 594               if((atq[0] & 0x1F) == 0x00) // check lower 5 bits, for tag-type
 595                                           // all tags within this 5 bits have to
 596                                           // provide a bitwise anticollision
 597               {
 598                  status = MI_NOBITWISEANTICOLL;
 599               }
 600            }
 601            if (status == MI_OK)
 602            {
 603                //Get UID in 1 - 3 levels (standard, [double], [triple] )
 604                //-------
 605                switch(br)
 606                {
 607                   case 0: cmdASEL = PICC_ANTICOLL1; break;
 608                   default:
 609                        status = MI_BAUDRATE_NOT_SUPPORTED; break;
 610                }
 611            }
 612            if (status == MI_OK)
 613            {
 614                cascade_level = 0;
 615                uid_index     = 0;
 616                do
 617                {
 618                  //Select code depends on cascade level
 619                  sel_code   = cmdASEL + (2 * cascade_level);
 620                  cmdASEL = PICC_ANTICOLL1; // reset anticollistion level for calculation
 621                  //ANTICOLLISION
 622                  status = Mf500PiccCascAnticoll(sel_code, 0, &uid[uid_index]);
 623                  //SELECT
 624                  if (status == MI_OK)
 625                  {
 626                     status = Mf500PiccCascSelect(sel_code, &uid[uid_index], sak);
 627                     if (status == MI_OK)
 628                     {
 629                        cascade_level++;
 630          
 631                        //we differ cascaded and uncascaded UIDs
 632                        if (*sak & 0x04) // if cascaded, bit 2 is set in answer to select
 633                        {
 634                           //this UID is cascaded, remove the cascaded tag that is
 635                           //0x88 as first of the 4 byte received
 636                           memmove(&uid[uid_index], &uid[uid_index + 1], 3);
 637                           uid_index += 3;
 638                           *uid_len += 3;
 639                        }
 640                        else
 641                        {
 642                           //this UID is not cascaded -> the length is 4 bytes
 643                           uid_index += 4;
 644                           *uid_len += 4;
 645                        }
 646                     }
 647                  }
 648                }
 649                while((status == MI_OK)        // error status
 650                      && (*sak & 0x04)         // no further cascade level
 651                      && (cascade_level < 3)); // highest cascade level is reached
 652             }
 653             if (status == MI_OK)
C51 COMPILER V4.01,  MFUCFUNC                                                              19/08/04  14:33:23  PAGE 11  

 654             {
 655                //Exit function, if cascade level is triple and sak indicates another
 656                //cascase level.
 657                if ((cascade_level == 3) && (*sak & 0x04))
 658                {
 659                   *uid_len = 0;
 660                   status = MI_SERNRERR;
 661                }
 662             }
 663             return (status);
 664          }
 665          
 666          ///////////////////////////////////////////////////////////////////////
 667          //       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
 668          ///////////////////////////////////////////////////////////////////////
 669          char Mf500PiccActivateWakeup(unsigned char   br,
 670                                       unsigned char    *atq,
 671                                       unsigned char    *sak,
 672                                       unsigned char    *uid,
 673                                       unsigned char   uid_len)
 674          {
 675             unsigned char    cascade_level;
 676             unsigned char    uid_index;
 677             unsigned char    tmpuid[4];
 678             unsigned char    sel_code;
 679             unsigned char    cmdASEL;
 680             signed char    status;
 681          
 682             //call activation with def. divs
 683             status = Mf500PcdSetDefaultAttrib();
 684             if (status == MI_OK)
 685             {
 686                status = Mf500PiccCommonRequest(PICC_REQIDL,atq);
 687             }
 688             if (status == MI_OK)
 689             {
 690                if ((atq[0] & 0x1F) == 0x00) // check lower 5 bits, for tag-type
 691                                             // all tags within this 5 bits have to
 692                                             // provide a bitwise anticollision
 693                {
 694                   status = MI_NOBITWISEANTICOLL;
 695                }
 696             }
 697             if (status == MI_OK)

⌨️ 快捷键说明

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