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

📄 rc522.lst

📁 f330与mfrc522 通信 构成读卡器 上传源码和原理图。
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.23a  RC522                                                                 04/14/2008 15:21:35 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE RC522
OBJECT MODULE PLACED IN RC522.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe RC522.C DB OE

stmt level    source

   1          #include <intrins.h>
   2          #include "main.h"
   3          #include "mfrc522.h"
   4          #include "timer2.h"
   5          #define   MAXRLEN 18                             
   6          /////////////////////////////////////////////////////////////////////
   7          //功    能:寻卡
   8          //参数说明: req_code[IN]:寻卡方式
   9          //                0x52 = 寻感应区内所有符合14443A标准的卡
  10          //                0x26 = 寻未进入休眠状态的卡
  11          //          pTagType[OUT]:卡片类型代码
  12          //                0x4400 = Mifare_UltraLight
  13          //                0x0400 = Mifare_One(S50)
  14          //                0x0200 = Mifare_One(S70)
  15          //                0x0800 = Mifare_Pro(X)
  16          //                0x4403 = Mifare_DESFire
  17          //返    回: 成功返回MI_OK
  18          /////////////////////////////////////////////////////////////////////
  19          char PcdRequest(unsigned char req_code,unsigned char *pTagType)
  20          {
  21   1         char status;  
  22   1         unsigned int  unLen;
  23   1         unsigned char ucComMF522Buf[MAXRLEN]; 
  24   1      
  25   1         ClearBitMask(Status2Reg,0x08);
  26   1         WriteRawRC(BitFramingReg,0x07);
  27   1         SetBitMask(TxControlReg,0x03);
  28   1       
  29   1         ucComMF522Buf[0] = req_code;
  30   1      
  31   1         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
  32   1         
  33   1         if ((status == MI_OK) && (unLen == 0x10))
  34   1         {    
  35   2             *pTagType     = ucComMF522Buf[0];
  36   2             *(pTagType+1) = ucComMF522Buf[1];
  37   2         }
  38   1         else
  39   1         {   status = MI_ERR;   }
  40   1         
  41   1         return status;
  42   1      }
  43          
  44          /////////////////////////////////////////////////////////////////////
  45          //功    能:防冲撞
  46          //参数说明: pSnr[OUT]:卡片序列号,4字节
  47          //返    回: 成功返回MI_OK
  48          /////////////////////////////////////////////////////////////////////  
  49          char PcdAnticoll(unsigned char *pSnr)
  50          {
  51   1          char status;
  52   1          unsigned char i,snr_check=0;
  53   1          unsigned int  unLen;
  54   1          unsigned char ucComMF522Buf[MAXRLEN]; 
  55   1          
C51 COMPILER V6.23a  RC522                                                                 04/14/2008 15:21:35 PAGE 2   

  56   1      
  57   1          ClearBitMask(Status2Reg,0x08);
  58   1          WriteRawRC(BitFramingReg,0x00);
  59   1          ClearBitMask(CollReg,0x80);
  60   1       
  61   1          ucComMF522Buf[0] = PICC_ANTICOLL1;
  62   1          ucComMF522Buf[1] = 0x20;
  63   1      
  64   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
  65   1      
  66   1          if (status == MI_OK)
  67   1          {
  68   2               for (i=0; i<4; i++)
  69   2               {   
  70   3                   *(pSnr+i)  = ucComMF522Buf[i];
  71   3                   snr_check ^= ucComMF522Buf[i];
  72   3               }
  73   2               if (snr_check != ucComMF522Buf[i])
  74   2               {   status = MI_ERR;    }
  75   2          }
  76   1          
  77   1          SetBitMask(CollReg,0x80);
  78   1          return status;
  79   1      }
  80          
  81          /////////////////////////////////////////////////////////////////////
  82          //功    能:选定卡片
  83          //参数说明: pSnr[IN]:卡片序列号,4字节
  84          //返    回: 成功返回MI_OK
  85          /////////////////////////////////////////////////////////////////////
  86          char PcdSelect(unsigned char *pSnr)
  87          {
  88   1          char status;
  89   1          unsigned char i;
  90   1          unsigned int  unLen;
  91   1          unsigned char ucComMF522Buf[MAXRLEN]; 
  92   1          
  93   1          ucComMF522Buf[0] = PICC_ANTICOLL1;
  94   1          ucComMF522Buf[1] = 0x70;
  95   1          ucComMF522Buf[6] = 0;
  96   1          for (i=0; i<4; i++)
  97   1          {
  98   2              ucComMF522Buf[i+2] = *(pSnr+i);
  99   2              ucComMF522Buf[6]  ^= *(pSnr+i);
 100   2          }
 101   1          CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
 102   1        
 103   1          ClearBitMask(Status2Reg,0x08);
 104   1      
 105   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
 106   1          
 107   1          if ((status == MI_OK) && (unLen == 0x18))
 108   1          {   status = MI_OK;  }
 109   1          else
 110   1          {   status = MI_ERR;    }
 111   1      
 112   1          return status;
 113   1      }
 114          
 115          /////////////////////////////////////////////////////////////////////
 116          //功    能:验证卡片密码
 117          //参数说明: auth_mode[IN]: 密码验证模式
