PN512對ISO14443格式卡進行讀寫操作

2021-10-20 19:26:56 字數 4326 閱讀 5960

iso14443對應的是普通ic卡,即通稱的大白卡。

通訊部分**:

/

//功 能:通過rc522和iso14443**訊

//引數說明:command[in]:rc522命令字

// pindata[in]:通過rc522傳送到卡片的資料

// inlenbyte[in]:傳送資料的位元組長度

// poutdata[out]:接收到的卡片返回資料

// *poutlenbit[out]:返回資料的位長度

/char pcdcommf522(u8 command,

u8 *pindata,

u8 inlenbyte,

u8 *poutdata,

u16 *poutlenbit)

spi_writebyte(comienreg,irqen|0x80);

clearbitmask(comirqreg,0x80);

spi_writebyte(commandreg,pcd_idle);

setbitmask(fifolevelreg,0x80);

for(i=0; imaxrlen)

for (i=0; i尋卡

///功 能:尋卡

//引數說明: 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(unsigned char req_code,unsigned char *ptagtype)

else

return status;

}

防衝撞

/

//功 能:防衝撞

//引數說明: psnr[out]:卡片序列號,4位元組

//返 回: 成功返回mi_ok

/ char pcdanticoll(unsigned char *psnr)

if (snr_check != uccommf522buf[i])

}setbitmask(collreg,0x80);

// collreg第7位設定為邏輯0,碰撞後所有接收位將被清除。該位只在106kbit的逐位防撞時使用,否則設定為邏輯1。

return status;

}

選定卡片

/

//功 能:選定卡片

//引數說明: psnr[in]:卡片序列號,4位元組

//返 回: 成功返回mi_ok

/char pcdselect(unsigned char *psnr)

calulatecrc(uccommf522buf,7,&uccommf522buf[7]);

//void calulatecrc(unsigned char *pindata,unsigned char len,unsigned char *poutdata)為計算crc16校驗碼的函式

//uccommf522buf[7]是校驗後的資料

clearbitmask(status2reg,0x08);

status = pcdcommf522(pcd_transceive,uccommf522buf,9,uccommf522buf,&unlen);

if ((status == mi_ok) && (unlen == 0x18))

else

return status;

}

驗證卡片密碼

/

//功 能:驗證卡片密碼

//引數說明: auth_mode[in]: 密碼驗證模式

// 0x60 = 驗證a金鑰

// 0x61 = 驗證b金鑰

// pkey[in]:密碼

// psnr[in]:卡片序列號,4位元組

//返 回: 成功返回mi_ok

/

char pcdauthstate(unsigned char auth_mode,unsigned char addr,unsigned char *pkey,unsigned char *psnr)

for (i=0; i<6; i++)

//定義傳送幀內容

// memcpy(&uccommf522buf[2], pkey, 6);

// memcpy(&uccommf522buf[8], psnr, 4);

status = pcdcommf522(pcd_authent,uccommf522buf,12,uccommf522buf,&unlen);

if ((status != mi_ok) || (!(spi_readbyte(status2reg) & 0x08)))

return status;

}

讀取、寫入m1卡一塊資料

/

//功 能:讀取m1卡一塊資料

// pdata[out]:讀出的資料,16位元組

//返 回: 成功返回mi_ok

/ char pcdread(unsigned char addr,unsigned char *pdata)

}else

return status;}/

//功 能:寫資料到m1卡一塊

// pdata[in]:寫入的資料,16位元組

//返 回: 成功返回mi_ok

/

char pcdwrite(unsigned char addr,unsigned char *pdata)

if (status == mi_ok)

calulatecrc(uccommf522buf,16,&uccommf522buf[16]);

status = pcdcommf522(pcd_transceive,uccommf522buf,18,uccommf522buf,&unlen);

if ((status != mi_ok) || (unlen != 4) || ((uccommf522buf[0] & 0x0f) != 0x0a))

}return status;

}

iso14443b是大部分cpu卡的協議,這裡以身份證為例。

二代身份證是應答標準的reqb指令,但是attrib指令是非標準的

並且其他的資料都是加密的,需要公安部授權的加密模組才能讀取

二代身份證的唯一uid可以通過下列步驟讀取:

1: pcd傳送reqb命令05 00 00

二代收到後會傳送atqb應答:0x6d, 0x00

2: pcd傳送非標準attrib命令1d 00 00 00 00 00 08 01 08

二代身份證返回應答:0x6d, 0x00

3: pcd傳送讀取uid命令00 36 00 00 08

二代身份證返回uid應答(10個位元組uid):

/

//功 能:通過rc522與身份證進行通訊並傳回uuid

//引數說明: atqb[2]:讀取的rebq命令應答

// attrib[2]:讀取attrib命令應答

// uuid[10]:讀取的uuid值

/unsigned char atqb[2]=;//rebq命令應答

unsigned char attrib[2]=;//attrib命令應答

unsigned char uuid[10]=;//讀取uuid命令返回的uuid

void pcdrequest_idcard(void)

射頻識別技術漫談 30 PN512的暫存器設定

pn512是nxp推出的一款低功耗 支援多協議的13.56mhz射頻介面晶元。在主動模式下,可以讀寫iso iec 14443a mifare iso iec 14443b和felica卡。到底讀寫哪一種卡,主要決定於對pn512的暫存器設定。在本人開發的一款可讀寫上述三種卡片的讀寫器中,將pn51...

洛谷每日一練5 12 P1338 逆序對

題目描述 只要是參加 jsoi 活動的同學一定都聽說過 hanoi 塔的傳說 三根柱子上的金片每天被移動一次,當所有的金片都被移完之後,世界末日也就隨之降臨了。在古老東方的幻想鄉,人們都採用一種奇特的方式記錄日期 他們用一些特殊的符號來表示從 1 開始的連續整數,1 表示最小而 n 表示最大。創世紀...