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

📄 mfucfunc.c

📁 此程序为13.56MHz的RFID底层读写卡程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <string.h>
#include <intrins.h>
#include <MfRc500.h>
#include <PcdShare.h>
#include <RcComm.h>
#include <PcdUtils.h>
#include <MfErrNo.h>

#include "Hardware.h"
#include "MfReg.h"

//unsigned char MSndBuffer[MAX_RF_BUF_SIZE];// = 0; ///< pointer to the transmit buffer
//unsigned char MRcvBuffer[MAX_RF_BUF_SIZE];// = 0; ///< pointer to the receive buffer
//volatile unsigned char * MSndBuffer;// = 0; ///< pointer to the transmit buffer
volatile unsigned char * MRcvBuffer;// = 0; ///< pointer to the receive buffer

volatile MfCmdInfo MInfo;

unsigned char idata MLastSelectedSnr[5];
unsigned char idata RicRxTxBuffer[26];   // idata
extern uchar Block_Index;            //test        202.11.26

#define TCLFSDSNDMAX   8   ///< max. frame size send
#define TCLFSDRECMAX   8   ///< max. frame size rcv
#define TCLDSMAX       3   ///< max. baudrate divider PICC --> PCD
#define TCLDRMAX       3   ///< max. baudrate divider PCD --> PICC

#define TCLDSDFLT      0   ///< default baudrate divider PICC --> PCD
#define TCLDRDFLT      0   ///< default baudrate divider PCD --> PICC


char Mf500PcdConfig(void);
char Mf500ActiveAntennaSlaveConfig(void);
char Mf500ActiveAntennaMasterConfig(void);
char Mf500PiccRequest(unsigned char req_code, // request code ALL = 0x52
                                           // or IDLE = 0x26
                   unsigned char *atq);     // answer to request
char Mf500PiccCommonRequest(unsigned char req_code,
                         unsigned char *atq);
char Mf500PiccAnticoll (unsigned char bcnt,
                     unsigned char *snr);
char Mf500PiccCascAnticoll (unsigned char select_code,
                         unsigned char bcnt,
                         unsigned char *snr);
char Mf500PiccSelect(unsigned char *snr,
                  unsigned char   *sak);
char Mf500PiccCascSelect(unsigned char   select_code,
                        unsigned char   *snr,
                        unsigned char   *sak);
char Mf500PiccActivateIdle(unsigned char   br,
                           unsigned char   *atq,
                           unsigned char   *sak,
                           unsigned char   *uid,
                           unsigned char   *uid_len);
char Mf500PiccActivateWakeup(unsigned char   br,
                             unsigned char   *atq,
                             unsigned char   *sak,
                             unsigned char   *uid,
                             unsigned char   uid_len);
char Mf500PiccAuth(unsigned char   key_type,    // PICC_AUTHENT1A or PICC_AUTHENT1B
                   unsigned char   key_addr,    // key address in reader storage
                   unsigned char   block);       // block number which should be
                                              // authenticated
char Mf500PiccAuthE2(   unsigned char   auth_mode,   // PICC_AUTHENT1A or PICC_AUTHENT1B
                     unsigned char   *snr,        // 4 bytes card serial number
                     unsigned char   key_sector,  // 0 <= key_sector <= 15
                     unsigned char   block);      //  0 <= block <= 256
char Mf500HostCodeKey(  unsigned char   *uncoded, // 6 bytes key value uncoded
                     unsigned char   *coded);   // 12 bytes key value coded
char Mf500PiccAuthKey(  unsigned char   auth_mode,
                     unsigned char   *snr,
                     unsigned char   *keys,
                     unsigned char   block);
char Mf500PcdLoadKeyE2(unsigned char   key_type,
                       unsigned char   sector,
                       unsigned char   *uncoded_keys);
char Mf500PiccAuthState(   unsigned char   auth_mode,
                        unsigned char   *snr,
                        unsigned char   block);

char Mf500PiccRead(  unsigned char   addr,
                  unsigned char   * DataTemp);
char Mf500PiccWrite( unsigned char   addr,
                  unsigned char   *DataTemp);
char Mf500PiccValue(unsigned char   dd_mode,
                   unsigned char   addr,
                   unsigned char   *value,
                   unsigned char   trans_addr);
char Mf500PiccValueDebit(unsigned char   dd_mode,
                         unsigned char   addr,
                         unsigned char   *value);
