?PN532
PN532是一款功能豐富的非接觸式通訊收發模塊,其基于8051單片機核心,集成了多種通信接口和工作模式,以滿足不同應用場景的需求。以下是PN532功能相關的詳細介紹:
- 多種通信接口:PN532支持I2C、SPI和UART(包括高速UART,即HSU)等多種通信接口,這使得它能夠方便地與各種主控設備進行連接和通信。這些接口使得PN532能夠靈活地嵌入到各種設備和系統中,實現非接觸式通信。
- 多種工作模式:PN532支持多種工作模式,包括讀寫模式、卡模擬模式和點對點模式等。
- 讀寫模式:PN532可以作為讀寫器,支持ISO/IEC 14443 Type A和Type B標準,以及Mifare Classic、Mifare Ultralight和NTAG等多種標簽。這使得PN532能夠讀取和寫入各種非接觸式智能卡,如門禁卡、公交卡等。
- 卡模擬模式:在卡模擬模式下,PN532可以模擬非接觸式智能卡的行為,與讀寫器進行通信。這使得PN532能夠作為智能卡使用,例如在手機中模擬門禁卡或公交卡。
- 點對點模式:PN532還支持點對點模式,即兩個PN532設備之間可以直接進行通信,無需通過讀寫器或智能卡。這使得PN532能夠用于實現設備間的無線通信和數據傳輸。
- 高度兼容性:PN532不僅支持上述的ISO/IEC 14443標準,還支持其他非接觸式通信協議,如FeliCa等。這使得PN532能夠兼容多種非接觸式智能卡和讀寫器,提高了其適用范圍和兼容性。
- 靈活的配置和選擇:PN532具有多種配置和選擇方式,例如可以通過引腳選擇不同的工作模式或通信接口。此外,PN532還支持不同的幀格式和波特率設置,以適應不同的通信需求。
- 強大的安全性:PN532支持數據加密和認證功能,確保通信過程的安全性和可靠性。這使得PN532能夠用于需要高安全性的應用場景,如移動支付、門禁系統等。
綜上所述,PN532是一款功能強大、高度集成的非接觸式通訊收發模塊,具有多種通信接口、工作模式、高度兼容性和靈活的配置方式。這些功能使得PN532能夠廣泛應用于各種需要非接觸式通信的場合,如物聯網、移動支付、智能門禁等。
以上介紹來自文心一言。
今天我們就來玩玩這個NFC模塊,其實買來好久了,一直懶得動,最近有點懈怠了就硬著頭皮拿來玩玩,就是下面這個東西。
說實話,身為英語不好的人我真的很難過,因為文檔全是英文的,機翻又翻的一言難盡,并且網上大部分教程都是教怎么破解NFC卡的(我只是想讀個卡而已。。。),因此前前后后死磕了兩三天才勉強理清流程。
我們先來觀察一下這個模塊,首先是PN532支持I2C,SPI,UART這三種通信方式,在這個模塊上也給我們把引腳給留出來了。
串口的引腳在背面是和I2C的引腳共用的,也就是說同一時間我們只能使用一種通信方式。
那么我們如何選擇通信方式呢?
回到第二張圖的左下角那個藍色框,我們可以通過撥動那倆小開關來控制使用什么通信方式。
上表中的HSU就是我們的UART,我們這篇文章使用的也是串口來對PN532進行操作。默認的波特率是115200,跟我們之前使用的其他默認是9600的模塊不一樣了,不過其他都是一樣的,是無校驗位,一位停止位。
我們之前也用過不少用串口進行通信的模塊,過程就是你發一句我發一句,因此我們就需要了解我們能夠發送什么。
PN532信息框架
下面的圖都是來自官方文檔的,因為官方文檔都是英文的我看不懂,所以我用的搜狗翻譯(不是廣告)機翻了一下(每個月免費翻譯50頁,整個文檔200頁,錢包受傷了),錯誤還是不少的,大家可以結合著原文看看,圖片左邊的是原文,右邊的是機翻的結果。?
正常信息框架
上面是正常的信息框架,也就是說我們和PN532通信的時候用的就是這個框架(雙方都用)。
首先是序文,是0x00,這個是固定的,后面接兩個字節的起始碼 0x00 和 0xFF,包括最后面的一個字節的同步信號(結束位)0x00。也就是說我們固定的格式是 0x00 0x00 0xFF ……? 0x00。
然后這個框架的第四個字節是長度位,但是注意不是整個信息的長度,而是從TF1到PDn的長度,簡單來說就是長度位的下下位開始到結束位的上上位結束的長度。
第五個字節是長度校驗位,就是長度位+長度校驗位的合需要為0x00(是進位導致的變成0x00而不是加上負數,可以理解成長度位+長度校驗位=0x100,但是一個字節是8位,因此把左邊多余的部分舍棄就變成了0x00)
第六個字節是數據流動位,如果是D4則表示是我們發給PN532的,如果是D5則表示是PN532發給我們的。
接下來連著的幾位是命令+數據,也就是PD0~PDn。
PDn的后一位是數據校驗位,就是從數據流動位開始到這個數據校驗位相加,結果需要為0x00。
最后一位就是固定的結束位0x00了。
拓展信息框架
我們可以知道,上面正常信息框架的長度位是一個字節,也就是說它最長也就傳輸255個字節的數據(掐頭去尾,去掉前后固定的部分),因此有了拓展信息框架,支持傳輸更多的數據。
跟正常信息框架相比就是在中間多了倆固定的0xFF,以及就是長度位變成了兩位。其他位的含義是一樣的。
不過一般情況下我們也用不到,因為255個字節就能夠勝任大多數的情況了。
確認幀&不確認幀
兩個幀都是固定的。分別是 0x00 0x00 0xFF 0x00 0xFF 0x00和 0x00 0x00 0xFF?0xFF 0x00 0x00。
確認幀(ACK)有兩個用途,一個是確認收到了上一幀數據,一般是PN532用來表示收到了來自我們的命令,另一個用途是終止機制(???機翻的有些難以理解,應該是結束當前正在進行的命令),一般是我們給PN532發送的。
另一個不確認幀也就是NACK??,一般是我們給PN532發送的,發送之后表示我們沒收到上一幀數據,也可以是我們在校驗數據的時候發現數據有誤,總之我們發送完這個NACK之后,PN532就會再給我們發送一次上次發送的數據。
錯誤信息框架
錯誤信息框架是PN532用來通知我們發生應用級錯誤的。
完整的錯誤代碼列表到官方文檔里查。
命令
我們接下來挑幾個命令介紹,從這幾個命令里再挑幾個演示一下。
選擇數據流路徑(初始化)
可以看作是初始化或者是喚醒PN532。因為我們使用PN532的話,首先就是需要發送這個命令。
我們需要發送的是0x14 + 方式。在上圖中方式有三種選擇,我們正常使用就選第一種0x01,不需要再配置其他參數了。
也就是說我們要發送的是 0x14 0x01
但是不要忘了,我們需要套上上面介紹過的信息框架,我們使用用正常信息框架,那么發送的數據就是下面這一串。
00 00 FF 03 FD D4 14 01 17 00
也有說法是喚醒用的不僅是正常的信息框架,還需要再加上一段特殊的數據,就是下面這串。
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,大家各自都試一下,選合適的用就行。?
我們來分析分析(后面就不分析了),首先開頭的 00 00 FF是固定的,可以忽略(發送的時候不要忽略!)。
接下來的 03 是長度位,我們發送命令+參數是兩個字節,再加上數據流動位一個字節一共是三個,因此長度位是03。
長度位后接的是長度校驗位,需要長度位+長度校驗位的和為0。計算的話可以這樣算:0x100 - 0x03 = 0xFD
長度校驗位后接的是數據流動位,因為是我們發送給PN532的,因此固定是D4,如果是PN532發給我們的那么這一位就是D5。
接下來兩位就是我們的命令+參數 0x14 0x01。
后面是數據校驗位,我們需要從數據流動位一直加到這個數據校驗位,要相加的和為0x00(高位舍棄)。
最后一個結束位固定是0x00。這樣我們就分析完畢這個命令了,包括我們應該如何使用正常信息框架去發送我們要發送的命令,發送其他命令的時候步驟也是一樣的,介紹后續命令的時候就不再這么詳細地分析了。
接下來我們直接拿串口助手來操作PN532,用單片機的話就配置個串口即可(波特率115200,無校驗位,一位停止位),然后把常用的命令存放進數組里,根據自己項目的邏輯去按照不同的時機去發送不同的用正常信息框架封裝好的命令即可。
發送之后我們就收到了上面接收區里的一段數據。
這段數據我們要拆分開來看,我已經用紅框和藍框區分開來了,紅框就是標準的確認幀,我們忽略即可,不過如果是用單片機來操作PN532的話就需要做好把處理確認幀的相關邏輯了。
接下來藍框里的數據我們掐頭去尾,只留下命令和參數: 0xD5 和 0x15。
再回到上面文檔截的圖片,正常回復就是 0xD5 和 0x15 ,因此我們目前為止沒出錯誤。
不過要注意的就是PN532通信的數據中,一共有兩個校驗位,在實際的項目中我們一定要對收到的數據進行校驗,如果校驗之后發現數據有誤,那么我們發送NACK幀讓PN532再發一次,直到數據接收正確。
設置波特率
命令是0x10,再加上參數指定要設置的波特率,默認是115200,沒啥事咱也別改了用的好好的。
設定PN532內部參數
除了0x12的命令之外,只需要一個Byte作為參數,通過設置這個Byte的每個位來設定PN532的內部參數。
被動檢測目標(讀卡)
命令是4A,參數有三個,但是最后一個是可選的,我們可以不用。
第一個參數表示我們需要檢測多少個目標(卡),最多是兩個,我們一般就檢測1個就行了。
第二個參數是初始化期間使用的波特率和調制類型。用五種可選的參數可以參考上面的截圖,我們用0x00就行。
00 00 FF 04 FC D4 4A 01 00 E1 00
我們發送這個命令之后,PN532會回復一個ACK,就是我紅框框出來的,我們忽略。
然后再把NFC的卡貼在PN532上就會再發送來一大段數據。我們直接看后面來的這一大段。
我把收到的數據掐頭去尾拿出來分析分析。
D5 4B 01 01 00 04 08 04 33 88 9C 34
首先是我們發送命令之后會得到的數據是0xD5 和0x4B以及后面一堆數據。
我們收到的數據符合這個輸出,我們接著往后看,下一位表示的是初始化目標的數量,因為我們發送命令的時候最多只讓初始化1個,因此這個位的值也只能是0x01。
因為我們發送命令的時候指定類型的參數是0x00,對應的是106kbps的A類型,因此我們只需要看上圖中框出的格式(其他格式的我也沒截進來就是了)。
說實話這翻譯的我看不懂,而且就算是原文中的英語也是縮寫我還是看不懂,因此這個格式的前半段我們跳過,我們直接看第五個字節,這個能看得懂,就是說NFC的ID號的長度,后面接的就是NFC的ID號,我們需要用的信息也就是這個ID號了,因此我們前面的也不用看懂,只需要知道返回的第二個參數的第五個字節是NFC的ID號長度,剩下的那么多個的字節是NFC的ID號。
當我們發送了這個命令之后,PN532回復ACK,然后一直再檢測是否有NFC卡貼上來,貼上來之后才會再發上面那么一大段數據給我們。如果我們發送完命令之后反悔了不想要檢測了,我們可以發送一個確認幀,這時候PN532就不會再檢測了。
資料免費下載
中文設計的資料,包括官方文檔和機翻版的,以及文中沒出現的讀卡解卡上位機軟件我都打包好放公眾號里了,小伙伴們可以關注同名公眾號“折途想要敲代碼”回復關鍵詞“PN532”免費下載。