射頻模塊程序源碼:
RFID_RC522.zip
(7.22 MB, 售價: 2 E幣)
2021-8-14 01:18 上傳
點擊文件名下載附件
售價: 2 E幣 [記錄]
[ 購買]
部分源碼如下,完整源碼見附件
- u8 SPIWriteByte(u8 Byte)
- {
- while((SPI2->SR&0X02)==0); //等待發(fā)送區(qū)空
- SPI2->DR=Byte; //發(fā)送一個byte
- while((SPI2->SR&0X01)==0); //等待接收完一個byte
- return SPI2->DR; //返回收到的數(shù)據(jù)
- }
- //SPIx 讀寫一個字節(jié)
- //TxData:要寫入的字節(jié)
- //返回值:讀取到的字節(jié)
- u8 SPI2_ReadWriteByte(u8 TxData)
- {
- u8 retry=0;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //檢查指定的SPI標(biāo)志位設(shè)置與否:發(fā)送緩存空標(biāo)志位
- {
- retry++;
- if(retry>200)return 0;
- }
- SPI_I2S_SendData(SPI2, TxData); //通過外設(shè)SPIx發(fā)送一個數(shù)據(jù)
- retry=0;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //檢查指定的SPI標(biāo)志位設(shè)置與否:接受緩存非空標(biāo)志位
- {
- retry++;
- if(retry>200)return 0;
- }
- return SPI_I2S_ReceiveData(SPI2); //返回通過SPIx最近接收的數(shù)據(jù)
- }
- //SPI 速度設(shè)置函數(shù)
- //SpeedSet:
- //SPI_BaudRatePrescaler_2 2分頻
- //SPI_BaudRatePrescaler_8 8分頻
- //SPI_BaudRatePrescaler_16 16分頻
- //SPI_BaudRatePrescaler_256 256分頻
-
- void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
- {
- assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
- SPI2->CR1&=0XFFC7;
- SPI2->CR1|=SPI_BaudRatePrescaler; //設(shè)置SPI2速度
- SPI_Cmd(SPI2,ENABLE);
- }
- void SPI2_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- SPI_InitTypeDef SPI_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE );//PORTB時鐘使能
- RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2時鐘使能
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //IO-->PF0、PF1 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOF, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化PF0、PF1
- GPIO_ResetBits(GPIOF,GPIO_Pin_1); //PF1輸出低
- //GPIO_SetBits(GPIOF,GPIO_Pin_0);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15復(fù)用推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
- GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //設(shè)置SPI單向或者雙向的數(shù)據(jù)模式:SPI設(shè)置為雙線雙向全雙工
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //設(shè)置SPI工作模式:設(shè)置為主SPI
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //設(shè)置SPI的數(shù)據(jù)大小:SPI發(fā)送接收8位幀結(jié)構(gòu)
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行同步時鐘的空閑狀態(tài)為低電平
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步時鐘的第一個跳變沿(上升或下降)數(shù)據(jù)被采樣
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內(nèi)部NSS信號有SSI位控制
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定義波特率預(yù)分頻的值:波特率預(yù)分頻值為256
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定數(shù)據(jù)傳輸從MSB位還是LSB位開始:數(shù)據(jù)傳輸從MSB位開始
- SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值計算的多項式
- SPI_Init(SPI2, &SPI_InitStructure); //根據(jù)SPI_InitStruct中指定的參數(shù)初始化外設(shè)SPIx寄存器
- SPI_Cmd(SPI2, ENABLE); //使能SPI外設(shè)
-
- //SPI2_ReadWriteByte(0xff);//啟動傳輸
- }
- void InitRc522(void)
- {
- SPI2_Init();
- PcdReset();
- PcdAntennaOff();
- delay_ms(2);
- PcdAntennaOn();
- M500PcdConfigISOType( 'A' );
- }
- void Reset_RC522(void)
- {
- PcdReset();
- PcdAntennaOff();
- delay_ms(2);
- PcdAntennaOn();
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:尋卡
- //參數(shù)說明: req_code[IN]:尋卡方式
- // 0x52 = 尋感應(yīng)區(qū)內(nèi)所有符合14443A標(biāo)準(zhǔn)的卡
- // 0x26 = 尋未進(jìn)入休眠狀態(tài)的卡
- // pTagType[OUT]:卡片類型代碼
- // 0x4400 = Mifare_UltraLight
- // 0x0400 = Mifare_One(S50)
- // 0x0200 = Mifare_One(S70)
- // 0x0800 = Mifare_Pro(X)
- // 0x4403 = Mifare_DESFire
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- char PcdRequest(u8 req_code,u8 *pTagType)
- {
- char status;
- u8 unLen;
- u8 ucComMF522Buf[MAXRLEN];
- ClearBitMask(Status2Reg,0x08);
- WriteRawRC(BitFramingReg,0x07);
- SetBitMask(TxControlReg,0x03);
- ucComMF522Buf[0] = req_code;
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
- if ((status == MI_OK) && (unLen == 0x10))
- {
- *pTagType = ucComMF522Buf[0];
- *(pTagType+1) = ucComMF522Buf[1];
- }
- else
- { status = MI_ERR; }
-
- return status;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:防沖撞
- //參數(shù)說明: pSnr[OUT]:卡片序列號,4字節(jié)
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- char PcdAnticoll(u8 *pSnr)
- {
- char status;
- u8 i,snr_check=0;
- u8 unLen;
- u8 ucComMF522Buf[MAXRLEN];
-
- ClearBitMask(Status2Reg,0x08);
- WriteRawRC(BitFramingReg,0x00);
- ClearBitMask(CollReg,0x80);
- ucComMF522Buf[0] = PICC_ANTICOLL1;
- ucComMF522Buf[1] = 0x20;
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
- if (status == MI_OK)
- {
- for (i=0; i<4; i++)
- {
- *(pSnr+i) = ucComMF522Buf[i];
- snr_check ^= ucComMF522Buf[i];
- }
- if (snr_check != ucComMF522Buf[i])
- { status = MI_ERR; }
- }
-
- SetBitMask(CollReg,0x80);
- return status;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:選定卡片
- //參數(shù)說明: pSnr[IN]:卡片序列號,4字節(jié)
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- char PcdSelect(u8 *pSnr)
- {
- char status;
- u8 i;
- u8 unLen;
- u8 ucComMF522Buf[MAXRLEN];
-
- ucComMF522Buf[0] = PICC_ANTICOLL1;
- ucComMF522Buf[1] = 0x70;
- ucComMF522Buf[6] = 0;
- for (i=0; i<4; i++)
- {
- ucComMF522Buf[i+2] = *(pSnr+i);
- ucComMF522Buf[6] ^= *(pSnr+i);
- }
- CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
-
- ClearBitMask(Status2Reg,0x08);
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
-
- if ((status == MI_OK) && (unLen == 0x18))
- { status = MI_OK; }
- else
- { status = MI_ERR; }
- return status;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:驗證卡片密碼
- //參數(shù)說明: auth_mode[IN]: 密碼驗證模式
- // 0x60 = 驗證A密鑰
- // 0x61 = 驗證B密鑰
- // addr[IN]:塊地址
- // pKey[IN]:密碼
- // pSnr[IN]:卡片序列號,4字節(jié)
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- char PcdAuthState(u8 auth_mode,u8 addr,u8 *pKey,u8 *pSnr)
- {
- char status;
- u8 unLen;
- u8 i,ucComMF522Buf[MAXRLEN];
- ucComMF522Buf[0] = auth_mode;
- ucComMF522Buf[1] = addr;
- // for (i=0; i<6; i++)
- // { ucComMF522Buf[i+2] = *(pKey+i); }
- // for (i=0; i<6; i++)
- // { ucComMF522Buf[i+8] = *(pSnr+i); }
- memcpy(&ucComMF522Buf[2], pKey, 6);
- memcpy(&ucComMF522Buf[8], pSnr, 4);
-
- status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
- if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
復(fù)制代碼
【必讀】版權(quán)免責(zé)聲明
1、本主題所有言論和內(nèi)容純屬會員個人意見,與本論壇立場無關(guān)。2、本站對所發(fā)內(nèi)容真實性、客觀性、可用性不做任何保證也不負(fù)任何責(zé)任,網(wǎng)友之間僅出于學(xué)習(xí)目的進(jìn)行交流。3、對提供的數(shù)字內(nèi)容不擁有任何權(quán)利,其版權(quán)歸原著者擁有。請勿將該數(shù)字內(nèi)容進(jìn)行商業(yè)交易、轉(zhuǎn)載等行為,該內(nèi)容只為學(xué)習(xí)所提供,使用后發(fā)生的一切問題與本站無關(guān)。 4、本網(wǎng)站不保證本站提供的下載資源的準(zhǔn)確性、安全性和完整性;同時本網(wǎng)站也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網(wǎng)站所有軟件和資料均為網(wǎng)友推薦收集整理而來,僅供學(xué)習(xí)用途使用,請務(wù)必下載后兩小時內(nèi)刪除,禁止商用。6、如有侵犯你版權(quán)的,請及時聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|