国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

stm32 rc522射頻模塊程序

[復(fù)制鏈接]
樓主
coolice 發(fā)表于 2021-8-14 01:20:02 | 只看該作者 |倒序瀏覽 |閱讀模式
射頻模塊程序源碼: RFID_RC522.zip (7.22 MB, 售價: 2 E幣)
部分源碼如下,完整源碼見附件
  1. u8 SPIWriteByte(u8 Byte)
  2. {
  3.         while((SPI2->SR&0X02)==0);                //等待發(fā)送區(qū)空         
  4.         SPI2->DR=Byte;                             //發(fā)送一個byte   
  5.         while((SPI2->SR&0X01)==0);      //等待接收完一個byte  
  6.         return SPI2->DR;                      //返回收到的數(shù)據(jù)                       
  7. }

  8. //SPIx 讀寫一個字節(jié)
  9. //TxData:要寫入的字節(jié)
  10. //返回值:讀取到的字節(jié)
  11. u8 SPI2_ReadWriteByte(u8 TxData)
  12. {               
  13.         u8 retry=0;                                       
  14.         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //檢查指定的SPI標(biāo)志位設(shè)置與否:發(fā)送緩存空標(biāo)志位
  15.                 {
  16.                 retry++;
  17.                 if(retry>200)return 0;
  18.                 }                          
  19.         SPI_I2S_SendData(SPI2, TxData); //通過外設(shè)SPIx發(fā)送一個數(shù)據(jù)
  20.         retry=0;

  21.         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //檢查指定的SPI標(biāo)志位設(shè)置與否:接受緩存非空標(biāo)志位
  22.                 {
  23.                 retry++;
  24.                 if(retry>200)return 0;
  25.                 }                                                              
  26.         return SPI_I2S_ReceiveData(SPI2); //返回通過SPIx最近接收的數(shù)據(jù)                                            
  27. }


  28. //SPI 速度設(shè)置函數(shù)
  29. //SpeedSet:
  30. //SPI_BaudRatePrescaler_2   2分頻   
  31. //SPI_BaudRatePrescaler_8   8分頻   
  32. //SPI_BaudRatePrescaler_16  16分頻  
  33. //SPI_BaudRatePrescaler_256 256分頻
  34.   
  35. void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
  36. {
  37.           assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
  38.         SPI2->CR1&=0XFFC7;
  39.         SPI2->CR1|=SPI_BaudRatePrescaler;        //設(shè)置SPI2速度
  40.         SPI_Cmd(SPI2,ENABLE);

  41. }




  42. void SPI2_Init(void)      
  43. {
  44.         GPIO_InitTypeDef GPIO_InitStructure;
  45.           SPI_InitTypeDef  SPI_InitStructure;
  46.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE );//PORTB時鐘使能
  47.         RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );//SPI2時鐘使能

  48.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;         //IO-->PF0、PF1 端口配置
  49.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  50.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  51.     GPIO_Init(GPIOF, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化PF0、PF1
  52.     GPIO_ResetBits(GPIOF,GPIO_Pin_1);                                     //PF1輸出低
  53.     //GPIO_SetBits(GPIOF,GPIO_Pin_0);

  54.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  55.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15復(fù)用推挽輸出
  56.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  57.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

  58.         GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

  59.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //設(shè)置SPI單向或者雙向的數(shù)據(jù)模式:SPI設(shè)置為雙線雙向全雙工
  60.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //設(shè)置SPI工作模式:設(shè)置為主SPI
  61.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //設(shè)置SPI的數(shù)據(jù)大小:SPI發(fā)送接收8位幀結(jié)構(gòu)
  62.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //串行同步時鐘的空閑狀態(tài)為低電平
  63.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //串行同步時鐘的第一個跳變沿(上升或下降)數(shù)據(jù)被采樣
  64.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內(nèi)部NSS信號有SSI位控制
  65.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定義波特率預(yù)分頻的值:波特率預(yù)分頻值為256
  66.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定數(shù)據(jù)傳輸從MSB位還是LSB位開始:數(shù)據(jù)傳輸從MSB位開始
  67.         SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值計算的多項式
  68.         SPI_Init(SPI2, &SPI_InitStructure);  //根據(jù)SPI_InitStruct中指定的參數(shù)初始化外設(shè)SPIx寄存器

  69.         SPI_Cmd(SPI2, ENABLE); //使能SPI外設(shè)
  70.       
  71.         //SPI2_ReadWriteByte(0xff);//啟動傳輸      
  72. }

  73. void InitRc522(void)
  74. {
  75.   SPI2_Init();
  76.   PcdReset();
  77.   PcdAntennaOff();
  78.   delay_ms(2);  
  79.   PcdAntennaOn();
  80.   M500PcdConfigISOType( 'A' );
  81. }
  82. void Reset_RC522(void)
  83. {
  84.   PcdReset();
  85.   PcdAntennaOff();
  86.   delay_ms(2);  
  87.   PcdAntennaOn();
  88. }                        
  89. /////////////////////////////////////////////////////////////////////
  90. //功    能:尋卡
  91. //參數(shù)說明: req_code[IN]:尋卡方式
  92. //                0x52 = 尋感應(yīng)區(qū)內(nèi)所有符合14443A標(biāo)準(zhǔn)的卡
  93. //                0x26 = 尋未進(jìn)入休眠狀態(tài)的卡
  94. //          pTagType[OUT]:卡片類型代碼
  95. //                0x4400 = Mifare_UltraLight
  96. //                0x0400 = Mifare_One(S50)
  97. //                0x0200 = Mifare_One(S70)
  98. //                0x0800 = Mifare_Pro(X)
  99. //                0x4403 = Mifare_DESFire
  100. //返    回: 成功返回MI_OK
  101. /////////////////////////////////////////////////////////////////////
  102. char PcdRequest(u8   req_code,u8 *pTagType)
  103. {
  104.         char   status;  
  105.         u8   unLen;
  106.         u8   ucComMF522Buf[MAXRLEN];

  107.         ClearBitMask(Status2Reg,0x08);
  108.         WriteRawRC(BitFramingReg,0x07);
  109.         SetBitMask(TxControlReg,0x03);

  110.         ucComMF522Buf[0] = req_code;

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

  112.         if ((status == MI_OK) && (unLen == 0x10))
  113.         {   
  114.                 *pTagType     = ucComMF522Buf[0];
  115.                 *(pTagType+1) = ucComMF522Buf[1];
  116.         }
  117.         else
  118.         {   status = MI_ERR;   }
  119.    
  120.         return status;
  121. }

  122. /////////////////////////////////////////////////////////////////////
  123. //功    能:防沖撞
  124. //參數(shù)說明: pSnr[OUT]:卡片序列號,4字節(jié)
  125. //返    回: 成功返回MI_OK
  126. /////////////////////////////////////////////////////////////////////  
  127. char PcdAnticoll(u8 *pSnr)
  128. {
  129.     char   status;
  130.     u8   i,snr_check=0;
  131.     u8   unLen;
  132.     u8   ucComMF522Buf[MAXRLEN];
  133.    

  134.     ClearBitMask(Status2Reg,0x08);
  135.     WriteRawRC(BitFramingReg,0x00);
  136.     ClearBitMask(CollReg,0x80);

  137.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  138.     ucComMF522Buf[1] = 0x20;

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

  140.     if (status == MI_OK)
  141.     {
  142.              for (i=0; i<4; i++)
  143.          {   
  144.              *(pSnr+i)  = ucComMF522Buf[i];
  145.              snr_check ^= ucComMF522Buf[i];
  146.          }
  147.          if (snr_check != ucComMF522Buf[i])
  148.          {   status = MI_ERR;    }
  149.     }
  150.    
  151.     SetBitMask(CollReg,0x80);
  152.     return status;
  153. }

  154. /////////////////////////////////////////////////////////////////////
  155. //功    能:選定卡片
  156. //參數(shù)說明: pSnr[IN]:卡片序列號,4字節(jié)
  157. //返    回: 成功返回MI_OK
  158. /////////////////////////////////////////////////////////////////////
  159. char PcdSelect(u8 *pSnr)
  160. {
  161.     char   status;
  162.     u8   i;
  163.     u8   unLen;
  164.     u8   ucComMF522Buf[MAXRLEN];
  165.    
  166.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  167.     ucComMF522Buf[1] = 0x70;
  168.     ucComMF522Buf[6] = 0;
  169.     for (i=0; i<4; i++)
  170.     {
  171.             ucComMF522Buf[i+2] = *(pSnr+i);
  172.             ucComMF522Buf[6]  ^= *(pSnr+i);
  173.     }
  174.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
  175.   
  176.     ClearBitMask(Status2Reg,0x08);

  177.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
  178.    
  179.     if ((status == MI_OK) && (unLen == 0x18))
  180.     {   status = MI_OK;  }
  181.     else
  182.     {   status = MI_ERR;    }

  183.     return status;
  184. }

  185. /////////////////////////////////////////////////////////////////////
  186. //功    能:驗證卡片密碼
  187. //參數(shù)說明: auth_mode[IN]: 密碼驗證模式
  188. //                 0x60 = 驗證A密鑰
  189. //                 0x61 = 驗證B密鑰
  190. //          addr[IN]:塊地址
  191. //          pKey[IN]:密碼
  192. //          pSnr[IN]:卡片序列號,4字節(jié)
  193. //返    回: 成功返回MI_OK
  194. /////////////////////////////////////////////////////////////////////               
  195. char PcdAuthState(u8   auth_mode,u8   addr,u8 *pKey,u8 *pSnr)
  196. {
  197.     char   status;
  198.     u8   unLen;
  199.     u8   i,ucComMF522Buf[MAXRLEN];

  200.     ucComMF522Buf[0] = auth_mode;
  201.     ucComMF522Buf[1] = addr;
  202. //    for (i=0; i<6; i++)
  203. //    {    ucComMF522Buf[i+2] = *(pKey+i);   }
  204. //    for (i=0; i<6; i++)
  205. //    {    ucComMF522Buf[i+8] = *(pSnr+i);   }
  206.     memcpy(&ucComMF522Buf[2], pKey, 6);
  207.     memcpy(&ucComMF522Buf[8], pSnr, 4);
  208.    
  209.     status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  210.     if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
復(fù)制代碼


沙發(fā)
17688798040 發(fā)表于 2021-8-14 14:10:51 | 只看該作者
看起來好難啊
板凳
17688798040 發(fā)表于 2021-8-14 14:12:08 | 只看該作者
高手的必備技能
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

手機(jī)版|小黑屋|ELEOK |網(wǎng)站地圖

GMT+8, 2026-5-26 01:10

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復(fù) 返回頂部 返回列表