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

📄 rc522.lst

📁 这是一个单片机与MFRC522通信的程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 214   2              {   status = MI_ERR;   }
 215   2          }
 216   1          
 217   1          return status;
 218   1      }
 219          
 220          /////////////////////////////////////////////////////////////////////
 221          //功    能:扣款和充值
 222          //参数说明: dd_mode[IN]:命令字
 223          //               0xC0 = 扣款
 224          //               0xC1 = 充值
 225          //          addr[IN]:钱包地址
 226          //          pValue[IN]:4字节增(减)值,低位在前
 227          //返    回: 成功返回MI_OK
 228          /////////////////////////////////////////////////////////////////////                 
 229          char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
 230          {
 231   1          char status;
 232   1          unsigned int  unLen;
 233   1          unsigned char i,ucComMF522Buf[MAXRLEN]; 
 234   1          
 235   1          ucComMF522Buf[0] = dd_mode;
 236   1          ucComMF522Buf[1] = addr;
 237   1          CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 238   1       
 239   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 240   1      
 241   1          if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
C51 COMPILER V7.07   RC522                                                                 02/12/2007 09:56:17 PAGE 5   

 242   1          {   status = MI_ERR;   }
 243   1              
 244   1          if (status == MI_OK)
 245   1          {
 246   2             // memcpy(ucComMF522Buf, pValue, 4);
 247   2              for (i=0; i<16; i++)
 248   2              {    ucComMF522Buf[i] = *(pValue+i);   }
 249   2              CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
 250   2              unLen = 0;
 251   2              status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
 252   2              if (status != MI_ERR)
 253   2              {    status = MI_OK;    }
 254   2          }
 255   1          
 256   1          if (status == MI_OK)
 257   1          {
 258   2              ucComMF522Buf[0] = PICC_TRANSFER;
 259   2              ucComMF522Buf[1] = addr;
 260   2              CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); 
 261   2         
 262   2              status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 263   2      
 264   2              if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 265   2              {   status = MI_ERR;   }
 266   2          }
 267   1          return status;
 268   1      }
 269          
 270          /////////////////////////////////////////////////////////////////////
 271          //功    能:备份钱包
 272          //参数说明: sourceaddr[IN]:源地址
 273          //          goaladdr[IN]:目标地址
 274          //返    回: 成功返回MI_OK
 275          /////////////////////////////////////////////////////////////////////
 276          char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
 277          {
 278   1          char status;
 279   1          unsigned int  unLen;
 280   1          unsigned char ucComMF522Buf[MAXRLEN]; 
 281   1      
 282   1          ucComMF522Buf[0] = PICC_RESTORE;
 283   1          ucComMF522Buf[1] = sourceaddr;
 284   1          CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 285   1       
 286   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 287   1      
 288   1          if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 289   1          {   status = MI_ERR;   }
 290   1          
 291   1          if (status == MI_OK)
 292   1          {
 293   2              ucComMF522Buf[0] = 0;
 294   2              ucComMF522Buf[1] = 0;
 295   2              ucComMF522Buf[2] = 0;
 296   2              ucComMF522Buf[3] = 0;
 297   2              CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
 298   2       
 299   2              status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
 300   2              if (status != MI_ERR)
 301   2              {    status = MI_OK;    }
 302   2          }
 303   1          
C51 COMPILER V7.07   RC522                                                                 02/12/2007 09:56:17 PAGE 6   

 304   1          if (status != MI_OK)
 305   1          {    return MI_ERR;   }
 306   1          
 307   1          ucComMF522Buf[0] = PICC_TRANSFER;
 308   1          ucComMF522Buf[1] = goaladdr;
 309   1      
 310   1          CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 311   1       
 312   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 313   1      
 314   1          if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 315   1          {   status = MI_ERR;   }
 316   1      
 317   1          return status;
 318   1      }
 319          
 320          
 321          /////////////////////////////////////////////////////////////////////
 322          //功    能:命令卡片进入休眠状态
 323          //返    回: 成功返回MI_OK
 324          /////////////////////////////////////////////////////////////////////
 325          char PcdHalt(void)
 326          {
 327   1          char status;
 328   1          unsigned int  unLen;
 329   1          unsigned char ucComMF522Buf[MAXRLEN]; 
 330   1      
 331   1          ucComMF522Buf[0] = PICC_HALT;
 332   1          ucComMF522Buf[1] = 0;
 333   1          CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 334   1       
 335   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 336   1      
 337   1          return MI_OK;
 338   1      }
 339          
 340          /////////////////////////////////////////////////////////////////////
 341          //用MF522计算CRC16函数
 342          /////////////////////////////////////////////////////////////////////
 343          void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
 344          {
 345   1          unsigned char i,n;
 346   1          ClearBitMask(DivIrqReg,0x04);
 347   1          WriteRawRC(CommandReg,PCD_IDLE);
 348   1          SetBitMask(FIFOLevelReg,0x80);
 349   1          for (i=0; i<len; i++)
 350   1          {   WriteRawRC(FIFODataReg, *(pIndata+i));   }
 351   1          WriteRawRC(CommandReg, PCD_CALCCRC);
 352   1          i = 0xFF;
 353   1          do 
 354   1          {
 355   2              n = ReadRawRC(DivIrqReg);
 356   2              i--;
 357   2          }
 358   1          while ((i!=0) && !(n&0x04));
 359   1          pOutData[0] = ReadRawRC(CRCResultRegL);
 360   1          pOutData[1] = ReadRawRC(CRCResultRegM);
 361   1      }
 362          
 363          /////////////////////////////////////////////////////////////////////
 364          //功    能:复位RC522
 365          //返    回: 成功返回MI_OK
