找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8875|回复: 9
打印 上一主题 下一主题
收起左侧

51单片机驱动rc522源程序

  [复制链接]
跳转到指定楼层
楼主

全部源码下载:
RC522.zip (48.29 KB, 下载次数: 210)
  1. #include <intrins.h>
  2. #include "reg52.h"
  3. #include "main.h"
  4. #include "mfrc522.h"
  5. #include <string.h>
  6. #define MAXRLEN 18                        
  7. /////////////////////////////////////////////////////////////////////
  8. //功    能:寻卡
  9. //参数说明: req_code[IN]:寻卡方式
  10. //                0x52 = 寻感应区内所有符合14443A标准的卡
  11. //                0x26 = 寻未进入休眠状态的卡
  12. //          pTagType[OUT]:卡片类型代码
  13. //                0x4400 = Mifare_UltraLight
  14. //                0x0400 = Mifare_One(S50)
  15. //                0x0200 = Mifare_One(S70)
  16. //                0x0800 = Mifare_Pro(X)
  17. //                0x4403 = Mifare_DESFire
  18. //返    回: 成功返回MI_OK
  19. /////////////////////////////////////////////////////////////////////
  20. char PcdRequest(unsigned char req_code,unsigned char *pTagType)
  21. {
  22.    char status;  
  23.    unsigned int  unLen;
  24.    unsigned char ucComMF522Buf[MAXRLEN];
  25. //  unsigned char xTest ;
  26.    ClearBitMask(Status2Reg,0x08);
  27.    WriteRawRC(BitFramingReg,0x07);

  28. //  xTest = ReadRawRC(BitFramingReg);
  29. //  if(xTest == 0x07 )
  30. //   { LED_GREEN  =0 ;}
  31. // else {LED_GREEN =1 ;while(1){}}
  32.    SetBitMask(TxControlReg,0x03);

  33.    ucComMF522Buf[0] = req_code;

  34.    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
  35. //     if(status  == MI_OK )
  36. //   { LED_GREEN  =0 ;}
  37. //   else {LED_GREEN =1 ;}
  38.    if ((status == MI_OK) && (unLen == 0x10))
  39.    {   
  40.        *pTagType     = ucComMF522Buf[0];
  41.        *(pTagType+1) = ucComMF522Buf[1];
  42.    }
  43.    else
  44.    {   status = MI_ERR;   }
  45.    
  46.    return status;
  47. }

  48. /////////////////////////////////////////////////////////////////////
  49. //功    能:防冲撞
  50. //参数说明: pSnr[OUT]:卡片序列号,4字节
  51. //返    回: 成功返回MI_OK
  52. /////////////////////////////////////////////////////////////////////  
  53. char PcdAnticoll(unsigned char *pSnr)
  54. {
  55.     char status;
  56.     unsigned char i,snr_check=0;
  57.     unsigned int  unLen;
  58.     unsigned char ucComMF522Buf[MAXRLEN];
  59.    

  60.     ClearBitMask(Status2Reg,0x08);
  61.     WriteRawRC(BitFramingReg,0x00);
  62.     ClearBitMask(CollReg,0x80);

  63.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  64.     ucComMF522Buf[1] = 0x20;

  65.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);

  66.     if (status == MI_OK)
  67.     {
  68.              for (i=0; i<4; i++)
  69.          {   
  70.              *(pSnr+i)  = ucComMF522Buf[i];
  71.              snr_check ^= ucComMF522Buf[i];
  72.          }
  73.          if (snr_check != ucComMF522Buf[i])
  74.          {   status = MI_ERR;    }
  75.     }
  76.    
  77.     SetBitMask(CollReg,0x80);
  78.     return status;
  79. }

  80. /////////////////////////////////////////////////////////////////////
  81. //功    能:选定卡片
  82. //参数说明: pSnr[IN]:卡片序列号,4字节
  83. //返    回: 成功返回MI_OK
  84. /////////////////////////////////////////////////////////////////////
  85. char PcdSelect(unsigned char *pSnr)
  86. {
  87.     char status;
  88.     unsigned char i;
  89.     unsigned int  unLen;
  90.     unsigned char ucComMF522Buf[MAXRLEN];
  91.    
  92.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  93.     ucComMF522Buf[1] = 0x70;
  94.     ucComMF522Buf[6] = 0;
  95.     for (i=0; i<4; i++)
  96.     {
  97.             ucComMF522Buf[i+2] = *(pSnr+i);
  98.             ucComMF522Buf[6]  ^= *(pSnr+i);
  99.     }
  100.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
  101.   
  102.     ClearBitMask(Status2Reg,0x08);

  103.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
  104.    
  105.     if ((status == MI_OK) && (unLen == 0x18))
  106.     {   status = MI_OK;  }
  107.     else
  108.     {   status = MI_ERR;    }

  109.     return status;
  110. }

  111. /////////////////////////////////////////////////////////////////////
  112. //功    能:验证卡片密码
  113. //参数说明: auth_mode[IN]: 密码验证模式
  114. //                 0x60 = 验证A密钥
  115. //                 0x61 = 验证B密钥
  116. //          addr[IN]:块地址
  117. //          pKey[IN]:密码
  118. //          pSnr[IN]:卡片序列号,4字节
  119. //返    回: 成功返回MI_OK
  120. /////////////////////////////////////////////////////////////////////               
  121. char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
  122. {
  123.     char status;
  124.     unsigned int  unLen;
  125.     unsigned char i,ucComMF522Buf[MAXRLEN];

  126.     ucComMF522Buf[0] = auth_mode;
  127.     ucComMF522Buf[1] = addr;
  128.     for (i=0; i<6; i++)
  129.     {    ucComMF522Buf[i+2] = *(pKey+i);   }
  130.     for (i=0; i<6; i++)
  131.     {    ucComMF522Buf[i+8] = *(pSnr+i);   }
  132. //   memcpy(&ucComMF522Buf[2], pKey, 6);
  133. //   memcpy(&ucComMF522Buf[8], pSnr, 4);
  134.    
  135.     status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  136.     if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  137.     {   status = MI_ERR;   }
  138.    
  139.     return status;
  140. }

  141. /////////////////////////////////////////////////////////////////////
  142. //功    能:读取M1卡一块数据
  143. //参数说明: addr[IN]:块地址
  144. //          pData[OUT]:读出的数据,16字节
  145. //返    回: 成功返回MI_OK
  146. /////////////////////////////////////////////////////////////////////
  147. char PcdRead(unsigned char addr,unsigned char *pData)
  148. {
  149.     char status;
  150.     unsigned int  unLen;
  151.     unsigned char i,ucComMF522Buf[MAXRLEN];

  152.     ucComMF522Buf[0] = PICC_READ;
  153.     ucComMF522Buf[1] = addr;
  154.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  155.    
  156.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  157.     if ((status == MI_OK) && (unLen == 0x90))
  158. //   {   memcpy(pData, ucComMF522Buf, 16);   }
  159.     {
  160.         for (i=0; i<16; i++)
  161.         {    *(pData+i) = ucComMF522Buf[i];   }
  162.     }
  163.     else
  164.     {   status = MI_ERR;   }
  165.    
  166.     return status;
  167. }

  168. /////////////////////////////////////////////////////////////////////
  169. //功    能:写数据到M1卡一块
  170. //参数说明: addr[IN]:块地址
  171. //          pData[IN]:写入的数据,16字节
  172. //返    回: 成功返回MI_OK
  173. /////////////////////////////////////////////////////////////////////                  
  174. char PcdWrite(unsigned char addr,unsigned char *pData)
  175. {
  176.     char status;
  177.     unsigned int  unLen;
  178.     unsigned char i,ucComMF522Buf[MAXRLEN];
  179.    
  180.     ucComMF522Buf[0] = PICC_WRITE;
  181.     ucComMF522Buf[1] = addr;
  182.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  183.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  184.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  185.     {   status = MI_ERR;   }
  186.         
  187.     if (status == MI_OK)
  188.     {
  189.         //memcpy(ucComMF522Buf, pData, 16);
  190.         for (i=0; i<16; i++)
  191.         {    ucComMF522Buf[i] = *(pData+i);   }
  192.         CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

  193.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  194.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  195.         {   status = MI_ERR;   }
  196.     }
  197.    
  198.     return status;
  199. }



  200. /////////////////////////////////////////////////////////////////////
  201. //功    能:命令卡片进入休眠状态
  202. //返    回: 成功返回MI_OK
  203. /////////////////////////////////////////////////////////////////////
  204. char PcdHalt(void)
  205. {
  206.     char status;
  207.     unsigned int  unLen;
  208.     unsigned char ucComMF522Buf[MAXRLEN];

  209.     ucComMF522Buf[0] = PICC_HALT;
  210.     ucComMF522Buf[1] = 0;
  211.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  212.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  213.     return MI_OK;
  214. }

  215. /////////////////////////////////////////////////////////////////////
  216. //用MF522计算CRC16函数
  217. /////////////////////////////////////////////////////////////////////
  218. void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
  219. {
  220.     unsigned char i,n;
  221.     ClearBitMask(DivIrqReg,0x04);
  222.     WriteRawRC(CommandReg,PCD_IDLE);
  223.     SetBitMask(FIFOLevelReg,0x80);
  224.     for (i=0; i<len; i++)
  225.     {   WriteRawRC(FIFODataReg, *(pIndata+i));   }
  226.     WriteRawRC(CommandReg, PCD_CALCCRC);
  227.     i = 0xFF;
  228.     do
  229.     {
  230.         n = ReadRawRC(DivIrqReg);
  231.         i--;
  232.     }
  233.     while ((i!=0) && !(n&0x04));
  234.     pOutData[0] = ReadRawRC(CRCResultRegL);
  235.     pOutData[1] = ReadRawRC(CRCResultRegM);
  236. }

  237. /////////////////////////////////////////////////////////////////////
  238. //功    能:复位RC522
  239. //返    回: 成功返回MI_OK
  240. /////////////////////////////////////////////////////////////////////
  241. char PcdReset(void)
  242. {
  243.     MF522_RST=1;
  244.     _nop_();
  245.     MF522_RST=0;
  246.     _nop_();
  247.     MF522_RST=1;
  248.      _nop_();
  249.     WriteRawRC(CommandReg,PCD_RESETPHASE);
  250.     _nop_();
  251.    
  252.     WriteRawRC(ModeReg,0x3D);            //和Mifare卡通讯,CRC初始值0x6363
  253.     WriteRawRC(TReloadRegL,30);           
  254.     WriteRawRC(TReloadRegH,0);
  255.     WriteRawRC(TModeReg,0x8D);
  256.     WriteRawRC(TPrescalerReg,0x3E);
  257.     WriteRawRC(TxAutoReg,0x40);     
  258.     return MI_OK;
  259. }
  260. //////////////////////////////////////////////////////////////////////
  261. //设置RC632的工作方式
  262. //////////////////////////////////////////////////////////////////////
  263. char M500PcdConfigISOType(unsigned char type)
  264. {
  265.    if (type == 'A')                     //ISO14443_A
  266.    {
  267.        ClearBitMask(Status2Reg,0x08);

  268. /*     WriteRawRC(CommandReg,0x20);    //as default   
  269.        WriteRawRC(ComIEnReg,0x80);     //as default
  270.        WriteRawRC(DivlEnReg,0x0);      //as default
  271.            WriteRawRC(ComIrqReg,0x04);     //as default
  272.            WriteRawRC(DivIrqReg,0x0);      //as default
  273.            WriteRawRC(Status2Reg,0x0);//80    //trun off temperature sensor
  274.            WriteRawRC(WaterLevelReg,0x08); //as default
  275.        WriteRawRC(ControlReg,0x20);    //as default
  276.            WriteRawRC(CollReg,0x80);    //as default
  277. */
  278.        WriteRawRC(ModeReg,0x3D);//3F
  279. /*           WriteRawRC(TxModeReg,0x0);      //as default???
  280.            WriteRawRC(RxModeReg,0x0);      //as default???
  281.            WriteRawRC(TxControlReg,0x80);  //as default???

  282.            WriteRawRC(TxSelReg,0x10);      //as default???
  283.    */
  284.        WriteRawRC(RxSelReg,0x86);//84
  285. //      WriteRawRC(RxThresholdReg,0x84);//as default
  286. //      WriteRawRC(DemodReg,0x4D);      //as default

  287. //      WriteRawRC(ModWidthReg,0x13);//26
  288.        WriteRawRC(RFCfgReg,0x7F);   //4F
  289.         /*   WriteRawRC(GsNReg,0x88);        //as default???
  290.            WriteRawRC(CWGsCfgReg,0x20);    //as default???
  291.        WriteRawRC(ModGsCfgReg,0x20);   //as default???
  292. */
  293.               WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
  294.            WriteRawRC(TReloadRegH,0);
  295.        WriteRawRC(TModeReg,0x8D);
  296.            WriteRawRC(TPrescalerReg,0x3E);
  297.            

  298.   //     PcdSetTmo(106);
  299.                             delay_10ms(1);
  300.        PcdAntennaOn();
  301.    }
  302.    else{ return -1; }
  303.    
  304.    return MI_OK;
  305. }
  306. /////////////////////////////////////////////////////////////////////
  307. //功    能:读RC632寄存器
  308. //参数说明:Address[IN]:寄存器地址
  309. //返    回:读出的值
  310. /////////////////////////////////////////////////////////////////////
  311. unsigned char ReadRawRC(unsigned char Address)
  312. {
  313.      unsigned char i, ucAddr;
  314.      unsigned char ucResult=0;

  315.      MF522_SCK = 0;
  316.      MF522_NSS = 0;
  317.      ucAddr = ((Address<<1)&0x7E)|0x80;

  318.      for(i=8;i>0;i--)
  319.      {
  320.          MF522_SI = ((ucAddr&0x80)==0x80);
  321.          MF522_SCK = 1;
  322.          ucAddr <<= 1;
  323.          MF522_SCK = 0;
  324.      }

  325.      for(i=8;i>0;i--)
  326.      {
  327.          MF522_SCK = 1;
  328.          ucResult <<= 1;
  329.          ucResult|=(bit)MF522_SO;
  330.          MF522_SCK = 0;
  331.      }

  332.      MF522_NSS = 1;
  333.      MF522_SCK = 1;
  334.      return ucResult;
  335. }

  336. /////////////////////////////////////////////////////////////////////
  337. //功    能:写RC632寄存器
  338. //参数说明:Address[IN]:寄存器地址
  339. //          value[IN]:写入的值
  340. /////////////////////////////////////////////////////////////////////
  341. void WriteRawRC(unsigned char Address, unsigned char value)
  342. {  
  343.     unsigned char i, ucAddr;

  344.     MF522_SCK = 0;
  345.     MF522_NSS = 0;
  346.     ucAddr = ((Address<<1)&0x7E);

  347.     for(i=8;i>0;i--)
  348.     {
  349.         MF522_SI = ((ucAddr&0x80)==0x80);
  350.         MF522_SCK = 1;
  351.         ucAddr <<= 1;
  352.         MF522_SCK = 0;
  353.     }

  354.     for(i=8;i>0;i--)
  355.     {
  356.         MF522_SI = ((value&0x80)==0x80);
  357.         MF522_SCK = 1;
  358.         value <<= 1;
  359.         MF522_SCK = 0;
  360.     }
  361.     MF522_NSS = 1;
  362.     MF522_SCK = 1;
  363. }

  364. /////////////////////////////////////////////////////////////////////
  365. //功    能:置RC522寄存器位
  366. //参数说明:reg[IN]:寄存器地址
  367. //          mask[IN]:置位值
  368. /////////////////////////////////////////////////////////////////////
  369. void SetBitMask(unsigned char reg,unsigned char mask)  
  370. {
  371.     char tmp = 0x0;
  372.     tmp = ReadRawRC(reg);
  373.     WriteRawRC(reg,tmp | mask);  // set bit mask
  374. }

  375. /////////////////////////////////////////////////////////////////////
  376. //功    能:清RC522寄存器位
  377. //参数说明:reg[IN]:寄存器地址
  378. //          mask[IN]:清位值
  379. /////////////////////////////////////////////////////////////////////
  380. void ClearBitMask(unsigned char reg,unsigned char mask)  
  381. {
  382.     char tmp = 0x0;
  383.     tmp = ReadRawRC(reg);
  384.     WriteRawRC(reg, tmp & ~mask);  // clear bit mask
  385. }

  386. /////////////////////////////////////////////////////////////////////
  387. //功    能:通过RC522和ISO14443卡通讯
  388. //参数说明:Command[IN]:RC522命令字
  389. //          pInData[IN]:通过RC522发送到卡片的数据
  390. //          InLenByte[IN]:发送数据的字节长度
  391. //          pOutData[OUT]:接收到的卡片返回数据
  392. //          *pOutLenBit[OUT]:返回数据的位长度
  393. /////////////////////////////////////////////////////////////////////
  394. char PcdComMF522(unsigned char Command,
  395.                  unsigned char *pInData,
  396.                  unsigned char InLenByte,
  397.                  unsigned char *pOutData,
  398.                  unsigned int  *pOutLenBit)
  399. {
  400.     char status = MI_ERR;
  401.     unsigned char irqEn   = 0x00;
  402.     unsigned char waitFor = 0x00;
  403.     unsigned char lastBits;
  404.     unsigned char n;
  405.     unsigned int i;
  406.     switch (Command)
  407.     {
  408.        case PCD_AUTHENT:
  409.           irqEn   = 0x12;
  410.           waitFor = 0x10;
  411.           break;
  412.        case PCD_TRANSCEIVE:
  413.           irqEn   = 0x77;
  414.           waitFor = 0x30;
  415.           break;
  416.        default:
  417.          break;
  418.     }
  419.    
  420.     WriteRawRC(ComIEnReg,irqEn|0x80);
  421.     ClearBitMask(ComIrqReg,0x80);
  422.     WriteRawRC(CommandReg,PCD_IDLE);
  423.     SetBitMask(FIFOLevelReg,0x80);
  424.    
  425.     for (i=0; i<InLenByte; i++)
  426.     {   WriteRawRC(FIFODataReg, pInData[i]);    }
  427.     WriteRawRC(CommandReg, Command);
  428.    
  429.    
  430.     if (Command == PCD_TRANSCEIVE)
  431.     {    SetBitMask(BitFramingReg,0x80);  }
  432.    
  433. //    i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
  434. i = 2000;
  435.     do
  436.     {
  437.          n = ReadRawRC(ComIrqReg);
  438.          i--;
  439.     }
  440.     while ((i!=0) && !(n&0x01) && !(n&waitFor));
  441.     ClearBitMask(BitFramingReg,0x80);
  442.               
  443.     if (i!=0)
  444.     {   
  445.          if(!(ReadRawRC(ErrorReg)&0x1B))
  446.          {
  447.              status = MI_OK;
  448.              if (n & irqEn & 0x01)
  449.              {   status = MI_NOTAGERR;   }
  450.              if (Command == PCD_TRANSCEIVE)
  451.              {
  452.                        n = ReadRawRC(FIFOLevelReg);
  453.                       lastBits = ReadRawRC(ControlReg) & 0x07;
  454.                 if (lastBits)
  455.                 {   *pOutLenBit = (n-1)*8 + lastBits;   }
  456.                 else
  457.                 {   *pOutLenBit = n*8;   }
  458.                 if (n == 0)
  459.                 {   n = 1;    }
  460.                 if (n > MAXRLEN)
  461.                 {   n = MAXRLEN;   }
  462.                 for (i=0; i<n; i++)
  463.                 {   pOutData[i] = ReadRawRC(FIFODataReg);    }
  464.             }
  465.          }
  466.          else
  467.          {   status = MI_ERR;   }
  468.         
  469.    }
  470.    

  471.    SetBitMask(ControlReg,0x80);           // stop timer now
  472.    WriteRawRC(CommandReg,PCD_IDLE);
  473.    return status;
  474. }


  475. /////////////////////////////////////////////////////////////////////
  476. //开启天线  
  477. //每次启动或关闭天险发射之间应至少有1ms的间隔
  478. /////////////////////////////////////////////////////////////////////
  479. void PcdAntennaOn()
  480. {
  481.     unsigned char i;
  482.     i = ReadRawRC(TxControlReg);
  483.     if (!(i & 0x03))
  484.     {
  485.         SetBitMask(TxControlReg, 0x03);
  486.     }
  487. }


  488. /////////////////////////////////////////////////////////////////////
  489. //关闭天线
  490. /////////////////////////////////////////////////////////////////////
  491. void PcdAntennaOff()
  492. {
  493.     ClearBitMask(TxControlReg, 0x03);
  494. }


  495. /////////////////////////////////////////////////////////////////////
  496. //功    能:扣款和充值
  497. //参数说明: dd_mode[IN]:命令字
  498. //               0xC0 = 扣款
  499. //               0xC1 = 充值
  500. //          addr[IN]:钱包地址
  501. //          pValue[IN]:4字节增(减)值,低位在前
  502. //返    回: 成功返回MI_OK
  503. /////////////////////////////////////////////////////////////////////                 
  504. char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
  505. {
  506.     char status;
  507.     unsigned int  unLen;
  508.     unsigned char ucComMF522Buf[MAXRLEN];
  509.    
  510.     ucComMF522Buf[0] = dd_mode;
  511.     ucComMF522Buf[1] = addr;
  512.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  513.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  514.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  515.     {   status = MI_ERR;   }
  516.         
  517.     if (status == MI_OK)
  518.     {
  519.         memcpy(ucComMF522Buf, pValue, 4);
  520. //       for (i=0; i<16; i++)
  521. //       {    ucComMF522Buf[i] = *(pValue+i);   }
  522.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
  523.         unLen = 0;
  524.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  525.         if (status != MI_ERR)
  526.         {    status = MI_OK;    }
  527.     }
  528.    
  529.     if (status == MI_OK)
  530.     {
  531.         ucComMF522Buf[0] = PICC_TRANSFER;
  532.         ucComMF522Buf[1] = addr;
  533.         CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  534.    
  535.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  536.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  537.         {   status = MI_ERR;   }
  538.     }
  539.     return status;
  540. }

  541. /////////////////////////////////////////////////////////////////////
  542. //功    能:备份钱包
  543. //参数说明: sourceaddr[IN]:源地址
  544. //          goaladdr[IN]:目标地址
  545. //返    回: 成功返回MI_OK
  546. /////////////////////////////////////////////////////////////////////
  547. char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
  548. {
  549.     char status;
  550.     unsigned int  unLen;
  551.     unsigned char ucComMF522Buf[MAXRLEN];

  552.     ucComMF522Buf[0] = PICC_RESTORE;
  553.     ucComMF522Buf[1] = sourceaddr;
  554.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  555.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  556.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  557.     {   status = MI_ERR;   }
  558.    
  559.     if (status == MI_OK)
  560.     {
  561.         ucComMF522Buf[0] = 0;
  562.         ucComMF522Buf[1] = 0;
  563.         ucComMF522Buf[2] = 0;
  564.         ucComMF522Buf[3] = 0;
  565.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);

  566.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  567.         if (status != MI_ERR)
  568.         {    status = MI_OK;    }
  569.     }
  570.    
  571.     if (status != MI_OK)
  572.     {    return MI_ERR;   }
  573.    
  574.     ucComMF522Buf[0] = PICC_TRANSFER;
  575.     ucComMF522Buf[1] = goaladdr;

  576.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  577.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  578.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  579.     {   status = MI_ERR;   }

  580.     return status;
  581. }


  582. ///////////////////////////////////////////////////////////////////////
  583. // Delay 10ms
  584. ///////////////////////////////////////////////////////////////////////
  585. void delay_10ms(unsigned int _10ms)
  586. {
  587. #ifndef NO_TIMER2
  588.     RCAP2LH = RCAP2_10ms;
  589.     T2LH    = RCAP2_10ms;
  590.    
  591.     TR2 = TRUE;
  592.     while (_10ms--)
  593.     {
  594.             while (!TF2);
  595.             TF2 = FALSE;
  596.     }
  597.     TR2 = FALSE;
  598. #else
  599.     while (_10ms--)
  600.     {
  601.             delay_50us(19);
  602.             if (CmdValid)
  603.                 return;
  604.             delay_50us(20);
  605.             if (CmdValid)
  606.                 return;
  607.             delay_50us(20);
  608.             if (CmdValid)
  609.                 return;
  610.             delay_50us(20);
  611.             if (CmdValid)
  612.                 return;
  613.             delay_50us(20);
  614.             if (CmdValid )
  615.                 return;
  616.             delay_50us(20);
  617.             if (CmdValid)
  618.                 return;
  619.             delay_50us(20);
  620.             if (CmdValid)
  621.                 return;
  622.             delay_50us(20);
  623.             if (CmdValid)
  624.                 return;
  625.             delay_50us(20);
  626.             if (CmdValid)
  627.                 return;
  628.             delay_50us(19);
  629.             if (CmdValid)
  630.                 return;
  631.     }
  632. #endif
  633. }
复制代码




评分

参与人数 3黑币 +60 收起 理由
该死小孩 + 5 很给力!
张胜233 + 5 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:170953 发表于 2017-3-15 16:39 | 只看该作者
感谢分享
回复

使用道具 举报

板凳
ID:202591 发表于 2017-5-19 16:38 | 只看该作者
感谢分享
回复

使用道具 举报

地板
ID:228989 发表于 2017-8-23 16:49 | 只看该作者
社区有你才精彩
回复

使用道具 举报

5#
ID:253158 发表于 2017-11-24 18:39 | 只看该作者
我是游客能给我分享一下文件么
回复

使用道具 举报

6#
ID:342607 发表于 2018-6-1 00:45 | 只看该作者
感谢分享~
回复

使用道具 举报

7#
ID:353325 发表于 2018-6-18 22:56 | 只看该作者
为什么我下载不了
回复

使用道具 举报

8#
ID:32627 发表于 2018-6-21 19:22 | 只看该作者
感谢分享
回复

使用道具 举报

9#
ID:194641 发表于 2018-6-27 21:14 | 只看该作者
感谢分享
回复

使用道具 举报

10#
ID:431457 发表于 2018-11-22 20:58 | 只看该作者
谢谢分享,正需要
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表