char Mf500PiccHalt(void);
char Mf500PcdSetDefaultAttrib(void);
char Mf500PiccExchangeBlock(unsigned char    *send_data,
                           unsigned char   send_bytelen,
                           unsigned char    *rec_data,
                           unsigned char    *rec_bytelen,
                           unsigned char   append_crc,
                           unsigned long   timeout );

char Mf500LoadConfig(void);
//////////////////////////////////////////////////////////////////////
//        S E T   D E F A U L T    C O M M   A T T R I B S
///////////////////////////////////////////////////////////////////////
char Mf500PcdSetDefaultAttrib(void)
{
   //char status = MI_OK;
   //Mf500ActiveAntennaMasterConfig();
   //WriteRC(RegControl,0x00);//////////by allen
   //WriteRC(RegTxControl,0x10);
   //WriteRC(RegMfOutSelect,0x00);
   return MI_OK;
}


///////////////////////////////////////////////////////////////////////
//      M I F A R E   M O D U L E   C O N F I G U R A T I O N
///////////////////////////////////////////////////////////////////////
/*char Mf500LoadConfig(void)
{
   char  status = MI_OK;
   unsigned char code InitRegValue[32]={
        0x00,0x58,0x3f,0x3f,0x19,0x13,0x00,0x00,
        0x00,0x73,0x08,0xad,0xff,0x00,0x41,0x00,
        0x00,0x06,0x03,0x63,0x63,0x00,0x00,0x00,
        0x00,0x08,0x07,0x06,0x0a,0x02,0x00,0x00
        };

   FlushFIFO();    // empty FIFO
   ResetInfo(MInfo);
   MRcvBuffer[0]=0x10; // addr low byte
   MRcvBuffer[1]=0x00; // addr high byte

   memcpy(MRcvBuffer+2,InitRegValue,32);

   MInfo.nBytesToSend=34;

   status = PcdSingleResponseCmd(PCD_WRITEE2,
                   MRcvBuffer,
                   MRcvBuffer,
                   &MInfo); // write e2
   return status;

} */
/********************************************************************
/*                  Mf500PcdConfig                                  *
********************************************************************/
char Mf500PcdConfig(void)
{
   char   status = MI_RESETERR;
   unsigned short   RstLoopCnt = 0;
   unsigned short   CmdWaitCnt = 0;

   // global initialisation
   MRcvBuffer  = RicRxTxBuffer;  // initialise send buffer
   MRcvBuffer  = RicRxTxBuffer;  // initialise receive buffer

   status = PcdReset();        ///////////////////

   if (status == MI_OK)
   {

     // test clock Q calibration - value in the range of 0x46 expected
     WriteRC(RegClockQControl,0x0);
     WriteRC(RegClockQControl,0x40);
//     SleepUs(24);  // wait approximately 100 us - calibration in progress
     SleepMs(1);
    ClearBitMask(RegClockQControl,0x40); // clear bit ClkQCalib for
                                          // further calibration

     // The following values for RegBitPhase and
     // RegRxThreshold represents an optimal
     // value for our demo package. For user
     // implementation some changes could be
     // necessary
     // initialize bit phase
     WriteRC(RegBitPhase,0xad);//0xad

     // initialize minlevel
     WriteRC(RegRxThreshold,0xff);//0xff   YinHan

     // disable auto power down
     WriteRC(RegRxControl2,0x01);//0x01

     // Depending on the processing speed of the
     // operation environment, the waterlevel
     // can be adapted. (not very critical for
     // mifare applications)
     // initialize waterlevel to value 4
     WriteRC(RegFIFOLevel,0x1a); // initialize to 26d//0x1a

     //Timer Konfiguration
     WriteRC(RegTimerControl,0x02);  // TStopRxEnd=0,TStopRxBeg=0,////////0x02
                                   // TStartTxEnd=1,TStartTxBeg=0
                                   // timer must be stopped manually

     WriteRC(RegIRqPinConfig,0x02); //delete allen 6.06 interrupt active low enable//03

     WriteRC(RegRxWait,0x06);// WriteRC(RegRxWait,0x06);  change for YinHan
     //WriteRC(RegCwConductance,0xf0);//////////by allen
     //WriteRC(RegTxControl,0x53);
     //WriteRC(RegMfOutSelect,0x00);
     PcdRfReset(10);//10ms            // Rf - reset and enable output driver

   }

   return status;
}

