pn532中遇到的坑-----Mifare1 Card(一)

這幾天玩玩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).

最後一句話了,,這種的數據結構只能有255 個data (包括TFI),還有幾種種結構,這裏先不說了。


/**************************************分割線**開始實戰讀寫M1卡********************************************/
本人用的pn532的主控芯片,注意所有數字爲16進制形式。用串口與pn532鏈接,串口助手發送選擇hex
硬件連接: 電腦串口RX->PN532 TX
       電腦串口TX->PN532 RX  
       波特率 默認 115200  數據位8 校驗位 無  停止位1 流控無
硬件連接正常後開始操作。
1. 喚醒PN532,
 PC->PN532: 55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff 03 fd d4 14 01 17 00
 PN532->PC00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00
其實第一條不符合普通的發送格式,比較特殊。如果沒有正常返回,檢查硬件連接和波特率。
2.獲取卡UID,也就是卡的唯一ID號,全球就這一個(理論上)偷笑

 PC->PN532: 00 00 FF 04 FC D4 4A 02 00 E0 00

析: 04 //代表有四個數據分別是 D4 4A 02 00
   FC //這是04的補碼 
   4a //命令
   02 //卡數量,0--2
   00 //波特率 106K
   E0 //校驗位  D4+4A+02+00=0x0120  取後兩位20的補碼爲E0。至於補碼怎麼計算自己百度吧。

 PN532->PC:  00 00 FF 00 FF 00 

          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->PC00 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,正在研究,接來下來更新。


小弟不才,有什麼疏漏之處還望各位大拿指點一二。
GPIO_ADC
2016.01.18 
      






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章