找回密码
 注册

QQ登录

只需一步,快速开始

搜索

stm32 rc522射频模块程序源码

[复制链接]
coolice 发表于 2021-12-16 02:17:57 | 显示全部楼层 |阅读模式
完整源码: RFID_RC522.zip (350.53 KB, 售价: 5 E币)

1.jpg
部分源码:完整源码见附件。
  1. /////////////////////////////////////////////////////////////////////
  2. //功    能:寻卡
  3. //参数说明: req_code[IN]:寻卡方式
  4. //                0x52 = 寻感应区内所有符合14443A标准的卡
  5. //                0x26 = 寻未进入休眠状态的卡
  6. //          pTagType[OUT]:卡片类型代码
  7. //                0x4400 = Mifare_UltraLight
  8. //                0x0400 = Mifare_One(S50)
  9. //                0x0200 = Mifare_One(S70)
  10. //                0x0800 = Mifare_Pro(X)
  11. //                0x4403 = Mifare_DESFire
  12. //返    回: 成功返回MI_OK
  13. /////////////////////////////////////////////////////////////////////
  14. char PcdRequest(u8   req_code,u8 *pTagType)
  15. {
  16.         char   status;  
  17.         u8   unLen;
  18.         u8   ucComMF522Buf[MAXRLEN];

  19.         ClearBitMask(Status2Reg,0x08);
  20.         WriteRawRC(BitFramingReg,0x07);
  21.         SetBitMask(TxControlReg,0x03);

  22.         ucComMF522Buf[0] = req_code;

  23.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);

  24.         if ((status == MI_OK) && (unLen == 0x10))
  25.         {   
  26.                 *pTagType     = ucComMF522Buf[0];
  27.                 *(pTagType+1) = ucComMF522Buf[1];
  28.         }
  29.         else
  30.         {   status = MI_ERR;   }
  31.    
  32.         return status;
  33. }

  34. /////////////////////////////////////////////////////////////////////
  35. //功    能:防冲撞
  36. //参数说明: pSnr[OUT]:卡片序列号,4字节
  37. //返    回: 成功返回MI_OK
  38. /////////////////////////////////////////////////////////////////////  
  39. char PcdAnticoll(u8 *pSnr)
  40. {
  41.     char   status;
  42.     u8   i,snr_check=0;
  43.     u8   unLen;
  44.     u8   ucComMF522Buf[MAXRLEN];
  45.    

  46.     ClearBitMask(Status2Reg,0x08);
  47.     WriteRawRC(BitFramingReg,0x00);
  48.     ClearBitMask(CollReg,0x80);

  49.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  50.     ucComMF522Buf[1] = 0x20;

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

  52.     if (status == MI_OK)
  53.     {
  54.              for (i=0; i<4; i++)
  55.          {   
  56.              *(pSnr+i)  = ucComMF522Buf[i];
  57.              snr_check ^= ucComMF522Buf[i];
  58.          }
  59.          if (snr_check != ucComMF522Buf[i])
  60.          {   status = MI_ERR;    }
  61.     }
  62.    
  63.     SetBitMask(CollReg,0x80);
  64.     return status;
  65. }

  66. /////////////////////////////////////////////////////////////////////
  67. //功    能:选定卡片
  68. //参数说明: pSnr[IN]:卡片序列号,4字节
  69. //返    回: 成功返回MI_OK
  70. /////////////////////////////////////////////////////////////////////
  71. char PcdSelect(u8 *pSnr)
  72. {
  73.     char   status;
  74.     u8   i;
  75.     u8   unLen;
  76.     u8   ucComMF522Buf[MAXRLEN];
  77.    
  78.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  79.     ucComMF522Buf[1] = 0x70;
  80.     ucComMF522Buf[6] = 0;
  81.     for (i=0; i<4; i++)
  82.     {
  83.             ucComMF522Buf[i+2] = *(pSnr+i);
  84.             ucComMF522Buf[6]  ^= *(pSnr+i);
  85.     }
  86.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
  87.   
  88.     ClearBitMask(Status2Reg,0x08);

  89.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
  90.    
  91.     if ((status == MI_OK) && (unLen == 0x18))
  92.     {   status = MI_OK;  }
  93.     else
  94.     {   status = MI_ERR;    }

  95.     return status;
  96. }

  97. /////////////////////////////////////////////////////////////////////
  98. //功    能:验证卡片密码
  99. //参数说明: auth_mode[IN]: 密码验证模式
  100. //                 0x60 = 验证A密钥
  101. //                 0x61 = 验证B密钥
  102. //          addr[IN]:块地址
  103. //          pKey[IN]:密码
  104. //          pSnr[IN]:卡片序列号,4字节
  105. //返    回: 成功返回MI_OK
  106. /////////////////////////////////////////////////////////////////////               
  107. char PcdAuthState(u8   auth_mode,u8   addr,u8 *pKey,u8 *pSnr)
  108. {
  109.     char   status;
  110.     u8   unLen;
  111.     u8   i,ucComMF522Buf[MAXRLEN];

  112.     ucComMF522Buf[0] = auth_mode;
  113.     ucComMF522Buf[1] = addr;
  114. //    for (i=0; i<6; i++)
  115. //    {    ucComMF522Buf[i+2] = *(pKey+i);   }
  116. //    for (i=0; i<6; i++)
  117. //    {    ucComMF522Buf[i+8] = *(pSnr+i);   }
  118.     memcpy(&ucComMF522Buf[2], pKey, 6);
  119.     memcpy(&ucComMF522Buf[8], pSnr, 4);
  120.    
  121.     status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  122.     if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  123.     {   status = MI_ERR;   }
  124.    
  125.     return status;
  126. }

  127. /////////////////////////////////////////////////////////////////////
  128. //功    能:读取M1卡一块数据
  129. //参数说明: addr[IN]:块地址
  130. //          p [OUT]:读出的数据,16字节
  131. //返    回: 成功返回MI_OK
  132. /////////////////////////////////////////////////////////////////////
  133. char PcdRead(u8   addr,u8 *p )
  134. {
  135.     char   status;
  136.     u8   unLen;
  137.     u8   i,ucComMF522Buf[MAXRLEN];

  138.     ucComMF522Buf[0] = PICC_READ;
  139.     ucComMF522Buf[1] = addr;
  140.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  141.    
  142.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  143.     if ((status == MI_OK) && (unLen == 0x90))
  144. //   {   memcpy(p , ucComMF522Buf, 16);   }
  145.     {
  146.         for (i=0; i<16; i++)
  147.         {    *(p +i) = ucComMF522Buf[i];   }
  148.     }
  149.     else
  150.     {   status = MI_ERR;   }
  151.    
  152.     return status;
  153. }

  154. /////////////////////////////////////////////////////////////////////
  155. //功    能:写数据到M1卡一块
  156. //参数说明: addr[IN]:块地址
  157. //          p [IN]:写入的数据,16字节
  158. //返    回: 成功返回MI_OK
  159. /////////////////////////////////////////////////////////////////////                  
  160. char PcdWrite(u8   addr,u8 *p )
  161. {
  162.     char   status;
  163.     u8   unLen;
  164.     u8   i,ucComMF522Buf[MAXRLEN];
  165.    
  166.     ucComMF522Buf[0] = PICC_WRITE;
  167.     ucComMF522Buf[1] = addr;
  168.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  170.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  171.     {   status = MI_ERR;   }
  172.         
  173.     if (status == MI_OK)
  174.     {
  175.         //memcpy(ucComMF522Buf, p , 16);
  176.         for (i=0; i<16; i++)
  177.         {   
  178.                 ucComMF522Buf[i] = *(p +i);   
  179.         }
  180.         CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

  181.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  182.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  183.         {   status = MI_ERR;   }
  184.     }
  185.    
  186.     return status;
  187. }

  188. /////////////////////////////////////////////////////////////////////
  189. //功    能:命令卡片进入休眠状态
  190. //返    回: 成功返回MI_OK
  191. /////////////////////////////////////////////////////////////////////
  192. char PcdHalt(void)
  193. {
  194.     u8   status;
  195.     u8   unLen;
  196.     u8   ucComMF522Buf[MAXRLEN];

  197.     ucComMF522Buf[0] = PICC_HALT;
  198.     ucComMF522Buf[1] = 0;
  199.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  201.     return MI_OK;
  202. }

  203. /////////////////////////////////////////////////////////////////////
  204. //用MF522计算CRC16函数
  205. /////////////////////////////////////////////////////////////////////
  206. void CalulateCRC(u8 *pIn ,u8   len,u8 *pOut )
  207. {
  208.     u8   i,n;
  209.     ClearBitMask(DivIrqReg,0x04);
  210.     WriteRawRC(CommandReg,PCD_IDLE);
复制代码


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

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-11-21 16:44

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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