這幾天玩玩pn532讀寫Mifare1 Card,s50,s70,在網上看了一些文章,照着做了,嘗試了很久才成功最坑的莫過於校驗位,還有認證過程。
1.先了解幀(frame)的結構:
可能好多人對英文望而卻步,在下不才,解釋下
1.PREAMBLE1 byte4,
這個就是所謂的幀頭,也稱爲前導碼,一般是00
2.START CODE2 bytes (0x00 and 0xFF),
開始碼
2個字節,分別是 00和FF
3.LEN1 byte indicating the number of bytes in the data field
(TFI and PD0 to PDn),
這個是數據長度,一個TFI和n個PD
3.LCS1 Packet Length Checksum LCS byte that satisfies the relation:
Lower byte of [LEN + LCS] = 0x00,
這個是LEN的補碼,也就是(LEN取反+1)
4.TFI1 byte frame identifier, the value of this byte depends
on the way of the message
- D4h
in case of a frame from the host controller to the PN532,
- D5h
in case of a frame from the PN532 to the host controller.
表示數據流向 D4 表示 數據發向PN532
D5 表示 PN532數據發出
5.DATALEN-1 bytes of Packet Data Information
The first byte PD0 is the Command Code,
搞了半天,這纔是我們想要發的數據,DATA的第一個字節PD0爲控制字符,其餘爲普通數據。該包長度爲
LEN-1
6.DCS1 Data Checksum DCS byte that satisfies the relation:
Lower byte of [TFI + PD0 + PD1 + … + PDn + DCS] = 0x00,
DCS
其實最坑了,根本不知道怎麼算出來的。其實就是把這些十六進制數加起來,後兩位取補碼即可。即(TFI + PD0 + PD1 + … + PDn)累加和,取後兩位的補碼。
POSTAMBLE1 byte2.
幀尾
一般爲 00
The amount of data that can be exchanged using this frame structure is limited to 255
bytes (including TFI).
PC->PN532: 00 00 FF 04 FC D4 4A 02 00 E0 00
析: 04 //代表有四個數據分別是 D4 4A 02 0002 //卡數量,0--2
00 //波特率 106K
00 00 FF 0C F4 D5 4B 01 01 00 04 08 04 A1 9F F5 5E 3B 00
析:00 00 FF 00 FF 00 //ACK
00 00 FF 0C F4
D5 //PN532 到 MCU
4B //響應命令
01 //目標卡1
01 //目標卡數量,最大爲0x02,最小爲0
00 04 //atq
08 //卡容量 08=1K
04 //4個字節UID
02 F5 13 BE //UID
06 00 //DCS+POST
到這一步總體來說還算順利,主要是因爲可以發送完命令在再刷卡也行,也可以把卡一直放上。
3、密鑰驗證,注意驗證完祕鑰,卡不能離開,需要一直放在上面,才能順利的完成下面讀寫操作,我就栽了,驗證完祕鑰卡就離開了,讀寫卡怎麼都不成功,浪費了一下午。還有注意替第二個步驟的UID,最後根據自己的UID計算校驗位即倒數第二位。
PC->PN532: 00 00 fF 0F F1 D4 40 01 60 07 FF FF FF FF FF FFA1 9F F5 5E C2 00
析: 40 //命令
01 //卡1
60 //密鑰驗證命令
07 //塊號
ff ff ff ff ff ff //密鑰
A1 9F F5 5E //UID 替換爲步驟2得到的UID
C2 //檢驗位,根據替換的UID計算,計方法跟步驟2一樣。
PN532->PC: 00
00 FF 00 FF 00
00 00 FF 03 FD D5 41 00 EA 00
析: 41 00 //正確狀態
4.開始讀卡,M1卡有16個扇區,每個扇區4個塊.具體看博文http://blog.csdn.net/yxstars/article/details/38081521
//07是控制字節
PC->PN532: 00 00 ff 05 fb D4 40 01 30 07 B4 00 //讀第7塊
PC->PN532: 00 00 ff 05 fb D4 40 01 30 06 B5 00 //讀第6塊
PC->PN532: 00 00 ff 05 fb D4 40 01 30 08 B3 00 //讀第8塊
析: 40 //命令
01 //卡1
30 //讀卡命令
07 //快號
PN532->PC:
00 00 FF 00 FF 00 //ACK
00 00 FF 13 ED D5 41 00 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 01 00 //7塊
PN532->PC:
00 00 FF 00 FF 00 //ACK
00 00 FF 13 ED D5 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 EA 00 //6塊
析: 41 00 //正確
err: 00 00 FF 00 FF 00
00 00 FF 03 FD D5 41 13 D7 00
析: 41 03 //錯誤
5、寫卡
PC->PN532: 00 00 ff 15 EB D4 40 01 A0 06 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F CD 00
析: 40 //命令
01 //卡1
A0 //寫卡命令
06 //塊號
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F //16字節數據
CD//校驗和,如果更改其他的數需重新計算。
PN532->PC:
00 00 00 FF 00 FF 00
00 00 FF 03 FD D5 41 00 EA 00
至此,讀寫卡的就完成了,接下來搞P2P,正在研究,接來下來更新。