完整源碼:
RFID_RC522.zip
(350.53 KB, 售價: 5 E幣)
2021-12-16 02:17 上傳
點擊文件名下載附件
售價: 5 E幣 [記錄]
[ 購買]
1.jpg (149.01 KB)
下載附件
2021-12-16 02:16 上傳
部分源碼:完整源碼見附件。
- /////////////////////////////////////////////////////////////////////
- //功 能:尋卡
- //參數說明: req_code[IN]:尋卡方式
- // 0x52 = 尋感應區內所有符合14443A標準的卡
- // 0x26 = 尋未進入休眠狀態的卡
- // 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;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:防沖撞
- //參數說明: pSnr[OUT]:卡片序列號,4字節
- //返 回: 成功返回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;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:選定卡片
- //參數說明: pSnr[IN]:卡片序列號,4字節
- //返 回: 成功返回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;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:驗證卡片密碼
- //參數說明: auth_mode[IN]: 密碼驗證模式
- // 0x60 = 驗證A密鑰
- // 0x61 = 驗證B密鑰
- // addr[IN]:塊地址
- // pKey[IN]:密碼
- // pSnr[IN]:卡片序列號,4字節
- //返 回: 成功返回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)))
- { status = MI_ERR; }
-
- return status;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:讀取M1卡一塊數據
- //參數說明: addr[IN]:塊地址
- // p [OUT]:讀出的數據,16字節
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- char PcdRead(u8 addr,u8 *p )
- {
- char status;
- u8 unLen;
- u8 i,ucComMF522Buf[MAXRLEN];
- ucComMF522Buf[0] = PICC_READ;
- ucComMF522Buf[1] = addr;
- CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
-
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
- if ((status == MI_OK) && (unLen == 0x90))
- // { memcpy(p , ucComMF522Buf, 16); }
- {
- for (i=0; i<16; i++)
- { *(p +i) = ucComMF522Buf[i]; }
- }
- else
- { status = MI_ERR; }
-
- return status;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:寫數據到M1卡一塊
- //參數說明: addr[IN]:塊地址
- // p [IN]:寫入的數據,16字節
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- char PcdWrite(u8 addr,u8 *p )
- {
- char status;
- u8 unLen;
- u8 i,ucComMF522Buf[MAXRLEN];
-
- ucComMF522Buf[0] = PICC_WRITE;
- ucComMF522Buf[1] = addr;
- CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
- if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
- { status = MI_ERR; }
-
- if (status == MI_OK)
- {
- //memcpy(ucComMF522Buf, p , 16);
- for (i=0; i<16; i++)
- {
- ucComMF522Buf[i] = *(p +i);
- }
- CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
- if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
- { status = MI_ERR; }
- }
-
- return status;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:命令卡片進入休眠狀態
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- char PcdHalt(void)
- {
- u8 status;
- u8 unLen;
- u8 ucComMF522Buf[MAXRLEN];
- ucComMF522Buf[0] = PICC_HALT;
- ucComMF522Buf[1] = 0;
- CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
- return MI_OK;
- }
- /////////////////////////////////////////////////////////////////////
- //用MF522計算CRC16函數
- /////////////////////////////////////////////////////////////////////
- void CalulateCRC(u8 *pIn ,u8 len,u8 *pOut )
- {
- u8 i,n;
- ClearBitMask(DivIrqReg,0x04);
- WriteRawRC(CommandReg,PCD_IDLE);
復制代碼
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|