RFID開發與應用(中)
我寫的RFID系列總共分為三篇,上一次講了ISO1443-A協議,這個協議主要的功能是讀卡器與卡片之間資料傳輸的約定,這一次就來聊聊讀卡器,看MCU要怎么控制讀卡器,
在上篇博文中已經談到,讀卡器(RC522)是沒有自主功能的,沒法對資料進行處理,所以需要MCU來控制,那MCU來控制讀卡器就需要有通信介面,因為有了通信介面才能夠實作資料互動,以下就是RC522與外部的通信介面:
- SPI介面;
- 串行UART;
- I2C介面,
本文只講解SPI介面,
SPI介面
SPI是很常見的一種通信方式,在網路上關于SPI的資料也是一抓一大把,但是在RC522中SPI和普通的SPI略有不同,不同的地方主要在地址方面體現,
先簡單介紹一下普通SPI的地址使用,我們的主機如果想讀取從機的資料,就需要先向從機發送一個地址(寫資料也要先發送地址),這個地址為從機中暫存器的地址,簡單來說,就是主機告訴從機,我現在要讀取你某個暫存器中的資料,從機在接收到這個地址后,就會到對應的地址去,取出資料并通過SPI發送到主機,具體順序如下表:

在了解普通的SPI介面后,就來看看RC522下的SPI介面,它的SPI地址會有些特殊,它的最高位表示讀或者寫,第6位到第1位表示地址,而最低位還不允許使用,具體如下表:

看了上面兩個表格,應該對這個地址有了一點印象了,但是只有文字似乎有點蒼白,所以下面展示一下是讀資料的代碼,

在上述函式中,先傳入一個地址給函式,然后選擇從機,將從機的NSS線拉低,再將地址進行一個變換,即先將地址左移一位,把地址放到第6位至第1位,然后進行一個與運算,將最低位變成0,最后就是進行或運算,將最高位變成1,表示這是讀資料,經過這些變換過后,就成功將地址轉換為RC522所規定的地址,后面的操作就和普通的SPI操作相同,(此處特別說明,RC522中的地址不會出現最高位為1的情況,所以在進行移位時,也不會丟失地址,)
RC522命令集
先簡單回顧一下整個通信程序,首先我們有一個MCU,然后還有一個RC522,RC522后面還有一個卡片,那么整個通信程序是基于FIFO存盤器的,那FIFO里面放的就是一些命令或者是資料,
接下來介紹一下,RC522的命令集,RC522的命令集總共有兩種,第一種命令是用來控制RC522本身的,第二種命令則是用來控制卡的,在這里我們只需要重點關注第二種命令即可,
第一種命令舉例:
- DLE:RC522處于空閑模式;這條命令也用來終止實際正在執行的命令,
- CALCCRC:FIFO的內容被傳輸到CRC協處理器并執行CRC計算,這個命令必須通過向命令暫存器寫入任何一個命令來軟體清除,
第二種命令舉例:
- TRANSCEIVE: 重復發送FIFP的資料,并不斷接識訓傳的資料;這條命令的意義就是讓讀卡器將MCU的資料發送給卡片,然后卡片有回應之后,讀卡器再接收,(0X0C)
- MFAUTENT: 用來處理Mifare認證以使能到任何Mifare普通卡的安全通信;這條命令的意義就是,MCU里有一些資料,然后要讓RC522將這些資料進行一個認證,然后再將資料傳給卡片,這里面的認證就是比對卡片中的密碼,(0X60 或者 0X61)
大概了解了這些命令都有什么作用之后,就來看下具體是怎么使用,或者說怎么實作的,下圖就是我們常說的整個RFID流程,

從上圖可以看出,資料的傳輸有兩個程序,程序一為MCU傳輸到讀卡器,程序二是讀卡器傳輸到卡片,其中,程序一所傳輸的內容,就是我們上面介紹的命令和資料,而程序二傳輸的內容,就必須符合我們之前介紹的ISO14443-A協議,
下面以喚醒卡片為例,首先我們先回顧一下ISO14443-A協議中,喚醒的命令,在14443協議中喚醒卡片的命令為0X26,但這個命令是傳輸到從讀卡器傳輸到卡片的,我們要怎么讓讀卡器知道,要把0X26發送到卡片?
要解決這個問題,就必須要用到我們剛剛介紹的TRANSCEIVE命令,那整個通信程序就會變成,MCU向讀卡器發送TRANSCEIVE命令(0X0C) + 0X26,讀卡器在決議到TRANSCEIVE命令之后,就會把后面的資料都發給卡片,這里的資料就是指0X26,卡片在接收到0X26之后就被喚醒了,當然卡片在被喚醒之后,也會回傳一個標志位給讀卡器,讀卡器接收到之后再回傳給MCU,告訴MCU卡片已經被喚醒,在完成喚醒(0X26或者0X52)之后,卡片會回傳一個2位元組的卡片型別,
完成喚醒操作之后,還有一個防沖突和選卡操作,接下來就分別介紹一下這兩個命令要怎么書寫,
防沖突:我們之前就講過了,防沖突整個程序是由硬體來完成的,但是我們還是需要將開始進行防沖突的命令發送到卡片去,所以MCU只要向讀卡器發送TRANSCEIVE命令(0X0C) + 0X93 + 0X20即可,執行防沖突后,會回傳4個位元組的卡片ID,還有1個位元組的異或校驗,
選卡:在之前就已經介紹過,選卡的命令是0X93 + 0X70,那是不是還像前面兩個例子一樣,直接發送TRANSCEIVE命令(0X0C) + 0X93 + 0X70就可以?
事實上并不這么簡單,我們知道選卡就是選定一張卡片,我們很顯然我們不只是要發送選卡的命令,還要把我們要選擇的卡片ID也發送過去,到了這一步選卡命令還沒有結束,現在我們先來分析一下這整個命令,TRANSCEIVE命令(0X0C) + 0X93 + 0X70 + ID1 + ID2 + ID3 + ID4,不知道大家還記不記得前面講過選卡命令是當NVB=0X70時,后面再追加一個CRC校驗,才變成選卡命令,那么我們前面也講過NVB的高4位記錄的是資料總的位元組數,低4位代表沒有傳輸完位元組的位數,那么上面命令中屬于ISO14443協議的位元組只有0X93 + 0X70 + ID1 + ID2 + ID3 + ID4 這6個位元組,因為TRANSCEIVE命令(0X0C)并不是發送給卡片的命令,所以不能夠算進位元組數中,也就是說我們那條命令中還少了一個位元組,這個位元組實際上就是我們進行防沖突回傳回來的校驗,加上這個那就滿足了7個位元組,最后一步就是把這7個位元組進行一次CRC計算,再把回傳的結果追加到后面,選卡命令就選完成了,如果選卡成功了就會回傳0X08,這個回傳結果和后面所講的S50卡片有關聯,
說完了喚醒、防沖突和選卡,TRANSCEIVE命令就算是講完了,后面還有一個MFAUTENT命令,需要結合S50卡來理解,所以就留到下篇博文來講吧,(又不知道要拖到什么時候才會更行 =_= )
RFID開發與應用(上)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/187539.html
標籤:其他
下一篇:四大CPU架構的區別
