一、硬件:
二、[主芯片介紹]
MF RC522是應用於13.56MHz非接觸式通信中高集成度的讀寫卡芯片,是NXP公司針對“三表”應用推出的一款低電壓、低成本、體積小的非接觸式讀寫卡芯片,是智能儀表和便攜式手持設備研發的較好選擇。 MF RC522利用了先進的調制和解調概念,完全集成了在13.56MHz下所有類型的被動非接觸式通信方式和協議。支持14443A兼容應答器信號。數字部分處理ISO14443A幀和錯誤檢測。此外,還支持快速CRYPTO1加密算法,用語驗證MIFARE系列產品。MFRC522支持MIFARE系列更高速的非接觸式通信,雙向數據傳輸速率高達424kbit/s。 作為13.56MHz高集成度讀寫卡系列芯片家族的新成員,MF RC522與MF RC500和MF RC530有不少相似之處,同時也具備許多特點和差異。它與主機間通信采用連線較少的串行通信,且可根據不同的用戶需求,選取SPI、IIC或串行UART模式之一,有利於減少連線,縮小PCB板體積,降低成本。
三、[WMFRC522模塊介紹]
WMFRC522模塊采用Philips MFRC522原裝芯片設計讀卡電路,使用方便,成本低廉,適用於設備開發、讀卡器開發等高級應用的用戶、需要進行射頻卡終端設計/生產的用戶。本模塊可直接裝入各種讀卡器模具。模塊采用電壓為3.3V,通過SPI接口簡單的幾條線就可以直接與用戶任何CPU主板相連接通信,可以保證模塊穩定可靠的工作、讀卡距離遠;
注:模塊接口座可以按客戶需求更改:
目前提供UART TTL、RX232和RS485三種接口
1、RC522接口芯片電路
2、通信電路
3、PCB效果
4、焊接完后的效果圖:
4、固件:
/********************************************************************************
* @Brief : 測試522讀寫M1卡, 完成操作后PC6的LED閃爍一下,並打印到USART2上
* @Param : None
* @Retval : None
*/
u8 MFRC522Test(void)
{
u8 i;
static u8 WriteFlag;
u8 CardType[2], CardSN[4];
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
u8 DefaultData[16] = {0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x01,0xFE,0x01,0xFE};
u8 DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
u8 DataD[4] = {0,0,0,0x01};
u8 BlockData[16];
LED0_OFF();
BEEP_OFF();
if(MI_OK != PcdRequest(PICC_REQALL, CardType)) //掃描卡
{
printf("IC Card Type: %x\n", *((u16 *)CardType));
return 1;
}
if(MI_OK != PcdAnticoll(CardSN)) //防沖撞
{
printf(" IC Card SN: %x\n", *((u32 *)CardSN));
return 2;
}
if(MI_OK != PcdSelect(CardSN)) //選定卡片
return 3;
if(MI_OK != PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, CardSN))//驗證卡片密碼
return 4;
if(MI_OK != PcdRead(1, BlockData)) //讀塊
return 5;
for(i = 0; i < 4; i++)
printf("%x", BlockData[i]);
if(!WriteFlag)
{
if(MI_OK != PcdWrite(1, DefaultData)) //寫塊
return 6;
WriteFlag = 1;
printf("First Write Value\n");
}
if(MI_OK != PcdValue(PICC_DECREMENT, 1, DataD)) //扣款
return 7;
if(MI_OK != PcdRead(1, BlockData)) //讀塊
return 8;
printf("IC Card Type: %x\n", *((u16 *)CardType));
printf(" IC Card SN: %x\n", *((u32 *)CardSN));
printf("Select Card!\n");
printf("Check Pass Word Ok!\n");
printf("Data Value decrease!\n");
for(i = 0; i < 4; i++)
printf("%x", BlockData[i]);
printf("\n");
LED0_ON();
BEEP_ON();
return 0;
}