C51 COMPILER V6.23a  RC522                                                                 04/14/2008 15:21:35 PAGE 3   

 118          //                 0x60 = 验证A密钥
 119          //                 0x61 = 验证B密钥 
 120          //          addr[IN]:块地址
 121          //          pKey[IN]:密码
 122          //          pSnr[IN]:卡片序列号,4字节
 123          //返    回: 成功返回MI_OK
 124          /////////////////////////////////////////////////////////////////////               
 125          char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
 126          {
 127   1          char status;
 128   1          unsigned int  unLen;
 129   1          unsigned char i,ucComMF522Buf[MAXRLEN]; 
 130   1      
 131   1          ucComMF522Buf[0] = auth_mode;
 132   1          ucComMF522Buf[1] = addr;
 133   1          for (i=0; i<6; i++)
 134   1          {    ucComMF522Buf[i+2] = *(pKey+i);   }
 135   1          for (i=0; i<6; i++)
 136   1          {    ucComMF522Buf[i+8] = *(pSnr+i);   }
 137   1       //   memcpy(&ucComMF522Buf[2], pKey, 6); 
 138   1       //   memcpy(&ucComMF522Buf[8], pSnr, 4); 
 139   1          
 140   1          status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
 141   1          if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
 142   1          {   status = MI_ERR;   }
 143   1          
 144   1          return status;
 145   1      }
 146          
 147          /////////////////////////////////////////////////////////////////////
 148          //功    能:读取M1卡一块数据
 149          //参数说明: addr[IN]:块地址
 150          //          pData[OUT]:读出的数据,16字节
 151          //返    回: 成功返回MI_OK
 152          ///////////////////////////////////////////////////////////////////// 
 153          char PcdRead(unsigned char addr,unsigned char *pData)
 154          {
 155   1          char status;
 156   1          unsigned int  unLen;
 157   1          unsigned char i,ucComMF522Buf[MAXRLEN]; 
 158   1      
 159   1          ucComMF522Buf[0] = PICC_READ;
 160   1          ucComMF522Buf[1] = addr;
 161   1          CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 162   1         
 163   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 164   1          if ((status == MI_OK) && (unLen == 0x90))
 165   1       //   {   memcpy(pData, ucComMF522Buf, 16);   }
 166   1          {
 167   2              for (i=0; i<16; i++)
 168   2              {    *(pData+i) = ucComMF522Buf[i];   }
 169   2          }
 170   1          else
 171   1          {   status = MI_ERR;   }
 172   1          
 173   1          return status;
 174   1      }
 175          
 176          /////////////////////////////////////////////////////////////////////
 177          //功    能:写数据到M1卡一块
 178          //参数说明: addr[IN]:块地址
 179          //          pData[IN]:写入的数据,16字节