///////////////////////////////////////////////////////////////////////
//          M I F A R E   R E M O T E   A N T E N N A
//  Configuration of slave module
///////////////////////////////////////////////////////////////////////
/*char Mf500ActiveAntennaSlaveConfig(void)
{
   char  status = MI_OK;

   FlushFIFO();    // empty FIFO
   ResetInfo(MInfo);
   MRcvBuffer[0] = 0x10; // addr low byte
   MRcvBuffer[1] = 0x00; // addr high byte

   MRcvBuffer[2] = 0x00; // Page
   MRcvBuffer[3] = 0x7B; // RegTxControl modsource 11,InvTx2,Tx2RFEn,TX1RFEn
   MRcvBuffer[4] = 0x3F; // RegCwConductance
   MRcvBuffer[5] = 0x3F; // RFU13
   MRcvBuffer[6] = 0x19; // RFU14
   MRcvBuffer[7] = 0x13; // RegModWidth
   MRcvBuffer[8] = 0x00; // RFU16
   MRcvBuffer[9] = 0x00; // RFU17

   MRcvBuffer[10] = 0x00; // Page
   MRcvBuffer[11] = 0x73; // RegRxControl1
   MRcvBuffer[12] = 0x08; // RegDecoderControl
   MRcvBuffer[13] = 0x6c; // RegBitPhase
   MRcvBuffer[14] = 0xFF; // RegRxThreshold
   MRcvBuffer[15] = 0x00; // RFU1D
   MRcvBuffer[16] = 0x00; // RegRxControl2
   MRcvBuffer[17] = 0x00; // RegClockQControl

   MRcvBuffer[18] = 0x00; // Page
   MRcvBuffer[19] = 0x06; // RegRxWait
   MRcvBuffer[20] = 0x03; // RegChannelRedundancy
   MRcvBuffer[21] = 0x63; // RegCRCPresetLSB
   MRcvBuffer[22] = 0x63; // RegCRCPresetMSB
   MRcvBuffer[23] = 0x0;  // RFU25
   MRcvBuffer[24] = 0x04; // RegMfOutSelect enable mfout = manchester HT
   MRcvBuffer[25] = 0x00; // RFU27

   // PAGE 5      FIFO, Timer and IRQ-Pin Configuration
   MRcvBuffer[26] = 0x00; // Page
   MRcvBuffer[27] = 0x08; // RegFIFOLevel
   MRcvBuffer[28] = 0x07; // RegTimerClock
   MRcvBuffer[29] = 0x06; // RegTimerControl
   MRcvBuffer[30] = 0x0A; // RegTimerReload
   MRcvBuffer[31] = 0x02; // RegIRqPinConfig
   MRcvBuffer[32] = 0x00; // RFU
   MRcvBuffer[33] = 0x00; // RFU
   MInfo.nBytesToSend   = 34;

   status = PcdSingleResponseCmd(PCD_WRITEE2,
                   MRcvBuffer,
                   MRcvBuffer,
                   &MInfo); // write e2
   return status;
}
  */
///////////////////////////////////////////////////////////////////////
//          M I F A R E   R E M O T E   A N T E N N A
//  Configuration of master module
///////////////////////////////////////////////////////////////////////
/*char Mf500ActiveAntennaMasterConfig(void)
{
   char  status = MI_OK;

   WriteRC(RegRxControl2,0x42);
   WriteRC(RegTxControl,0x10);
   WriteRC(RegBitPhase,0x11);
//WriteRC(RegControl,0x00);//////by allen
   return status;
}
*/
///////////////////////////////////////////////////////////////////////
//          M I F A R E    R E Q U E S T
///////////////////////////////////////////////////////////////////////
char Mf500PiccRequest(unsigned char req_code, // request code ALL = 0x52
                                           // or IDLE = 0x26
                   unsigned char *atq)     // answer to request
{
  return Mf500PiccCommonRequest(req_code,atq);
}

///////////////////////////////////////////////////////////////////////
//          M I F A R E   C O M M O N   R E Q U E S T
///////////////////////////////////////////////////////////////////////
char Mf500PiccCommonRequest(unsigned char req_code,
                         unsigned char *atq)
{
   char status = MI_OK;
   //unsigned char  nByte;
   //unsigned char  Temp;
   //unsigned char  Temp1;
    //************* initialize ******************************
   if ((status = Mf500PcdSetDefaultAttrib()) == MI_OK)
   {

      PcdSetTmo(106);//allen 10.23//106

      WriteRC(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
      ClearBitMask(RegControl,0x08);      // disable crypto 1 unit
      WriteRC(RegBitFraming,0x07);        // set TxLastBits to 7////0x07

⌨️ 快捷键说明

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