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 表示最大。創世紀...