|
1、工作之余,對(duì)射頻識(shí)別卡讀寫比較好奇,就那個(gè)寶買了一款簡(jiǎn)易讀寫器,利用手邊的STM32F072板子寫一下;
2、經(jīng)過幾天努力調(diào)通了,分享一下;
3、篇幅有限,分享幾個(gè)代碼截屏;
圖片1.jpg (6.53 MB, 下載次數(shù): 50)
下載附件
2020-2-29 13:02 上傳
STM32F07.jpg (6.28 MB, 下載次數(shù): 44)
下載附件
2020-2-29 13:02 上傳
RC522代碼1.JPG (123.68 KB, 下載次數(shù): 49)
下載附件
2020-2-29 13:09 上傳
RC522代碼2.JPG (129.13 KB, 下載次數(shù): 63)
下載附件
2020-2-29 13:09 上傳
RC522代碼3.JPG (117.81 KB, 下載次數(shù): 43)
下載附件
2020-2-29 13:09 上傳
int main(void)
{
PORT_Init();
KEY_Init();//OK
TIM2_Init();//OK
UART1_Config();//PA9-TX,PA10-RX,AF1
MFRC522_Init();
IWDG_Config();//OK
if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) {RCC_ClearFlag();}//位 24 RMVF: 清除復(fù)位標(biāo)志
printf( "-----STM32F072 Mifare RC522 RFID Card reader 13.56 MHz-----\r");
while (1)
{
IWDG_ReloadCounter();//喂狗
#if 1
//-----------尋天線區(qū)內(nèi)未進(jìn)入休眠狀態(tài)的卡,返回卡片類型 2字節(jié) [1][0]-------------
if((OperationCard >= READCARD_2)&&(bIDFlag==0))
{
bIDFlag =1;
printf("---------------尋找IC卡-------------\n\r");
if (!MFRC522_Request(PICC_REQIDL,& RevBufstr[0]))
{
if(RevBufstr[1]==0x00 && RevBufstr[0]==0x04){printf("---------------IC卡S50-------------\n\r");}//0004
else if(RevBufstr[1]==0x00 && RevBufstr[0]==0x02){printf("---------------IC卡S70-------------\n\r");}//0002
else { printf("---------------XXX-------------\n\r");}
//----------防沖撞,返回卡的序列號(hào) 4字節(jié) [5][4][3][2]---------------
if (!MFRC522_Anticoll(&RevBufstr[2]))
{
IWDG_ReloadCounter();//喂狗
printf("---------------防沖撞-----------\n\r");
//序列號(hào)轉(zhuǎn)換為ASCII碼
for(CardNum=0;CardNum<4;CardNum++)
{
string[2*CardNum] = ASCII_NUM[(RevBufstr[CardNum+2]>>4)&0x0f];
string[2*CardNum+1] = ASCII_NUM[RevBufstr[CardNum+2]&0x0f];
}
printf("---------------Card ID:%s--------------\n\r",string);
//printf("---------------Card ID:%d--------------\n\r",string);// 已經(jīng)轉(zhuǎn)換成ASIC碼,需要%s字符格式!
IWDG_ReloadCounter();//喂狗
//--------------------選卡-------------------
//讀寫模塊將傳送SEL ,NVB及全部40 位的UID CLn,后面加CRC_A校驗(yàn),與這40位UID CLn匹配的RFID卡以其SAK 響應(yīng)
if (! MFRC522_SelectTag(&RevBufstr[2]))
{
printf("---------------選卡成功--------------\n\r");
IWDG_ReloadCounter();//喂狗
if(OperationCard == READCARD_2)//----------------寫卡-------------------
{
//------驗(yàn)證秘鑰keyA--------
if (! MFRC522_Auth(PICC_AUTHENT1A,7,NewKeyA,&RevBufstr[2]))
{
printf("--------------寫卡-----驗(yàn)證秘鑰keyA 成功--\n\r");
//-----讀數(shù)據(jù)塊5-----
if(!MFRC522_Write(5,&Write_Consume_Data[0]))
{
printf("---------------寫卡:%s----------\n\r",&Write_Consume_Data[0]);
MFRC522_Halt();
}
}
} else if(OperationCard==READCARD_3)//讀卡
{
IWDG_ReloadCounter();//喂狗
//------驗(yàn)證秘鑰keyA--------
if (! MFRC522_Auth(PICC_AUTHENT1A,7,NewKeyA,&RevBufstr[2]))
{
printf("------讀卡-----驗(yàn)證秘鑰keyA 成功------\n\r");
//-----讀數(shù)據(jù)塊5-----
if(!MFRC522_Read(5,&Read_Data[0]))
{
IWDG_ReloadCounter();//喂狗
//memcpy( (uint8 *)&money, Read_Data, 4 );
/*
for(CardNum=0;CardNum<4;CardNum++)
{
string[2*CardNum] = ASCII_NUM[(Read_Data[CardNum]>>4)&0x0f];
string[2*CardNum+1] = ASCII_NUM[Read_Data[CardNum]&0x0f];
}*/
printf("------------讀卡:%s---------\n\r",&Read_Data[0]);
MFRC522_Halt();
}
}
}
#if 0
if(OperationCard == REGCARD_1)//----------------注冊(cè)-------------------
{
//------驗(yàn)證秘鑰keyA--------
//#if 0
if (! MFRC522_Auth(PICC_AUTHENT1A,7,LastKeyA,&RevBufstr[2]))//
{
printf(" --------------注冊(cè)------驗(yàn)證秘鑰keyA 成功------------------ \n\r");
IWDG_ReloadCounter();//喂狗
//塊7,第1扇區(qū)尾塊;-------寫入新keyA;----------
if(!MFRC522_Write(7,&NewKey[0]))
{
IWDG_ReloadCounter();//喂狗
printf(" --------注冊(cè)----第1扇區(qū)尾塊塊7 寫入新keyA------------ \n\r");
if(!MFRC522_Write(4,&Write_Consume_Data[0]))
{
printf(" ------注冊(cè)------寫入新Write_Consume_Data 成功------------ \n\r");
IWDG_ReloadCounter();//喂狗
MFRC522_Halt();
}
}
}
//#endif
}
#endif
}
}
}
}
#endif
if(b5msFlag)
{
b5msFlag = 1;
Timer5ms();
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) == Bit_RESET)
{
Delay_ms(100);//OK
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) == Bit_RESET)//按鍵觸發(fā)DMA傳輸至UART1外設(shè)
{
if(bKeyFlag == 0)
{
bKeyFlag = 1;
bIDFlag = 0;
OperationCard ++;
if(OperationCard>3){OperationCard=0;}
printf("--------------OperationCard:%d--------------\n\r",OperationCard);
MFRC522_Init();
}
}
}else { bKeyFlag = 0;}
}
if(b500msFlag)
{
b500msFlag = 0;
bLedFlag^=1;
if(bLedFlag) LED_ON();
else LED_OFF();
}
}
}
===============================下面為利用串口助手打印出來結(jié)果===============================
MFRC522_Init
---------------尋找IC卡-------------
命令:發(fā)送并接收數(shù)據(jù)
數(shù)據(jù)寫進(jìn)RC522 FIFO緩沖區(qū)
讀取RC522中斷標(biāo)志位,等待RC522接收到IC卡返回的數(shù)據(jù)
讀取FIFO緩沖區(qū)的數(shù)據(jù)
IC卡S50 ---------------防沖撞-----------
命令:發(fā)送并接收數(shù)據(jù)
數(shù)據(jù)寫進(jìn)RC522 FIFO緩沖區(qū)
讀取RC522中斷標(biāo)志位,等待RC522接收到IC卡返回的數(shù)據(jù)
讀取FIFO緩沖區(qū)的數(shù)據(jù)
Card ID:89214F8D ---------------選卡-------------- 命令:發(fā)送并接收數(shù)據(jù)
數(shù)據(jù)寫進(jìn)RC522 FIFO緩沖區(qū)
讀取RC522中斷標(biāo)志位,等待RC522接收到IC卡返回的數(shù)據(jù)
讀取FIFO緩沖區(qū)的數(shù)據(jù) ---------------驗(yàn)證秘鑰keyA------------------
命令:驗(yàn)證秘鑰
數(shù)據(jù)寫進(jìn)RC522 FIFO緩沖區(qū)
讀取RC522中斷標(biāo)志位,等待RC522接收到IC卡返回的數(shù)據(jù)
|
-
RC522_1.jpg
(4.67 MB, 下載次數(shù): 50)
下載附件
2020-2-29 13:02 上傳
-
連接圖.jpg
(6.81 MB, 下載次數(shù): 57)
下載附件
2020-2-29 13:02 上傳
-
燒寫器.jpg
(6.2 MB, 下載次數(shù): 46)
下載附件
2020-2-29 13:02 上傳
-
-
RC522電路原理圖.pdf
2020-2-29 13:05 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
41.8 KB, 下載次數(shù): 34, 下載積分: 黑幣 -5
-
-
RC522 學(xué)習(xí)筆記 190801.docx
2020-2-29 13:05 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
1.19 MB, 下載次數(shù): 48, 下載積分: 黑幣 -5
-
-
MFRC522 IC中文說明書.pdf
2020-2-29 13:05 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
804.44 KB, 下載次數(shù): 38, 下載積分: 黑幣 -5
-
-
Mifare1 S50IC卡中文說明書.pdf
2020-2-29 13:05 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
136.12 KB, 下載次數(shù): 28, 下載積分: 黑幣 -5
-
-
RC522讀卡打印過程.docx
2020-2-29 13:05 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
15.19 KB, 下載次數(shù): 26, 下載積分: 黑幣 -5
-
-
讀卡器介紹.pdf
2020-2-29 13:05 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
1.86 MB, 下載次數(shù): 27, 下載積分: 黑幣 -5
|