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

📄 mfrc500c.lst

📁 矿工定位系统单端
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.05   MFRC500C                                                              10/09/2004 16:22:30 PAGE 1   


C51 COMPILER V7.05, COMPILATION OF MODULE MFRC500C
OBJECT MODULE PLACED IN mfrc500c.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE mfrc500c.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include "REG51F.H"
   2          #include "absacc.h" 
   3          #include "string.h"
   4          
   5          #include "intrins.h"
   6          #include <rc500.h>
   7          #define watch_dog() WTDC=WTDC|0X20;
   8          //********************************************************************
   9          
  10          #define unchar unsigned char
  11          //********************************************************************
  12           unsigned char idata MLastSelectedSnr[5];
  13           unsigned char idata Returnval; 
  14           unsigned char idata MRcvBuffer[64] ,MSndBuffer[16]; //
  15          static MfCmdInfo  MInfo;
  16          
  17          //********************************************
  18           bit haveset=0;
  19          
  20          /********************************************
  21          void Delay(unsigned int );
  22          ********************************************/
  23          void Delay(unsigned int j)
  24          {
  25   1        unsigned int i;
  26   1        for(i=0;i<j;i++)      _nop_();
  27   1        
  28   1      }
  29          /****************************************************************************
  30          *                                                                           *
  31          * Function:   Mf500PcdConfig                                                  *
  32          *                                                                           *
  33          * Input:                                                                *
  34          * Output:       STATE                                                     *
  35          *                                                                           *
  36          ****************************************************************************/
  37          char Mf500PcdConfig(void)
  38          {
  39   1         char idata status = MI_RESETERR,i;
  40   1         unsigned int idata RstLoopCnt = 0;
  41   1         unsigned int idata CmdWaitCnt = 0;
  42   1       watch_dog();
  43   1      do
  44   1        {      
  45   2         Delay(100);          // wait     
  46   2         PReset=1;            // reset RC500
  47   2         Delay(300);          // wait
  48   2         PReset=0; // clear reset pin
  49   2         Delay(300);          // wait
  50   2         i++;
  51   2         if(i>200)return 0;
  52   2         }
  53   1         
  54   1         // wait until reset command recognized
  55   1        while (ReadRC(RegPage) != 0x80);
C51 COMPILER V7.05   MFRC500C                                                              10/09/2004 16:22:30 PAGE 2   

  56   1      i=0;
  57   1       watch_dog();
  58   1       do
  59   1       {   
  60   2              i++;
  61   2              if(i>200)return 0;
  62   2             WriteRC(RegPage,0x0); // Dummy access in order to determine the bus 
  63   2       }while(ReadRC(RegCommand) != 0x00); // configuration
  64   1            // necessary read access 
  65   1            // after first write access, the returned value
  66   1            // should be zero ==> interface recognized
  67   1            if (ReadRC(RegCommand) != 0x00)
  68   1            {                           
  69   2                status = MI_INTERFACEERR;
  70   2            }
  71   1            else
  72   1            {
  73   2               status = 0;
  74   2            }
  75   1      
  76   1      
  77   1       watch_dog();
  78   1      
  79   1         if(status==0)
  80   1         {
  81   2          // loade2();
  82   2           
  83   2               XBYTE[RegClockQControl]=0x0;
  84   2           XBYTE[RegClockQControl]=0x40;
  85   2              
  86   2               Delay(24);// wait approximately 100 us - calibration in progress
  87   2           ClearBitMask(RegClockQControl,0x40);  // clear bit ClkQCalib for 
  88   2           
  89   2               XBYTE[RegBitPhase]=0xAd;      
  90   2           XBYTE[RegRxThreshold]=0xFF;   
  91   2           XBYTE[RegRxControl2]=01;
  92   2           XBYTE[RegFIFOLevel]=0x1A; // initialize to 26d 
  93   2           XBYTE[RegTimerControl]=0x02;  // TStopRxEnd=0,TStopRxBeg=0,
  94   2           XBYTE[RegIRqPinConfig]=0x3; // interrupt active low enable
  95   2          
  96   2               status=PcdRfReset(1);            // Rf - reset and enable output driver   
  97   2         } 
  98   1         return 1;
  99   1      }
 100          /****************************************************************************
 101          
 102          Request 指令将通知MCM在天线有效的工作范围(距离)内寻找MIFARE 1卡片。如果有
 103          MIFARE 1卡片存在,这一指令将分别与MIFARE 1进行通信,读取MIFARE 1卡片上的卡片
 104          类型号TAGTYPE(2个字节),由MCM传递给MCU,进行识别处理。
 105          程序员可以根据TAGTYPE来区别卡片的不同类型。
 106          对于MIFARE 1卡片来说,返回卡片的TAGTYPE(2个字节)可能为0004h。
 107                                                     
 108          * Function:     Mf500PiccRequest                                                                          
             -    *
 109          * Input:        req_code                                                      *
 110          * Output:       TagType                                                     *
 111          *                                                                           *
 112          ****************************************************************************/
 113          char Mf500PiccRequest(unsigned char req_code, 
 114                                   unsigned char *atq)
 115          {
 116   1         char status = MI_OK;
C51 COMPILER V7.05   MFRC500C                                                              10/09/2004 16:22:30 PAGE 3   

 117   1         char i;
 118   1            
 119   1            PcdSetTmo(2);
 120   1            
 121   1            WriteRC(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
 122   1            ClearBitMask(RegControl,0x08);      // disable crypto 1 unit   
 123   1            WriteRC(RegBitFraming,0x07);        // set TxLastBits to 7 
 124   1            
 125   1            ResetInfo();   
 126   1              //AUXR=0;
 127   1              MSndBuffer[0] = req_code;
 128   1            MInfo.nBytesToSend   = 1;   
 129   1            status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
 130   1           
 131   1            if (status)      // error occured
 132   1            {
 133   2               atq[0] = 0;
 134   2            } 
 135   1            else 
 136   1            {
 137   2               if (MInfo.nBitsReceived != 16) // 2 bytes expected
 138   2               {
 139   3                  atq[0] = 0;
 140   3                  status = MI_BITCOUNTERR;
 141   3               } 
 142   2               else 
 143   2               {
 144   3                  status = MI_OK;
 145   3                  for(i=0;i<2;i++) atq[i]=MRcvBuffer[i];
 146   3               }
 147   2            }
 148   1         
 149   1         return status; 
 150   1      }
 151          /****************************************************************************
 152          *在一个成功的AntiCollision指令之后,或在任何时候当程序员想实际地与已知序列号
 153          卡片进行通信时,必须使用Select指令,以建立与所选卡的通信。为了允许在Select指令
 154          以后对卡片能进行Read/Write等指令的操作,Select指令是很重要的,必须首先被使用
 155           被选择的卡片将给出其自己的存储器容量---已编码的一个BYTE(字节)                                           
             -                               *
 156          * Function:    Mf500PiccSelect                                              *
 157          *                                                                           *
 158          * Input:        SNR     卡号                                                    *
 159          * Output:       Size                                                        *
 160          *                                                                           *
 161          ****************************************************************************/
 162          char Mf500PiccSelect(unsigned char *snr,unsigned char *sak)
 163          {
 164   1         return Mf500PiccCascSelect(0x93,snr,sak); // first cascade level
 165   1      }
 166          
 167          char Mf500PiccCascSelect(unsigned char select_code, 
 168                                  unsigned char *snr,
 169                                  unsigned char *sak)
 170          {
 171   1         char   status = MI_OK; 
 172   1         char i;
 173   1        
 174   1            PcdSetTmo(106);
 175   1          
 176   1            WriteRC(RegChannelRedundancy,0x0F); // RxCRC,TxCRC, Parity enable
 177   1            ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
C51 COMPILER V7.05   MFRC500C                                                              10/09/2004 16:22:30 PAGE 4   

 178   1         
 179   1            ResetInfo();   
 180   1            MSndBuffer[0] = select_code;
 181   1            MSndBuffer[1] = 0x70;         // number of bytes send
 182   1            for(i=0;i<4;i++)  MSndBuffer[2+i]=snr[i];
 183   1            
 184   1            //memcpy(MSndBuffer + 2,snr,4);
 185   1            MSndBuffer[6] = MSndBuffer[2] 
 186   1                            ^ MSndBuffer[3] 
 187   1                            ^ MSndBuffer[4] 
 188   1                            ^ MSndBuffer[5];
 189   1            MInfo.nBytesToSend   = 7;
 190   1            status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
 191   1         
 192   1            sak[0] = 0;   
 193   1            if (status == MI_OK)    // no timeout occured
 194   1            {
 195   2               if (MInfo.nBitsReceived != 8)    // last byte is not complete
 196   2               {
 197   3                  status = MI_BITCOUNTERR;
 198   3               }
 199   2               else
 200   2               {
 201   3                  sak[0] = MRcvBuffer[0];
 202   3                  memcpy(MLastSelectedSnr,snr,4);            
 203   3               }
 204   2            }
 205   1         
 206   1         return status;
 207   1      }
 208          /****************************************************************************
 209          *如果有多于一张的Mifare 1卡片在MCM之天线的有效的工作范围(距离)内 ,必须使用
 210          AntiCollision指令,使MCM能够在这一叠 Mifare 1卡片中选择个别的一张卡片。
 211                                                                                    *
 212          * Function:    Mf500PiccAnticoll//防碰撞函数                               *
 213          *                                                                           *
 214          * Input:        Bcnt, SNR                                                   *
 215          * Output:       SNR                                                         *
 216          *                                                                           *

⌨️ 快捷键说明

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