C51 COMPILER V6.23a  RC522                                                                 04/14/2008 15:21:35 PAGE 4   

 180          //返    回: 成功返回MI_OK
 181          /////////////////////////////////////////////////////////////////////                  
 182          char PcdWrite(unsigned char addr,unsigned char *pData)
 183          {
 184   1          char status;
 185   1          unsigned int  unLen;
 186   1          unsigned char i,ucComMF522Buf[MAXRLEN]; 
 187   1          
 188   1          ucComMF522Buf[0] = PICC_WRITE;
 189   1          ucComMF522Buf[1] = addr;
 190   1          CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 191   1       
 192   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 193   1      
 194   1          if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 195   1          {   status = MI_ERR;   }
 196   1              
 197   1          if (status == MI_OK)
 198   1          {
 199   2              //memcpy(ucComMF522Buf, pData, 16);
 200   2              for (i=0; i<16; i++)
 201   2              {    ucComMF522Buf[i] = *(pData+i);   }
 202   2              CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
 203   2      
 204   2              status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
 205   2              if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 206   2              {   status = MI_ERR;   }
 207   2          }
 208   1          
 209   1          return status;
 210   1      }
 211          /*
 212          /////////////////////////////////////////////////////////////////////
 213          //功    能:扣款和充值
 214          //参数说明: dd_mode[IN]:命令字
 215          //               0xC0 = 扣款
 216          //               0xC1 = 充值
 217          //          addr[IN]:钱包地址
 218          //          pValue[IN]:4字节增(减)值,低位在前
 219          //返    回: 成功返回MI_OK
 220          /////////////////////////////////////////////////////////////////////                 
 221          char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
 222          {
 223              char status;
 224              unsigned int  unLen;
 225              unsigned char i,ucComMF522Buf[MAXRLEN]; 
 226              
 227              ucComMF522Buf[0] = dd_mode;
 228              ucComMF522Buf[1] = addr;
 229              CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 230           
 231              status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 232          
 233              if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 234              {   status = MI_ERR;   }
 235                  
 236              if (status == MI_OK)
 237              {
 238                 // memcpy(ucComMF522Buf, pValue, 4);
 239                  for (i=0; i<16; i++)
 240                  {    ucComMF522Buf[i] = *(pValue+i);   }
 241                  CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
C51 COMPILER V6.23a  RC522                                                                 04/14/2008 15:21:35 PAGE 5   

 242                  unLen = 0;
 243                  status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
 244                  if (status != MI_ERR)
 245                  {    status = MI_OK;    }
 246              }
 247              
 248              if (status == MI_OK)
 249              {
 250                  ucComMF522Buf[0] = PICC_TRANSFER;
 251                  ucComMF522Buf[1] = addr;
 252                  CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); 
 253             
 254                  status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 255          
 256                  if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 257                  {   status = MI_ERR;   }
 258              }
 259              return status;
 260          }
 261          /*
 262          /////////////////////////////////////////////////////////////////////
 263          //功    能:备份钱包:调源块->缓冲区->目的块
 264          //参数说明: sourceaddr[IN]:源地址
 265          //          goaladdr[IN]:目标地址
 266          //返    回: 成功返回MI_OK
 267          /////////////////////////////////////////////////////////////////////
 268          char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
 269          {
 270              char status;
 271              unsigned int  unLen;
 272              unsigned char ucComMF522Buf[MAXRLEN]; 
 273          
 274              ucComMF522Buf[0] = PICC_RESTORE;
 275              ucComMF522Buf[1] = sourceaddr;
 276              CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 277              //调源块数据到缓冲区
 278              status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 279          
 280              if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 281              {   status = MI_ERR;   }
 282              
 283              if (status == MI_OK)
 284              {
 285                  ucComMF522Buf[0] = 0;
 286                  ucComMF522Buf[1] = 0;
 287                  ucComMF522Buf[2] = 0;
 288                  ucComMF522Buf[3] = 0;
 289                  CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
 290           
 291                  status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
 292                  if (status != MI_ERR)
 293                  {    status = MI_OK;    }
 294              }

⌨️ 快捷键说明

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