找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5694|回复: 2
收起左侧

MFRC522单片机驱动源码 IO模拟spi接口 调试通过能正常读到M1卡

[复制链接]
ID:198609 发表于 2017-5-9 14:18 | 显示全部楼层 |阅读模式
调试通过的RC522驱动源码,使用IO模拟spi接口。测试后能正常读到M1卡
0.png

单片机源程序:
  1. #include "MFRC522.h"
  2. #include "nrf_delay.h"
  3. #include "nrf_gpio.h"
  4. #include <stdint.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. //#include "simple_uart.h"
  8. extern uint32_t *p_spi_base_address;
  9. typedef  uint8_t u8;
  10. typedef  uint16_t u16;
  11. #define _MFRC_SOFT_SPI
  12. #define Set_MFRC_CS(x)                x ? nrf_gpio_pin_set(SPI_PSELSS0):nrf_gpio_pin_clear(SPI_PSELSS0)
  13. #define Set_MFRC_SCK(x)        x ? nrf_gpio_pin_set(SPI_PSELSCK0):nrf_gpio_pin_clear(SPI_PSELSCK0)
  14. #define Set_MFRC_MOSI(x)        x ? nrf_gpio_pin_set(SPI_PSELMOSI0):nrf_gpio_pin_clear(SPI_PSELMOSI0)
  15. #define MFRC_MISO_STATUS()        nrf_gpio_pin_read(SPI_PSELMISO0)
  16. //#define Set_MFRC_RST(x)                x ? HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET);

  17. void MFRC_Delay(u16 Delay_Time)
  18. {
  19.   u16 i, j;
  20.   for (i = 40; i > 0; i--)
  21.   {
  22.     for (j = Delay_Time; j > 0; j--);
  23.   }
  24. }
  25. #ifndef _MFRC_SOFT_SPI  
  26. void SPI_TxByte(u8 Dat)
  27. {
  28.         uint8_t state;
  29.         state = spi_master_tx(p_spi_base_address, Dat);          
  30.         if(state != true)
  31.                 state = true;
  32. }

  33. u8 SPI_RxByte(void)
  34. {
  35.         uint8_t state;
  36.   state = spi_master_rx(p_spi_base_address) ;
  37.   return state;                             
  38. }
  39. #endif
  40. /*
  41. /////////////////////////////////////////////////////////////////////
  42. //?    ?:?RC632???
  43. //????:Address[IN]:?????
  44. //?    ?:????
  45. /////////////////////////////////////////////////////////////////////
  46. unsigned char ReadRawRC(unsigned char Address)
  47. {
  48.     unsigned char ucResult=0;
  49.                 uint8_t ucAddr;
  50.                 uint8_t tx_data[2]={0x00,0x00};
  51.                 uint8_t rx_data[2]={0x00,0x00};
  52.                 ucAddr = ((Address << 1) & 0x7E) | 0x80;
  53.                 tx_data[0] = ucAddr;
  54.                 spi_master_tx_rx(p_spi_base_address, 1, tx_data, rx_data);
  55.                 ucResult = rx_data[0];
  56.     return ucResult;
  57. }

  58. /////////////////////////////////////////////////////////////////////
  59. //?    ?:?RC632???
  60. //????:Address[IN]:?????
  61. //          value[IN]:????
  62. /////////////////////////////////////////////////////////////////////
  63. void WriteRawRC(unsigned char Address, unsigned char value)
  64. {  
  65.                 uint8_t tx_data[2]={0x00,0x00};
  66.                 uint8_t rx_data[2]={0x00,0x00};
  67.                 uint8_t ucAddr;
  68.                 ucAddr = ((Address << 1) & 0x7E);
  69.                 tx_data[0] = ucAddr;
  70.                 tx_data[1] = value;
  71.                 spi_master_tx_rx(p_spi_base_address, 2, tx_data, rx_data);
  72. }*/

  73. /////////////////////////////////////////////////////////////////////
  74. //功    能:读RC632寄存器
  75. //参数说明:Address[IN]:寄存器地址
  76. //返    回:读出的值
  77. /////////////////////////////////////////////////////////////////////
  78. static u8 ReadRawRC(u8 Address)
  79. {
  80.   u8 ucAddr;
  81.   u8 ret = 0;
  82. #ifdef _MFRC_SOFT_SPI
  83.   u8 i;
  84.   Set_MFRC_SCK(0);
  85. #endif  
  86.   
  87.   Set_MFRC_CS(0);

  88.   ucAddr = ((Address << 1) & 0x7E) | 0x80;
  89. #ifdef _MFRC_SOFT_SPI  
  90.   for(i=8; i>0; i--)
  91.   {
  92.     Set_MFRC_MOSI((ucAddr & 0x80) == 0x80);
  93.     Set_MFRC_SCK(1);
  94.     ucAddr <<= 1;
  95.     Set_MFRC_SCK(0);
  96.   }

  97.   for(i=8; i>0; i--)
  98.   {
  99.     Set_MFRC_SCK(1);
  100.     ret <<= 1;
  101.     ret |= MFRC_MISO_STATUS();
  102.     Set_MFRC_SCK(0);
  103.   }
  104. #else
  105.   SPI_TxByte(ucAddr);
  106.   ret = SPI_RxByte();
  107.        
  108. #endif
  109.   Set_MFRC_CS(1);
  110. #ifdef _MFRC_SOFT_SPI
  111.   Set_MFRC_SCK(1);
  112. #endif
  113.         printf("REG ADDR:0x%x  Val: 0x%02x\r\n",Address,ret);
  114.   return ret;
  115. }

  116. /////////////////////////////////////////////////////////////////////
  117. //功    能:写RC632寄存器
  118. //参数说明:Address[IN]:寄存器地址
  119. //          value[IN]:写入的值
  120. /////////////////////////////////////////////////////////////////////
  121. void WriteRawRC(u8 Address, u8 value)
  122. {
  123.   u8 ucAddr;
  124. #ifdef _MFRC_SOFT_SPI
  125.   u8 i;
  126.   Set_MFRC_SCK(0);
  127. #endif
  128.   Set_MFRC_CS(0);

  129.   ucAddr = ((Address << 1) & 0x7E);
  130. #ifdef _MFRC_SOFT_SPI
  131.         printf("---write---REG ADDR:0x%x  Val: 0x%02x\r\n",Address,value);
  132.   for(i=8; i>0; i--)
  133.   {
  134.     Set_MFRC_MOSI((ucAddr & 0x80) == 0x80);
  135.     Set_MFRC_SCK(1);
  136.     ucAddr <<= 1;
  137.     Set_MFRC_SCK(0);
  138.   }

  139.   for(i=8; i>0; i--)
  140.   {
  141.     Set_MFRC_MOSI((value & 0x80) == 0x80);
  142.     Set_MFRC_SCK(1);
  143.     value <<= 1;
  144.     Set_MFRC_SCK(0);
  145.   }
  146. #else
  147.   SPI_TxByte(ucAddr);
  148.   SPI_TxByte(value);
  149.         printf("---write---REG ADDR:0x%x  Val: 0x%x\r\n",Address,value);
  150. #endif
  151.   Set_MFRC_CS(1);
  152. #ifdef _MFRC_SOFT_SPI
  153.   Set_MFRC_SCK(1);
  154. #endif
  155.        
  156. }

  157. /////////////////////////////////////////////////////////////////////
  158. //功    能:清RC522寄存器位
  159. //参数说明:reg[IN]:寄存器地址
  160. //          mask[IN]:清位值
  161. /////////////////////////////////////////////////////////////////////
  162. static void ClearBitMask(u8 reg, u8 mask)
  163. {
  164.         u8 tmp = 0x0;
  165.         tmp = ReadRawRC(reg);
  166.         WriteRawRC(reg, tmp & ~mask);  // clear bit mask
  167. }

  168. /////////////////////////////////////////////////////////////////////
  169. //功    能:置RC522寄存器位
  170. //参数说明:reg[IN]:寄存器地址
  171. //          mask[IN]:置位值
  172. /////////////////////////////////////////////////////////////////////
  173. static void SetBitMask(u8 reg, u8 mask)
  174. {
  175.         u8 tmp = 0x0;
  176.         tmp = ReadRawRC(reg);
  177.         WriteRawRC(reg, tmp | mask);  // set bit mask
  178. }


  179. //开启天线  
  180. //每次启动或关闭天险发射之间应至少有1ms的间隔
  181. void PcdAntennaOn(void)
  182. {
  183.         u8 i;
  184.         i = ReadRawRC(TxControlReg);
  185.         if (!(i & 0x03))
  186.         {
  187.                 SetBitMask(TxControlReg, 0x03);
  188.         }
  189. }

  190. //关闭天线
  191. void PcdAntennaOff(void)
  192. {
  193.         ClearBitMask(TxControlReg, 0x03);
  194. }

  195. /////////////////////////////////////////////////////////////////////
  196. //功    能:通过RC522和ISO14443卡通讯
  197. //参数说明:Command[IN]:RC522命令字
  198. //          pIn [IN]:通过RC522发送到卡片的数据
  199. //          InLenByte[IN]:发送数据的字节长度
  200. //          pOut [OUT]:接收到的卡片返回数据
  201. //          *pOutLenBit[OUT]:返回数据的位长度
  202. /////////////////////////////////////////////////////////////////////
  203. #define MAXRLEN                       18
  204. static char PcdComMF522(unsigned char Command,
  205.                  unsigned char *pInData,
  206.                  unsigned char InLenByte,
  207.                  unsigned char *pOutData,
  208.                  unsigned int  *pOutLenBit)
  209. {
  210.         char status = MI_ERR;
  211.         unsigned char irqEn   = 0x00;
  212.         unsigned char waitFor = 0x00;
  213.         unsigned char lastBits;
  214.         unsigned char n;
  215.         unsigned int i;

  216.         switch (Command)
  217.         {
  218.         case PCD_AUTHENT:
  219.                 irqEn = 0x12;
  220.                 waitFor = 0x10;
  221.                 break;
  222.         case PCD_TRANSCEIVE:
  223.                 irqEn = 0x77;
  224.                 waitFor = 0x30;
  225.                 break;
  226.         default:
  227.                 break;
  228.         }

  229.         WriteRawRC(ComIEnReg, irqEn | 0x80);
  230.         ClearBitMask(ComIrqReg, 0x80);
  231.         WriteRawRC(CommandReg, PCD_IDLE);
  232.         SetBitMask(FIFOLevelReg, 0x80);

  233.         for (i = 0; i < InLenByte; i++)
  234.         {
  235.                 WriteRawRC(FIFODataReg, pInData[i]);
  236.         }
  237.         WriteRawRC(CommandReg, Command);

  238.         if (Command == PCD_TRANSCEIVE)
  239.         {
  240.                 SetBitMask(BitFramingReg, 0x80);
  241.         }

  242.         i = 3000;//800;
  243.         do
  244.         {
  245.                 n = ReadRawRC(ComIrqReg);
  246.                 i--;
  247.         } while ((i != 0) && !(n & 0x01) && !(n & waitFor));
  248.         ClearBitMask(BitFramingReg, 0x80);

  249.         if (i != 0)
  250.         {
  251.                 if (!(ReadRawRC(ErrorReg) & 0x1B))
  252.                 {
  253.                         status = MI_OK;
  254.                         if (n & irqEn & 0x01)
  255.                         {
  256.                                 status = MI_NOTAGERR;
  257.                         }
  258.                         if (Command == PCD_TRANSCEIVE)
  259.                         {
  260.                                 n = ReadRawRC(FIFOLevelReg);
  261.                                 lastBits = ReadRawRC(ControlReg) & 0x07;
  262.                                 if (lastBits)
  263.                                 {
  264.                                         *pOutLenBit = (n - 1) * 8 + lastBits;
  265.                                 }
  266.                                 else
  267.                                 {
  268.                                         *pOutLenBit = n * 8;
  269.                                 }
  270.                                 if (n == 0)
  271.                                 {
  272.                                         n = 1;
  273.                                 }
  274.                                 if (n > MAXRLEN)
  275.                                 {
  276.                                         n = MAXRLEN;
  277.                                 }
  278.                                 for (i = 0; i < n; i++)
  279.                                 {
  280.                                         pOutData[i] = ReadRawRC(FIFODataReg);
  281.                                 }
  282.                         }
  283.                 }
  284.                 else
  285.                 {
  286.                         status = MI_ERR;
  287.                 }
  288.         }
  289.         SetBitMask(ControlReg, 0x80);           // stop timer now
  290.         WriteRawRC(CommandReg, PCD_IDLE);
  291.         return status;
  292. }


  293. /////////////////////////////////////////////////////////////////////
  294. //功    能:复位RC522
  295. //返    回: 成功返回MI_OK
  296. /////////////////////////////////////////////////////////////////////
  297. char PcdReset(void)
  298. {
  299.         nrf_gpio_pin_set(SPI_RST);
  300.         MFRC_Delay(10);  
  301.         nrf_gpio_pin_clear(SPI_RST);
  302.         MFRC_Delay(60000);  
  303.         nrf_gpio_pin_set(SPI_RST);
  304.         MFRC_Delay(500);  
  305.         WriteRawRC(CommandReg, PCD_RESETPHASE);
  306.         MFRC_Delay(2000);  

  307.         WriteRawRC(ModeReg, 0x3D);            
  308.         WriteRawRC(TReloadRegL, 30);            
  309.         WriteRawRC(TReloadRegH, 0);
  310.         WriteRawRC(TModeReg, 0x8D);
  311.         WriteRawRC(TPrescalerReg, 0x3E);
  312.         WriteRawRC(TxAutoReg, 0x40);
  313.        
  314.         ClearBitMask(TestPinEnReg, 0x80);         //off MX and DTRQ out
  315.         WriteRawRC(TxAutoReg, 0x40);

  316.         return MI_OK;
  317. }       

  318. /////////////////////////////////////////////////////////////////////
  319. //用MF522计算CRC16函数
  320. /////////////////////////////////////////////////////////////////////
  321. void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
  322. {
  323.     unsigned char i,n;
  324.        
  325.     ClearBitMask(DivIrqReg,0x04);
  326.     WriteRawRC(CommandReg,PCD_IDLE);
  327.     SetBitMask(FIFOLevelReg,0x80);
  328.     for (i=0; i<len; i++)
  329.     {   
  330.         WriteRawRC(FIFODataReg, *(pIndata+i));  
  331.     }
  332.     WriteRawRC(CommandReg, PCD_CALCCRC);
  333.     i = 0xFF;
  334.     do
  335.     {
  336.         n = ReadRawRC(DivIrqReg);
  337.         i--;
  338.     }
  339.     while ((i!=0) && !(n&0x04));
  340.     pOutData[0] = ReadRawRC(CRCResultRegL);
  341.     pOutData[1] = ReadRawRC(CRCResultRegM);
  342. }


  343. //////////////////////////////////////////////////////////////////////
  344. //设置RC522的工作方式
  345. //////////////////////////////////////////////////////////////////////
  346. signed char M500PcdConfigISOType(unsigned char type)
  347. {
  348.   if('A' == type)
  349.   {
  350.     ClearBitMask(Status2Reg,0x08);
  351.     WriteRawRC(ModeReg,0x3D);
  352.     WriteRawRC(RxSelReg,0x86);
  353.     WriteRawRC(RFCfgReg,0x7F);   
  354.     WriteRawRC(TReloadRegL,30);
  355.     WriteRawRC(TReloadRegH,0);
  356.     WriteRawRC(TModeReg,0x8D);
  357.     WriteRawRC(TPrescalerReg,0x3E);
  358.     MFRC_Delay(10000);
  359.     PcdAntennaOn();
  360.   }
  361.   else
  362.   {
  363.     return -1;
  364.   }
  365.        
  366.   return MI_OK;
  367. }

  368. /***
  369. 初始化RC522
  370. */

  371. void MFRC522_Init(void)
  372. {
  373. //  MFRC_GPIOConfigure();
  374.        
  375.   PcdReset();
  376.   PcdAntennaOff();
  377.   MFRC_Delay(2000);
  378.   PcdAntennaOn();
  379.   M500PcdConfigISOType('A');
  380. }

  381. /////////////////////////////////////////////////////////////////////
  382. //功    能:寻卡
  383. //参数说明: req_code[IN]:寻卡方式
  384. //                0x52 = 寻感应区内所有符合14443A标准的卡
  385. //                0x26 = 寻未进入休眠状态的卡
  386. //          pTagType[OUT]:卡片类型代码
  387. //                0x4400 = Mifare_UltraLight
  388. //                0x0400 = Mifare_One(S50)
  389. //                0x0200 = Mifare_One(S70)
  390. //                0x0800 = Mifare_Pro(X)
  391. //                0x4403 = Mifare_DESFire
  392. //返    回: 成功返回MI_OK
  393. /////////////////////////////////////////////////////////////////////
  394. char PcdRequest(u8 req_code, u8 *pTagType)
  395. {
  396.   char status;  
  397.         unsigned int  unLen;
  398.         unsigned char ucComMF522Buf[MAXRLEN];

  399.         ClearBitMask(Status2Reg, 0x08);
  400.         WriteRawRC(BitFramingReg, 0x07);
  401.         SetBitMask(TxControlReg, 0x03);
  402. //   
  403.         ucComMF522Buf[0] = req_code;

  404.         status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 1, ucComMF522Buf,
  405.                         &unLen);
  406. //   UART_send_byte(status);
  407.         if ((status == MI_OK) && (unLen == 0x10))
  408.         {
  409.                 *pTagType = ucComMF522Buf[0];
  410.                 *(pTagType + 1) = ucComMF522Buf[1];
  411.         }
  412.         else
  413.         {
  414.           status = MI_ERR;
  415.         }

  416.         return status;
  417. }


  418. /////////////////////////////////////////////////////////////////////
  419. //功    能:防冲撞
  420. //参数说明: pSnr[OUT]:卡片序列号,4字节
  421. //返    回: 成功返回MI_OK
  422. /////////////////////////////////////////////////////////////////////  
  423. char PcdAnticoll(unsigned char *pSnr)
  424. {
  425.     char status;
  426.     unsigned char i,snr_check=0;
  427.     unsigned int  unLen;
  428.     unsigned char ucComMF522Buf[MAXRLEN];
  429.    

  430.     ClearBitMask(Status2Reg,0x08);
  431.     WriteRawRC(BitFramingReg,0x00);
  432.     ClearBitMask(CollReg,0x80);

  433.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  434.     ucComMF522Buf[1] = 0x20;

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

  436.     if (status == MI_OK)
  437.     {
  438.              for (i=0; i<4; i++)
  439.          {   
  440.              *(pSnr+i)  = ucComMF522Buf[i];
  441.              snr_check ^= ucComMF522Buf[i];
  442.          }
  443.          if (snr_check != ucComMF522Buf[i])
  444.          {   status = MI_ERR;    }
  445.     }
  446.    
  447.     SetBitMask(CollReg,0x80);
  448.     return status;
  449. }

  450. /////////////////////////////////////////////////////////////////////
  451. //功    能:选定卡片
  452. //参数说明: pSnr[IN]:卡片序列号,4字节
  453. //返    回: 成功返回MI_OK
  454. /////////////////////////////////////////////////////////////////////
  455. char PcdSelect(unsigned char *pSnr)
  456. {
  457.     char status;
  458.     unsigned char i;
  459.     unsigned int  unLen;
  460.     unsigned char ucComMF522Buf[MAXRLEN];
  461.    
  462.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  463.     ucComMF522Buf[1] = 0x70;
  464.     ucComMF522Buf[6] = 0;
  465.     for (i=0; i<4; i++)
  466.     {
  467.             ucComMF522Buf[i+2] = *(pSnr+i);
  468.             ucComMF522Buf[6]  ^= *(pSnr+i);
  469.     }
  470.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
  471.   
  472.     ClearBitMask(Status2Reg,0x08);

  473.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
  474.    
  475.     if ((status == MI_OK) && (unLen == 0x18))
  476.     {   status = MI_OK;  }
  477.     else
  478.     {   status = MI_ERR;    }

  479.     return status;
  480. }

  481. /////////////////////////////////////////////////////////////////////
  482. //功    能:命令卡片进入休眠状态
  483. //返    回: 成功返回MI_OK
  484. /////////////////////////////////////////////////////////////////////
  485. char PcdHalt(void)
  486. {
  487. //    int status;
  488.     unsigned int  unLen;
  489.     unsigned char ucComMF522Buf[MAXRLEN];

  490.     ucComMF522Buf[0] = PICC_HALT;
  491.     ucComMF522Buf[1] = 0;
  492.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  493.     //status =
  494.     PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  495.     return MI_OK;
  496. }

  497. /////////////////////////////////////////////////////////////////////
  498. //功    能:验证卡片密码
  499. //参数说明: auth_mode[IN]: 密码验证模式
  500. //                 0x60 = 验证A密钥
  501. //                 0x61 = 验证B密钥
  502. //          addr[IN]:块地址
  503. //          pKey[IN]:密码
  504. //          pSnr[IN]:卡片序列号,4字节
  505. //返    回: 成功返回MI_OK
  506. /////////////////////////////////////////////////////////////////////               
  507. char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
  508. {
  509.     char status;
  510.     unsigned int  unLen;
  511.     unsigned char i,ucComMF522Buf[MAXRLEN];

  512.     ucComMF522Buf[0] = auth_mode;
  513.     ucComMF522Buf[1] = addr;
  514.     for (i=0; i<6; i++)
  515.     {    ucComMF522Buf[i+2] = *(pKey+i);   }
  516.     for (i=0; i<6; i++)
  517.     {    ucComMF522Buf[i+8] = *(pSnr+i);   }
  518. //   memcpy(&ucComMF522Buf[2], pKey, 6);
  519. //   memcpy(&ucComMF522Buf[8], pSnr, 4);
  520.    
  521.     status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  522.     if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  523.     {   status = MI_ERR;   }
  524.    
  525.     return status;
  526. }

  527. /////////////////////////////////////////////////////////////////////
  528. //功    能:读取M1卡一块数据
  529. //参数说明: addr[IN]:块地址
  530. //          pData[OUT]:读出的数据,16字节
  531. //返    回: 成功返回MI_OK
  532. /////////////////////////////////////////////////////////////////////
  533. char PcdRead(unsigned char addr,unsigned char *pData)
  534. {
  535.     char status;
  536.     unsigned int  unLen;
  537.     unsigned char i,ucComMF522Buf[MAXRLEN];

  538.     ucComMF522Buf[0] = PICC_READ;
  539.     ucComMF522Buf[1] = addr;
  540.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  541.    
  542.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  543.     if ((status == MI_OK) && (unLen == 0x90))
  544. //   {   memcpy(pData, ucComMF522Buf, 16);   }
  545.     {
  546.         for (i=0; i<16; i++)
  547.         {    *(pData+i) = ucComMF522Buf[i];   }
  548.     }
  549.     else
  550.     {   status = MI_ERR;   }
  551.    
  552.     return status;
  553. }

  554. /////////////////////////////////////////////////////////////////////
  555. //功    能:写数据到M1卡一块
  556. //参数说明: addr[IN]:块地址
  557. //          pData[IN]:写入的数据,16字节
  558. //返    回: 成功返回MI_OK
  559. /////////////////////////////////////////////////////////////////////                  
  560. char PcdWrite(unsigned char addr,unsigned char *pData)
  561. {
  562.     char status;
  563.     unsigned int  unLen;
  564.     unsigned char i,ucComMF522Buf[MAXRLEN];
  565.    
  566.     ucComMF522Buf[0] = PICC_WRITE;
  567.     ucComMF522Buf[1] = addr;
  568.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  570.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  571.     {   status = MI_ERR;   }
  572.         
  573.     if (status == MI_OK)
  574.     {
  575.         //memcpy(ucComMF522Buf, pData, 16);
  576.         for (i=0; i<16; i++)
  577.         {    ucComMF522Buf[i] = *(pData+i);   }
  578.         CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

  579.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  580.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  581.         {   status = MI_ERR;   }
  582.     }
  583.    
  584.     return status;
  585. }

  586. /////////////////////////////////////////////////////////////////////
  587. //功    能:扣款和充值
  588. //参数说明: dd_mode[IN]:命令字
  589. //               0xC0 = 扣款
  590. //               0xC1 = 充值
  591. //          addr[IN]:钱包地址
  592. //          pValue[IN]:4字节增(减)值,低位在前
  593. //返    回: 成功返回MI_OK
  594. /////////////////////////////////////////////////////////////////////                 
  595. char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
  596. {
  597.     char status;
  598.     unsigned int  unLen;
  599.     unsigned char ucComMF522Buf[MAXRLEN];
  600.    
  601.     ucComMF522Buf[0] = dd_mode;
  602.     ucComMF522Buf[1] = addr;
  603.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  605.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  606.     {   status = MI_ERR;   }
  607.         
  608.     if (status == MI_OK)
  609.     {
  610.         memcpy(ucComMF522Buf, pValue, 4);
  611. //       for (i=0; i<16; i++)
  612. //       {    ucComMF522Buf[i] = *(pValue+i);   }
  613.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
  614.         unLen = 0;
  615.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  616.         if (status != MI_ERR)
  617.         {    status = MI_OK;    }
  618.     }
  619.    
  620.     if (status == MI_OK)
  621.     {
  622.         ucComMF522Buf[0] = PICC_TRANSFER;
  623.         ucComMF522Buf[1] = addr;
  624.         CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  625.    
  626.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  627.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  628.         {   status = MI_ERR;   }
  629.     }
  630.     return status;
  631. }

  632. /////////////////////////////////////////////////////////////////////
  633. //功    能:备份钱包
  634. //参数说明: sourceaddr[IN]:源地址
  635. //          goaladdr[IN]:目标地址
  636. //返    回: 成功返回MI_OK
  637. /////////////////////////////////////////////////////////////////////
  638. char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
  639. {
  640.     char status;
  641.     unsigned int  unLen;
  642.     unsigned char ucComMF522Buf[MAXRLEN];

  643.     ucComMF522Buf[0] = PICC_RESTORE;
  644.     ucComMF522Buf[1] = sourceaddr;
  645.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  647.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  648.     {   status = MI_ERR;   }
  649.    
  650.     if (status == MI_OK)
  651.     {
  652.         ucComMF522Buf[0] = 0;
  653.         ucComMF522Buf[1] = 0;
  654.         ucComMF522Buf[2] = 0;
  655.         ucComMF522Buf[3] = 0;
  656.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);

  657.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  658.         if (status != MI_ERR)
  659.         {    status = MI_OK;    }
  660.     }


  661. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整代码下载:
MFRC522.zip (5.95 KB, 下载次数: 81)
回复

使用道具 举报

ID:272419 发表于 2018-4-23 19:28 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:336475 发表于 2020-4-26 17:37 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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