C51 COMPILER V7.07   RC522                                                                 02/12/2007 09:56:17 PAGE 7   

 366          /////////////////////////////////////////////////////////////////////
 367          char PcdReset(void)
 368          {
 369   1          MF522_RST=1;
 370   1          _nop_();
 371   1          MF522_RST=0;
 372   1          _nop_();
 373   1          MF522_RST=1;
 374   1           _nop_();
 375   1          WriteRawRC(CommandReg,PCD_RESETPHASE);
 376   1          _nop_();
 377   1          
 378   1          WriteRawRC(ModeReg,0x3D);            //和Mifare卡通讯,CRC初始值0x6363
 379   1          WriteRawRC(TReloadRegL,30);           
 380   1          WriteRawRC(TReloadRegH,0);
 381   1          WriteRawRC(TModeReg,0x8D);
 382   1          WriteRawRC(TPrescalerReg,0x3E);
 383   1          WriteRawRC(TxAutoReg,0x40);     
 384   1          return MI_OK;
 385   1      }
 386          //////////////////////////////////////////////////////////////////////
 387          //设置RC632的工作方式 
 388          //////////////////////////////////////////////////////////////////////
 389          char M500PcdConfigISOType(unsigned char type)
 390          {
 391   1         if (type == 'A')                     //ISO14443_A
 392   1         { 
 393   2             ClearBitMask(Status2Reg,0x08);
 394   2      
 395   2       /*     WriteRawRC(CommandReg,0x20);    //as default   
 396   2             WriteRawRC(ComIEnReg,0x80);     //as default
 397   2             WriteRawRC(DivlEnReg,0x0);      //as default
 398   2                 WriteRawRC(ComIrqReg,0x04);     //as default
 399   2                 WriteRawRC(DivIrqReg,0x0);      //as default
 400   2                 WriteRawRC(Status2Reg,0x0);//80    //trun off temperature sensor
 401   2                 WriteRawRC(WaterLevelReg,0x08); //as default
 402   2             WriteRawRC(ControlReg,0x20);    //as default
 403   2                 WriteRawRC(CollReg,0x80);    //as default
 404   2      */
 405   2             WriteRawRC(ModeReg,0x3D);//3F
 406   2      /*         WriteRawRC(TxModeReg,0x0);      //as default???
 407   2                 WriteRawRC(RxModeReg,0x0);      //as default???
 408   2                 WriteRawRC(TxControlReg,0x80);  //as default???
 409   2      
 410   2                 WriteRawRC(TxSelReg,0x10);      //as default???
 411   2         */
 412   2             WriteRawRC(RxSelReg,0x86);//84
 413   2       //      WriteRawRC(RxThresholdReg,0x84);//as default
 414   2       //      WriteRawRC(DemodReg,0x4D);      //as default
 415   2      
 416   2       //      WriteRawRC(ModWidthReg,0x13);//26
 417   2             WriteRawRC(RFCfgReg,0x7F);   //4F
 418   2              /*   WriteRawRC(GsNReg,0x88);        //as default???
 419   2                 WriteRawRC(CWGsCfgReg,0x20);    //as default???
 420   2             WriteRawRC(ModGsCfgReg,0x20);   //as default???
 421   2      */
 422   2                 WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec) 
 423   2                 WriteRawRC(TReloadRegH,0);
 424   2             WriteRawRC(TModeReg,0x8D);
 425   2                 WriteRawRC(TPrescalerReg,0x3E);
 426   2                 
 427   2      
C51 COMPILER V7.07   RC522                                                                 02/12/2007 09:56:17 PAGE 8   

 428   2        //     PcdSetTmo(106);
 429   2             DelayMs(1);
 430   2             PcdAntennaOn();
 431   2         }
 432   1         else{ return -1; }
 433   1         

⌨️ 快捷键说明

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