RFID開發(fā)技術(shù)及實踐第5章高頻RFID閱讀器設(shè)計_第1頁
RFID開發(fā)技術(shù)及實踐第5章高頻RFID閱讀器設(shè)計_第2頁
RFID開發(fā)技術(shù)及實踐第5章高頻RFID閱讀器設(shè)計_第3頁
RFID開發(fā)技術(shù)及實踐第5章高頻RFID閱讀器設(shè)計_第4頁
RFID開發(fā)技術(shù)及實踐第5章高頻RFID閱讀器設(shè)計_第5頁
已閱讀5頁,還剩138頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第5章高頻RFID閱讀器設(shè)計

5.1Mifare卡5.2MFRC5225.3RC522基本操作5.4高頻RFID閱讀器程序設(shè)計

5.1Mifare卡

Mifare是NXPSemiconductors(恩智浦半導(dǎo)體)擁有的商標之一。Mifare卡是目前世界上使用量大、技術(shù)成熟、性能穩(wěn)定、內(nèi)存容量大的一種感應(yīng)式智能IC卡。

5.1.1Mifare卡的特點

Mifare技術(shù)是NXP(前身為飛利浦半導(dǎo)體)所擁有的13.56MHz非接觸性辨識技術(shù)。NXP并不制造卡片或卡片閱讀機,而是在開放的市場上販售相關(guān)技術(shù)與芯片,卡片和卡片閱讀器的制造商再利用它們的技術(shù)來研發(fā)產(chǎn)品出售給一般使用者。

Mifare卡經(jīng)常被認為是一種智能卡的技術(shù),這是因為它可以在卡片上兼具讀寫的功能。事實上,Mifare卡僅具備記憶功能,必須搭配閱讀器才能達到讀寫功能。Mifare卡的非接觸式讀寫功能是為處理大眾運輸系統(tǒng)中的付費交易部分來設(shè)計的,其與眾不同的地方是具備執(zhí)行升冪和降序的排序功能,簡化資料讀取的過程。盡管接觸性智能卡也能夠執(zhí)行同樣的動作,但非接觸性智能卡的速度更快且操作更簡單,而且卡片閱讀機幾乎不需要任何維修,卡片也較為耐用。

Mifare卡除了保留接觸式IC卡的原有優(yōu)點外,還具有以下特點:

操作簡單、快捷。由于采用射頻無線通信,使用時無需插拔卡及不受方向和正反面的限制,完成一次讀寫操作僅需0.1s,大大提高了每次使用的速度,既適用于一般場合,又適用于快速、高流量的場所。

抗干擾能力強。Mifare卡中有快速防沖突機制,在多卡同時進入讀寫范圍內(nèi)時,能有效防止卡片之間出現(xiàn)數(shù)據(jù)干擾,讀寫設(shè)備可一一對卡進行處理,提高了應(yīng)用的并行性及系統(tǒng)工作的速度??煽啃愿?。Mifare卡與閱讀器之間沒有機械接觸,避免了由于接觸讀寫而產(chǎn)生的各種故障;而且卡中的芯片和感應(yīng)天線完全密封在標準的PVC中,進一步提高了應(yīng)用的可靠性和卡的使用壽命。

適合于一卡多用。Mifare卡的存儲結(jié)構(gòu)及特點(大容量16分區(qū)、1024字節(jié)),能應(yīng)用于不同的場合或系統(tǒng),有很強的系統(tǒng)應(yīng)用擴展性,可以真正做到“一卡多用”。5.1.2Mifare1S50卡

Mifare卡的主要芯片有NXPMifare1S50(1KB)、S70(4KB)等。Mifare1(下面簡稱MF1)是符合ISO/IEC14443A的非接觸智能卡,其通信層(MifareRF接口)符合ISO/IEC14443A標準的第2和第3部分,其安全層支持域檢驗的CRYPTO1數(shù)據(jù)流加密。

目前國內(nèi)出現(xiàn)了Mifare卡的克隆產(chǎn)品,但性能稍遜一籌。雖然Mifare技術(shù)已經(jīng)被破解,卡片可以被復(fù)制,但是由于價格低廉,還在廣泛使用。Mifare卡的技術(shù)特點如下:

卡片由一個卷繞天線和特定用途的集成電路模塊組成。

Mifare卡有一個高速(106KB波特率)的RF接口。

內(nèi)部有一個控制單元和一個8K個bit位的EEPROM。

閱讀器向MF1卡發(fā)出一組固定頻率(13.56?MHz)的電磁波,卡片內(nèi)有一個LC串聯(lián)諧振電路,其頻率與閱讀器發(fā)射的頻率相同,在電磁波的激勵下,LC諧振電路產(chǎn)生共振,從而使諧振電容有了電荷。

在這個電容的另一端,接有一個單向?qū)ǖ碾娮颖?,將電容?nèi)的電荷送到模塊存儲電容內(nèi)儲存,當所積累的電荷達到2?V以上時,此電容可作為電源向模塊電路提供工作電壓,將卡內(nèi)數(shù)據(jù)發(fā)射出去或接收閱讀器的數(shù)據(jù)。

MF1讀寫示意圖如圖5-1所示。圖5-1MF1讀寫示意圖目前,市場上較常見的MF1S50卡的主要性能指標如下:

MifareRF接口(ISO/IEC14443A)。

非接觸數(shù)據(jù)傳輸并提供能源(不需電池)。

工作距離:可達100mm(取決于天線的尺寸結(jié)構(gòu))。

工作頻率:13.56MHz。

快速數(shù)據(jù)傳輸:106kb/s。

高度數(shù)據(jù)完整性保護:16bitCRC、奇偶校驗、位編碼和位計數(shù)。

真正的防沖突。

典型票務(wù)交易:小于100ms(包括備份管理)。

1KBEEPROM,分為16個區(qū),每區(qū)4個塊,每塊16字節(jié)。

用戶可定義內(nèi)存塊的讀寫條件。

數(shù)據(jù)耐久性為10年。

寫入耐久性可達100000次。

相互三輪認證(ISO/IECDIS9798-2)。

帶重現(xiàn)攻擊保護的射頻通道數(shù)據(jù)加密。

每區(qū)(每個應(yīng)用)兩個密鑰,支持密鑰分級的多應(yīng)用場合。

每卡一個唯一序列號。

在運輸過程中以傳輸密鑰保護對EEPROM的訪問權(quán)。

MF1S50集成電路芯片內(nèi)含1KBEEPROM、RF接口和數(shù)字控制單元。能量和數(shù)據(jù)通過天線傳輸,卡中天線為幾匝線圈,直接連接到芯片上,不再需要額外的組件。Mifare卡的結(jié)構(gòu)如圖5-2所示。

圖5-2中,各組件的功能簡述如下:

RF接口:調(diào)制解調(diào)器檢波器時鐘發(fā)生器的上電復(fù)位穩(wěn)壓器。

防沖突:讀寫范圍內(nèi)的幾張卡可以逐一選定和操作。

認證:在所有存儲器操作之前進行認證過程,以保證必須通過各塊指定的密鑰才能訪問該塊。圖5-2Mifare卡的結(jié)構(gòu)控制邏輯單元:數(shù)值以特定的冗余格式存儲,可以增減。

EEPROM接口:是與內(nèi)部EEPROM的通信接口。

加密單元:域驗證的CRYPTO1數(shù)據(jù)流加密,保證數(shù)據(jù)交換的安全。

EEPROM:總?cè)萘繛?KB,每區(qū)的最后一塊稱做“尾塊”,含有兩個密鑰和本區(qū)各塊的讀寫條件。5.1.3Mifare1卡存儲器組織

在MF1S50卡中,1024?×?8bitEEPROM存儲器分為16個扇區(qū),每區(qū)4塊,每塊16字節(jié)。在擦除后的狀態(tài)下,EEPROM的單元讀為邏輯“0”,寫后的狀態(tài)下讀為“1”。EEPROM結(jié)構(gòu)如圖5-3所示。

1.制造商占用塊

制造商占用塊是第1扇區(qū)的第1塊(塊0),它含有集成電路制造商數(shù)據(jù)。出于安全和系統(tǒng)需求,此塊是制造商在生產(chǎn)過程中編程后寫保護的。制造商占用塊的結(jié)構(gòu)如圖5-4所示。圖5-3EEPROM結(jié)構(gòu)圖5-4制造商占用塊的結(jié)構(gòu)

2.數(shù)據(jù)塊

各扇區(qū)均有3個16字節(jié)的塊用于存儲數(shù)據(jù)(區(qū)0只有兩個數(shù)據(jù)塊以及一個只讀的廠商代碼塊)。數(shù)據(jù)塊可以通過讀寫控制位設(shè)置為:

讀寫塊:例如用于非接觸門禁管理。

數(shù)值塊:可直接控制存儲值的命令,如增值、減值。

其中,數(shù)值塊具有電子錢包功能(有效命令包括read、write、increment、decrement、restore、transfer)。數(shù)值塊有固定的數(shù)據(jù)格式,以便于錯誤檢測、糾錯和備份管理。數(shù)值塊中存儲的數(shù)值和地址只能通過數(shù)值塊格式的寫操作生成。數(shù)值和地址說明如下:數(shù)值:有符號4字節(jié)數(shù)值。數(shù)值的最低字節(jié)存儲在最低地址字節(jié)。負值以標準的2的補碼形式存儲。出于數(shù)據(jù)完整性和安全原因,數(shù)值存儲三次,兩次不取反,一次取反。

地址(Adr):1字節(jié)地址,當進行備份管理時,可用于保存塊的地址。地址保存四次,兩次取反,兩次不取反。在increment、decrement、restore和transfer操作中,地址保持不變。它只能通過write命令更改。

數(shù)值塊的結(jié)構(gòu)如圖5-5所示。圖5-5數(shù)值塊的結(jié)構(gòu)

3.尾塊(塊3)

各扇區(qū)均有一個尾塊,存有:

密鑰A和B(可選),讀時返回邏輯“0”。

該區(qū)四個塊的讀寫條件,存儲在字節(jié)6~9。

讀寫控制位也指定了數(shù)據(jù)塊的類型(讀寫塊或數(shù)值塊)。

如果不需要密鑰B,塊3的最后6字節(jié)可以用作數(shù)據(jù)字節(jié)。

尾塊的字節(jié)9可用于用戶數(shù)據(jù)。因為此字節(jié)享有與字節(jié)6、7、8相同的讀寫權(quán)限。尾塊的結(jié)構(gòu)如圖5-6所示。圖5-6尾塊的結(jié)構(gòu)

1)讀寫條件

每個數(shù)據(jù)塊和尾塊的讀寫條件均由3個bit定義,并以非取反和取反形式保存在各個區(qū)的尾塊中。讀寫控制位管理著使用密鑰A和B讀寫存儲器的權(quán)限。如果知道相關(guān)的密鑰,并且當前讀寫條件允許,讀寫條件是可以更改的,讀寫條件說明如圖5-7所示。圖5-7讀寫條件說明

2)尾塊的讀寫條件

對密鑰和控制位的讀寫取決于尾塊(塊3)的訪問控制位,這些控制位存放在字節(jié)6~8中,以正值和反值的形式存放,?分為“禁止”、“KEYA”、“KEYB”和“KEYA|B(KEYA或KEYB)”。讀寫條件在尾塊中的存儲位置如表5-1所示。

讀寫條件定義如表5-2所示。

由上表可知,尾塊和KEYA被預(yù)定義為傳輸配置狀態(tài)。因為在傳輸配置狀態(tài)下KEYB可讀,新卡必須用KEYA認證。由于訪問控制位本身也可以禁止訪問,所以操作時應(yīng)當特別小心。表5-1讀寫條件在尾塊中的存儲位置表5-2讀寫條件定義

3)數(shù)據(jù)塊的訪問控制條件

對數(shù)據(jù)塊(塊0至2)的讀寫訪問取決于其訪問控制位,分為“禁止”、“KEYA”、“KEYB”和“KEYA|B”。相關(guān)訪問控制位的設(shè)置決定了其用途以及相應(yīng)的可用命令。

讀寫塊:允許讀、寫操作。

數(shù)值塊:運行另外的數(shù)值操作,如加值、減值、轉(zhuǎn)存和恢復(fù)。在用于非充值卡的一種情況(“001”)下,只能夠讀和減值。在另一種情況(“110”)下,可以用KEYB充值。

制造廠商塊:只讀,不受訪位控制位設(shè)置的影響。

密鑰管理:在傳輸配置狀態(tài)下,必須用KEYA認證。

數(shù)據(jù)塊的訪問控制條件如表5-3所示。表5-3數(shù)據(jù)塊的訪問控制條件如果相應(yīng)扇區(qū)尾塊KEYB可讀,則不得用作認證(上表中所有灰色行)。如果閱讀器試圖用灰色行的訪問控制條件以KEYB認證任何扇區(qū)的任何塊,卡將在認證后拒絕所有后續(xù)存儲器訪問。5.1.4Mifare卡讀寫

讀寫Mifare卡的命令由閱讀器發(fā)出,按照讀寫流程通過防碰撞和認證才能真正對卡片進行操作,其操作如圖5-8所示。

1.呼叫(requeststandard/all)

卡片一旦進入閱讀器范圍內(nèi),就會收到載波并進行充電。卡片上電復(fù)位后,如果收到閱讀器發(fā)來的request命令,則通過發(fā)送應(yīng)答碼ATQA(符合ISO/IEC14443A)回應(yīng)閱讀器向天線范圍內(nèi)所有卡發(fā)出的request命令。圖5-8Mifare卡讀寫

2.防碰撞循環(huán)(anticollisionloop)

在防碰撞循環(huán)中,可以讀回一張卡的序列號。如果在閱讀器的工作范圍內(nèi)有幾張卡,則它們可以通過唯一序列號區(qū)分開來,并可選定以進行下一步交易。未被選定的卡轉(zhuǎn)入待命狀態(tài),等候新的request命令。

3.選卡(selectcard)

閱讀器通過selectcard命令選定一張卡進行認證存儲器的相關(guān)操作。該卡返回選定應(yīng)答碼(ATS=08h),明確所選卡的卡型。

4.三輪認證(3passauthentication)

選卡后,閱讀器指定后續(xù)讀寫的存儲器位置,并用相應(yīng)密鑰進行三輪認證。認證成功后,所有的存儲器操作都是加密的。

5.存儲器操作

經(jīng)過三輪認證后,閱讀器可對卡片執(zhí)行下列操作:

讀數(shù)據(jù)塊。

寫數(shù)據(jù)塊。

減值:減少數(shù)據(jù)塊內(nèi)的數(shù)值,并將結(jié)果保存在臨時內(nèi)部數(shù)據(jù)寄存器中。

加值:增加數(shù)據(jù)塊內(nèi)的數(shù)值,并將結(jié)果保存在數(shù)據(jù)寄存器中。

恢復(fù):將數(shù)據(jù)塊內(nèi)容移入數(shù)據(jù)寄存器。

轉(zhuǎn)存:將臨時內(nèi)部數(shù)據(jù)寄存器的內(nèi)容寫入數(shù)值塊。

6.數(shù)據(jù)完整性

在閱讀器和卡之間的非接觸通信鏈接中實施下列機制,以保證數(shù)據(jù)傳輸?shù)目煽啃裕?/p>

每塊16bitCRC。

每字節(jié)的奇偶位。

位計數(shù)檢查。

位編碼,以區(qū)分“1”、“0”和無信息。

通道監(jiān)控(協(xié)議序列和位流分析)。

7.安全

安全認證中的三輪認證采用符合ISO9798-2的協(xié)議,以保證高度的安全性。三輪認證過程如下:

閱讀器指定要訪問的區(qū),并選擇密鑰A或B。

第一輪為卡從位塊讀區(qū)密鑰和訪問條件。然后,卡向閱讀器發(fā)送隨機數(shù)。

第二輪為閱讀器利用密鑰和隨機數(shù)計算回應(yīng)值?;貞?yīng)值連同閱讀器的隨機數(shù)發(fā)送給卡。

第三輪為卡通過與自己的隨機數(shù)比較驗證閱讀器的回應(yīng)值,再計算回應(yīng)值并發(fā)送。

閱讀器通過比較驗證卡的回應(yīng)值。

在第一個隨機數(shù)傳送之后,卡與閱讀器之間的通信都是加密的。

5.2MFRC522

MFRC522(簡稱RC522)是應(yīng)用于13.56MHz非接觸式通信中高集成度讀寫卡系列芯片中的一員。它是NXP公司針對“三表”應(yīng)用推出的一款低電壓、低成本、體積小的非接觸式讀寫卡芯片,是智能儀表和便攜式手持設(shè)備研發(fā)的較好選擇。5.2.1概述

MFRC522運用了先進的調(diào)制和解調(diào)概念,完全集成了13.56MHz下所有類型的被動非接觸式通信方式和協(xié)議,并支持ISO14443A的多層應(yīng)用。其內(nèi)部發(fā)送器部分可驅(qū)動閱讀器天線與ISO14443A/Mifare卡和應(yīng)答機的通信,無需其他電路。接收器部分提供一個堅固而有效的解調(diào)和解碼電路,用于處理ISO14443A兼容的應(yīng)答器信號。數(shù)字部分處理ISO14443A幀和錯誤檢測。此外,RC522還支持快速CRYPTO1加密算法,用于驗證Mifare系列產(chǎn)品。MFRC522支持Mifare更高速的非接觸式通信,雙向數(shù)據(jù)傳輸速率高達424?kb/s??筛鶕?jù)不同的用戶需求,選取SPI、I2C或串行UART(類似RS232)模式之一,有利于減少連線,縮小PCB板體積,降低成本。

MFRC522的其他特性如下:

高集成度的調(diào)制解調(diào)電路。

采用少量外部器件,即可將輸出驅(qū)動級接至天線。

支持ISO/IEC14443TYPEA和Mifare通信協(xié)議。

支持ISO14443212kb/s和424kb/s更高傳輸速率的通信。支持MifareClassic加密。

10Mb/s的SPI接口。

I2C接口,快速模式的速率為400kb/s,高速模式的速率為3400kb/s。

串行UART,傳輸速率高達1228.8kb/s,幀取決于RS232接口,電壓電平取決于提供的管腳電壓。

64字節(jié)的發(fā)送和接收FIFO緩沖區(qū)。

靈活的中斷模式。

可編程定時器。

具備硬件掉電、軟件掉電和發(fā)送器掉電三種節(jié)電模式。內(nèi)置溫度傳感器,以便在芯片溫度過高時自動停止RF發(fā)射。

采用相互獨立的多組電源供電,以避免模塊間的相互干擾,提高工作的穩(wěn)定性。

具備CRC和奇偶校驗功能。

內(nèi)部振蕩器,連接27.12MHz的晶體。

2.5~3.6V的低電壓低功耗設(shè)計。

5mm?×?5mm?×?0.85mm的超小體積。5.2.2原理圖

MFRC522組成并不復(fù)雜,其原理圖如圖5-9所示。

MFRC522集成度很高,其相關(guān)功能特性如下:

MFRC522支持可直接相連的各種MCU接口類型,如SPI、I2C和串行UART。

數(shù)據(jù)處理部分執(zhí)行數(shù)據(jù)的并/串轉(zhuǎn)換。

它支持的幀包括CRC和奇偶校驗。它以完全透明的模式進行操作,因而支持ISO14443A的所有層。圖5-9MFRC522的原理圖狀態(tài)和控制部分允許對器件進行配置以適應(yīng)環(huán)境的影響并將性能調(diào)節(jié)到最佳狀態(tài)。

當與MifareStandard和Mifare產(chǎn)品通信時,使用高速CRYPTO1流密碼單元和一個可靠的非易失性密匙存儲器。

模擬電路包含了一個具有非常低阻抗橋驅(qū)動器輸出的發(fā)送部分,這使得最大操作距離可達100mm。

接收器可以檢測到并解碼非常弱的應(yīng)答信號。5.2.3與MCU接口

MFRC522共有32個管腳,其管腳圖如圖5-10所示。

MFRC522的32個管腳有其各自不同的功能和定義,如表5-4所示。圖5-10MFRC522管腳圖表5-4管腳定義

1.?MCU接口

在每次上電或硬件復(fù)位后,RC522也復(fù)位其接口模式并檢測當前微處理器的接口類型。MFRC522在復(fù)位階段后根據(jù)控制腳的邏輯電平識別微處理器接口。這是由固定管腳連接的組合和一個專門的初始化程序來實現(xiàn)的,其所有通信接口如表5-5所示。

本例中,RC522與MCU連接的端口為SPI口,其他接口可參考相關(guān)資料。兼容SPI接口可使能RC522和一個MCU之間的高速串行通信。兼容SPI接口的處理與標準SPI接口相同。在本書配套的開發(fā)板上,RC522還需要經(jīng)過一個跳線才能與MCU相連,其跳線定義如圖5-11所示。表5-5通信接口圖5-11跳線定義在SPI通信中,RC522作從機,SPI時鐘SCK由主機產(chǎn)生。

數(shù)據(jù)通過MOSI線從主機傳輸?shù)綇臋C。

數(shù)據(jù)通過MISO線從RC522發(fā)回主機。

?MOSI和MISO傳輸每個字節(jié)時都是高位在前。MOSI上的數(shù)據(jù)在時鐘的上升沿保持不變,在時鐘的下降沿改變。MISO與之類似,在時鐘的下降沿,MISO上的數(shù)據(jù)由RC522來提供,在時鐘的上升沿數(shù)據(jù)保持不變。

2.讀數(shù)據(jù)

通過SPI接口讀出數(shù)據(jù)需要有特定的數(shù)據(jù)結(jié)構(gòu)。發(fā)送的第一個字節(jié)定義了模式本身和地址,也可連續(xù)讀出多個地址的數(shù)據(jù),其順序如表5-6所示。表5-6讀數(shù)據(jù)順序

3.寫數(shù)據(jù)

通過SPI接口寫入數(shù)據(jù)需要有特定的數(shù)據(jù)結(jié)構(gòu)。發(fā)送的第一個字節(jié)定義了模式本身和地址,也可連續(xù)讀出多個地址的數(shù)據(jù),其順序如表5-7所示。

4.地址字節(jié)

地址字節(jié)按特殊格式傳輸,第一個字節(jié)的MSB位設(shè)置使用的模式如下:

?MSB位為1時從RC522讀出數(shù)據(jù)。

?MSB為0時將數(shù)據(jù)寫入RC522。

第一個字節(jié)的位[6:1]定義地址,最后一位應(yīng)當設(shè)置為0。其位含義如表5-8所示。表5-7寫數(shù)據(jù)順序表5-8地址字節(jié)位含義

5.3RC522基本操作

RC522是一款高度集成的RFID讀寫芯片,還需要配合MCU和其他外圍電路才能真正地實現(xiàn)閱讀器的功能。

5.3.1RC522寄存器

RC522的存儲器中共有4頁(PAGE)存放寄存器,用于配置和相關(guān)狀態(tài)指示,詳細定義如表5-9所示。表5-9RC522寄存器5.3.2FIFO緩沖區(qū)操作

MFRC522包含一個64?×?8位的FIFO緩沖區(qū),用來緩存主機MCU和MFRC522的內(nèi)部狀態(tài)機之間的輸入和輸出數(shù)據(jù)流。因此,F(xiàn)IFO緩沖區(qū)可以處理長度大于64字節(jié)的數(shù)據(jù)流,但又不考慮時序的限制。

1.訪問FIFO緩沖區(qū)

FIFO緩沖區(qū)的輸入和輸出數(shù)據(jù)總線連接到FIFODataReg寄存器。

通過寫FIFODataReg寄存器將一個字節(jié)的數(shù)據(jù)存入FIFO緩沖區(qū),之后內(nèi)部FIFO緩沖區(qū)寫指針加1。

讀出的FIFODataReg寄存器的內(nèi)容是存放在FIFO緩沖區(qū)讀指針處的數(shù)據(jù),之后FIFO緩沖區(qū)讀指針減1。

FIFO緩沖區(qū)的讀和寫指針之間的間隔通過讀取FIFOLevelReg得到。當MCU發(fā)布一個命令后,MFRC522可以在命令執(zhí)行過程中根據(jù)命令要求來訪問FIFO緩沖區(qū)。通常,只能實現(xiàn)一個FIFO緩沖區(qū)的操作,該緩沖區(qū)可用在輸入和輸出方向中。因此,MCU必須小心不能以其他方式來訪問FIFO緩沖區(qū)。

2.控制FIFO緩沖區(qū)

除了讀寫FIFO緩沖區(qū)外,F(xiàn)IFO緩沖區(qū)指針還可通過置位寄存器FIFOLevelReg的FlushBuffer位來復(fù)位。從而使FIFOLevel位被清零,寄存器ErrorReg的BufferOvfl位也被清零,實際存儲的字節(jié)不能再訪問,F(xiàn)IFO緩沖區(qū)可以用來存放下一批64字節(jié)的數(shù)據(jù)。

3.?FIFO緩沖區(qū)的狀態(tài)信息

MCU可得到以下FIFO緩沖區(qū)狀態(tài)的數(shù)據(jù):

已經(jīng)存放在FIFO緩沖區(qū)中的字節(jié)數(shù):寄存器FIFOLevelReg的FIFOLevel字段。

FIFO緩沖區(qū)已滿的警告:寄存器Status1Reg的HiAlert位。

?FIFO緩沖區(qū)已空的警告:寄存器Status1Reg的LoAlert位。

指示FIFO緩沖區(qū)已滿時仍有字節(jié)寫入:寄存器ErrorReg的BufferOvfl位。

?BufferOvfl位可通過置位FIFOLevelReg寄存器的FlushBuffer位來清零。

當出現(xiàn)以下情況時,MFRC522可以產(chǎn)生中斷信號:

如果寄存器CommIEnReg的LoAlertIEn被置位,且當寄存器Status1Reg的LoAlert位變成1時,管腳IRQ激活。如果寄存器CommIEnReg的HiAlertIEn被置位,且當寄存器Status1Reg的HiAlert位變成1時,管腳IRQ激活。

如果FIFO緩沖區(qū)中只允許存放WaterLevel個(在寄存器WaterLevelReg中設(shè)置)或更少的字節(jié),則HiAlert標志置位。

上述數(shù)據(jù)滿足下面的等式:

HiAlert?=?(64-FIFOLength)≤WaterLevel

如果實際只有WaterLevel個或更少的字節(jié)存放在FIFO緩沖區(qū)中,則LoAlert標志置位。

同時,它們滿足下面的等式:

LoAlert?=?(64-FIFOLength)≤WaterLevel5.3.3RC522命令

RC522的操作可由執(zhí)行一系列命令的內(nèi)部狀態(tài)機來決定。即通過向命令寄存器寫入相應(yīng)的命令代碼來啟動命令,并且執(zhí)行一個命令所需的參數(shù)和數(shù)據(jù)可通過FIFO緩沖區(qū)來交換。

1.通用特性

?RC522的命令可以動用FIFO緩沖區(qū)設(shè)置參數(shù)和數(shù)據(jù),其操作有一些通用的特性如下:

每個需要數(shù)據(jù)流(或數(shù)據(jù)字節(jié)流)作為輸入的命令在發(fā)現(xiàn)FIFO緩沖區(qū)有數(shù)據(jù)時會立刻處理,收發(fā)命令除外,收發(fā)命令的發(fā)送由寄存器BitFramingReg的StartSend位來啟動。每個需要某一數(shù)量參數(shù)的命令只有在它通過FIFO緩沖區(qū)接收到正確數(shù)量的參數(shù)時才能開始處理。

?FIFO緩沖區(qū)不能在命令啟動時自動清除。

?也有可能要先將命令參數(shù)或數(shù)據(jù)字節(jié)寫入FIFO緩沖區(qū),再啟動命令。

?每個命令的執(zhí)行都可能由MCU向命令寄存器寫入一個新的命令代碼(如idle命令)來中斷。

RC522命令有8個,其命令代碼和描述如表5-10所示。表5-10RC522命令

2.?Idle命令

RC522處于空閑模式。該命令也可用來終止實際正在執(zhí)行的命令。

3.?CalcCRC命令

FIFO的內(nèi)容被傳輸?shù)紺RC協(xié)處理器并執(zhí)行CRC計算,該命令有如下特點:

計算結(jié)果存放在CRCResultReg寄存器中。

?CRC計算無需限制字節(jié)的數(shù)目。

當在數(shù)據(jù)流過程中FIFO變成空時計算也不會停止。

寫入FIFO的下個字節(jié)增加到計算中。

CRC的預(yù)置值由寄存器ModeReg的CRCPreset位控制,該值在命令啟動時裝入CRC協(xié)處理器。

這個命令必須通過向命令寄存器寫入任何一個命令(如空閑命令)來清除。

如果寄存器AutoTestReg的SelfTest位設(shè)置正確,則MFRC522處于自測試模式,啟動CalCRC命令執(zhí)行一次數(shù)字自測試。自測試的結(jié)果寫入FIFO。

4.?Transmit命令

發(fā)送FIFO的內(nèi)容。在發(fā)送FIFO的內(nèi)容之前必須對所有相關(guān)的寄存器進行設(shè)置。該命令在FIFO變空后自動終止。

5.?NOCmdChange命令

該命令不會影響CommandReg寄存器中正在執(zhí)行的任何命令。它可用來修改CommandReg寄存器中除命令位之外的任何位,如RcvOff位或PowerDown位。

6.?Receive命令

MFRC522激活接收器通路,等待接收任何數(shù)據(jù)流。該命令在接收到的數(shù)據(jù)流結(jié)束時自動終止。根據(jù)所選的成幀和速度,通過幀模式結(jié)束或長度字節(jié)來指示。

7.?Transceive命令

該循環(huán)命令重復(fù)發(fā)送FIFO數(shù)據(jù),并不斷接收RF場的數(shù)據(jù)。第一個動作是發(fā)送,發(fā)送結(jié)束后命令變?yōu)榻邮諗?shù)據(jù)流。其順序為:發(fā)送—接收—發(fā)送—接收。

每個發(fā)送過程都在BitFramingReg寄存器的StartSend位置位時啟動。TRANSCEIVE命令通過向命令寄存器寫入任何一個命令(如idle命令)來清除。

8.?MFAuthent命令

該命令用來處理Mifare認證以使能任何Mifare普通卡的安全通信。在命令激活前以下數(shù)據(jù)必須被寫入FIFO:

認證命令代碼(0x60,0x61)。塊地址。

扇區(qū)密鑰字節(jié)0。

扇區(qū)密鑰字節(jié)1。

扇區(qū)密鑰字節(jié)2。

扇區(qū)密鑰字節(jié)3。

扇區(qū)密鑰字節(jié)4。

扇區(qū)密鑰字節(jié)5。

卡序列號字節(jié)0。

卡序列號字節(jié)1。

卡序列號字節(jié)2。

卡序列號字節(jié)3。上述命令參數(shù)總共12字節(jié),應(yīng)當寫入FIFO中。

當MFAuthent命令有效時,任何FIFO訪問都被禁止。只要訪問FIFO的操作發(fā)生,ErrorReg寄存器的WrErr位就置位。

該命令在Mifare卡被認證且Status2Reg寄存器的MFCrypto1On位置位時自動終止。

當卡未響應(yīng)時,該命令不會自動終止。因此,定時器必須初始化成自動模式。這時,除IdleIRQ外,TimerIRQ也可用作終止的標準。

在認證過程中,RxIRQ和TxIRQ被禁止。認證命令結(jié)束后(處理完協(xié)議或?qū)DLE寫入命令寄存器后),只有Crypto1On位有效。

如果認證過程中有錯誤出現(xiàn),則ErrorReg寄存器的ProtocolErr位置位。Status2Reg寄存器的Crypto1On位清零。

9.?SoftReset命令

該命令用來執(zhí)行一次器件復(fù)位,內(nèi)部緩沖區(qū)的配置數(shù)據(jù)保持不變。所有寄存器都設(shè)置成復(fù)位值,命令完成后自動終止。由于SerialSpeedReg寄存器被復(fù)位,則串行數(shù)據(jù)速率被設(shè)置成9600kb/s。5.3.4RC522基本指令

RC522有14種基本指令集,實現(xiàn)不同方式的數(shù)據(jù)傳輸,其指令代碼及含義如表5-11所示。表5-11指令代碼及含義

5.4高頻RFID閱讀器程序設(shè)計

高頻RFID閱讀器程序的主要工作是能夠操作RC522,并按照Mifare卡的規(guī)則和流程對MF1卡進行讀寫和驗證。一般分為三部分:初始化程序、驅(qū)動程序和主程序。

5.4.1初始化程序

初始化程序用于各種管腳和器件的初始化,以便能夠正常進行解碼。下述內(nèi)容用于實現(xiàn)描述5.D.1,即編寫RC522的初始化程序?;谀K化和移植的考慮,可將本例中初始化子程序單獨封裝成子函數(shù)InitAll(),具體源碼如下:【描述5.D.1】InitAll()

//初始化子函數(shù)

voidInitAll(void)

{

InitPort();

InitRc522();

INT_Init();

TIMER_init();

//液晶屏顯示初始化

LCD_init();

loc(1,0);

LCD_display("高頻HF讀卡器:");

loc(4,0);

LCD_display("請刷卡"); //參數(shù),標志位初始化

bWarn=0;

bPass=0;

SysTime=0;

KeyNum=0;

KuaiN=0;

oprationcard=0;

bSendID=0;

Pass();

}

InitPort()函數(shù)負責初始化相關(guān)的I/O端口,具體源碼如下:

【描述5.D.1】InitPort()

//初始化相關(guān)的I/O端口

voidInitPort(void)

{

//蜂鳴器管腳

DDRD|=(1<<PD7);

PORTD|=(1<<PD7);

//LED管腳

DDRC|=(1<<PC7);

PORTC|=(1<<PC7); //初始化H-RST,CSS,MOSI,SCK.

DDRB|=(1<<PB3)|(1<<PB4)|(1<<PB5)|(1<<PB7);

//MISO

DDRB&=~(1<<PB6);

//使能SPI主機模式,設(shè)置時鐘速率為fck/4

SPCR=(1<<SPE)|(1<<MSTR);

}

INT_Init()函數(shù)負責初始化外部中斷的相關(guān)工作方式和參數(shù),具體源碼如下:

【描述5.D.1】INT_Init()

//初始化外部中斷

voidINT_Init(void)

{

//開啟INT0中斷,并初始化

MCUCR|=(1<<ISC01);

GICR|=(1<<INT0);

SREG|=(1<<7);

DDRD|=(1<<PD2);

PORTD|=(1<<PD2);

DDRD&=~(1<<PD2);

}

InitRc522()函數(shù)負責初始化RC522的相關(guān)配置和參數(shù),具體源碼如下:

【描述5.D.1】InitRc522()

//初始化RC522

voidInitRc522(void)

{

//重啟天線

PcdReset();

PcdAntennaOff();

PcdAntennaOn();

//初始化工作類型為ISO14443TYPEA

M500PcdConfigISOType('A');

}

TIMER_init()函數(shù)負責初始化定時器的相關(guān)配置,具體源碼如下:

【描述5.D.1】TIMER_init()

//初始化定時器

voidTIMER_init(void)

{

//初始化定時器0

TCCR0|=(1<<CS02)+(1<<CS00);

TIMSK|=(1<<TOIE0);

TCNT0=256-61;

SREG|=(1<<7);

}5.4.2驅(qū)動程序

驅(qū)動程序是RC522能夠正確解碼的相關(guān)讀寫、命令設(shè)置等函數(shù)。下述內(nèi)容用于實現(xiàn)描述5.D.2,即編寫RC522的相關(guān)驅(qū)動程序。

SPIReadByte()函數(shù)負責使用SPI端口讀入一個Byte,具體源碼如下:

【描述5.D.2】SPIReadByte()

//使用SPI端口讀入一個byte

unsignedcharSPIReadByte(void)

{

unsignedlongi=60000; //啟動數(shù)據(jù)傳輸

SPDR=0XFF;

//等待傳輸結(jié)束

while(i--){

if(SPSR&(1<<SPIF))break;

}

returnSPDR;

}

SPIWriteByte()函數(shù)負責使用SPI端口寫入一個Byte,具體源碼如下:

【描述5.D.2】SPIWriteByte()

//使用SPI端口寫入一個Byte

voidSPIWriteByte(unsignedcharSPIData)

{

unsignedlongi=60000;

//啟動數(shù)據(jù)傳輸

SPDR=SPIData;

//等待傳輸結(jié)束

while(i--){

if(SPSR&(1<<SPIF))

break;

}

}

PcdRequest()函數(shù)負責尋卡的相關(guān)操作和功能,具體源碼如下:

【描述5.D.2】PcdRequest()

/////////////////////////////////////////////////////////////////////

//功能:尋卡

//參數(shù)說明:req_code[IN]:尋卡方式

//0x52=尋感應(yīng)區(qū)內(nèi)所有符合14443A標準的卡

//0x26=尋未進入休眠狀態(tài)的卡

//pTagType[OUT]:卡片類型代碼

//0x4400=Mifare_UltraLight

//0x0400=Mifare_One(S50)

//0x0200=Mifare_One(S70)//0x0800=Mifare_Pro(X)

//0x4403=Mifare_DESFire

//返回:成功返回MI_OK

/////////////////////////////////////////////////////////////////////

unsignedcharPcdRequest(unsignedcharreq_code,unsignedchar*pTagType)

{

unsignedcharstatus;

unsignedintunLen;

unsignedcharucComMF522Buf[MAXRLEN];//18

//清除標志位

ClearBitMask(Status2Reg,0x08);

WriteRawRC(BitFramingReg,0x07);

SetBitMask(TxControlReg,0x03); ucComMF522Buf[0]=req_code;

//讀取狀態(tài)字

status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);

if((status==MI_OK)&&(unLen==0x10))

{

*pTagType=ucComMF522Buf[0];

*(pTagType+1)=ucComMF522Buf[1];

}

else

{status=MI_ERR;}

returnstatus;

}

PcdAnticoll()函數(shù)負責防沖撞算法,具體源碼如下:

【描述5.D.2】PcdAnticoll()

/////////////////////////////////////////////////////////////////////

//功能:防沖撞

//參數(shù)說明:pSnr[OUT]:卡片序列號,4字節(jié)

//返回:成功返回MI_OK

/////////////////////////////////////////////////////////////////////

unsignedcharPcdAnticoll(unsignedchar*pSnr)

{

unsignedcharstatus;

unsignedchari,snr_check=0;

unsignedintunLen;

unsignedcharucComMF522Buf[MAXRLEN];

//清除標志位

ClearBitMask(Status2Reg,0x08);

WriteRawRC(BitFramingReg,0x00);

ClearBitMask(CollReg,0x80);

ucComMF522Buf[0]=PICC_ANTICOLL1;

ucComMF522Buf[1]=0x20;

//讀取狀態(tài)字

status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);

if(status==MI_OK)

{

for(i=0;i<4;i++)

{

*(pSnr+i)=ucComMF522Buf[i];

snr_check^=ucComMF522Buf[i];

}

if(snr_check!=ucComMF522Buf[i])

{

status=MI_ERR;

}

}

SetBitMask(CollReg,0x80);

returnstatus;

}

PcdSelect()函數(shù)負責選定卡片,具體源碼如下:

【描述5.D.2】PcdSelect()

/////////////////////////////////////////////////////////////////////

//功能:選定卡片

//參數(shù)說明:pSnr[IN]:卡片序列號,4字節(jié)

//返回:成功返回MI_OK

/////////////////////////////////////////////////////////////////////

unsignedcharPcdSelect(unsignedchar*pSnr)

{

unsignedcharstatus;

unsignedchari;

unsignedintunLen;

unsignedcharucComMF522Buf[MAXRLEN]; ucComMF522Buf[0]=PICC_ANTICOLL1;

ucComMF522Buf[1]=0x70;

ucComMF522Buf[6]=0;

//存入buffer

for(i=0;i<4;i++)

{

ucComMF522Buf[i+2]=*(pSnr+i);

ucComMF522Buf[6]^=*(pSnr+i);

}

//計算校驗碼

CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);

ClearBitMask(Status2Reg,0x08); status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);

if((status==MI_OK)&&(unLen==0x18))

{

status=MI_OK;

}

else

{

status=MI_ERR;

}

returnstatus;

}

PcdAuthState()函數(shù)負責驗證卡片密碼,具體源碼如下:

【描述5.D.2】PcdAuthState()

/////////////////////////////////////////////////////////////////////

//功能:驗證卡片密碼

//參數(shù)說明:auth_mode[IN]:密碼驗證模式

//0x60=驗證A密鑰

//0x61=驗證B密鑰

//addr[IN]:塊地址

//pKey[IN]:密碼

//pSnr[IN]:卡片序列號,4字節(jié)

//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////

unsignedcharPcdAuthState(unsignedcharauth_mode,unsignedcharaddr,unsignedchar*pKey,unsignedchar*pSnr)

{

unsignedcharstatus;

unsignedintunLen;

unsignedchari,ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0]=auth_mode;

ucComMF522Buf[1]=addr;

//存入密碼

for(i=0;i<6;i++)

{

ucComMF522Buf[i+2]=*(pKey+i);

} for(i=0;i<6;i++)

{

ucComMF522Buf[i+8]=*(pSnr+i);

}

status=PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);

if((status!=MI_OK)||(!(ReadRawRC(Status2Reg)&0x08)))

{

status=MI_ERR;

}

returnstatus;

}

PcdRead()函數(shù)負責讀取M1卡的一塊數(shù)據(jù),具體源碼如下:

【描述5.D.2】PcdRead()

/////////////////////////////////////////////////////////////////////

//功能:讀取M1卡一塊數(shù)據(jù)

//參數(shù)說明:addr[IN]:塊地址

//pData[OUT]:讀出的數(shù)據(jù),16字節(jié)

//返回:成功返回MI_OK

/////////////////////////////////////////////////////////////////////

unsignedcharPcdRead(unsignedcharaddr,unsignedchar*pData)

{

unsignedcharstatus;

unsignedintunLen;

unsignedchari,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0]=PICC_READ;

ucComMF522Buf[1]=addr;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

if((status==MI_OK)&&(unLen==0x90))

{

for(i=0;i<16;i++)

{

*(pData+i)=ucComMF522Buf[i];

}

}

else

{

status=MI_ERR;

}

returnstatus;

}

PcdWrite()函數(shù)負責寫數(shù)據(jù)到M1卡的一塊,具體源碼如下:

【描述5.D.2】PcdWrite()

/////////////////////////////////////////////////////////////////////

//功能:寫數(shù)據(jù)到M1卡的一塊

//參數(shù)說明:addr[IN]:塊地址

//pData[IN]:寫入的數(shù)據(jù),16字節(jié)

//返回:成功返回MI_OK

/////////////////////////////////////////////////////////////////////

unsignedcharPcdWrite(unsignedcharaddr,unsignedchar*pData)

{

unsignedcharstatus;

unsignedintunLen;

unsignedchari,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0]=PICC_WRITE;

ucComMF522Buf[1]=addr;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

if((status!=MI_OK)||(unLen!=4)||((ucComMF522Buf[0]&0x0F)!=0x0A))

{

status=MI_ERR;

}

if(status==MI_OK)

{

//memcpy(ucComMF522Buf,pData,16);

for(i=0;i<16;i++)

{

ucComMF522Buf[i]=*(pData+i);

}

CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);

if((status!=MI_OK)||(unLen!=4)||((ucComMF522Buf[0]&0x0F)!=0x0A))

{

status=MI_ERR;

}

}

returnstatus;

}

PcdHalt()函數(shù)負責命令卡片進入休眠狀態(tài),具體源碼如下:

【描述5.D.2】PcdHalt()

/////////////////////////////////////////////////////////////////////

//功能:命令卡片進入休眠狀態(tài)

//返回:成功返回MI_OK

/////////////////////////////////////////////////////////////////////

unsignedcharPcdHalt(void)

{

unsignedintunLen;

unsignedcharucComMF522Buf[MAXRLEN];

ucComMF522Buf[0]=PICC_HALT;

ucComMF522Buf[1]=0;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

returnMI_OK;

}

CalulateCRC()函數(shù)負責用MF522計算CRC16函數(shù),具體源碼如下:

【描述5.D.2】CalulateCRC()

/////////////////////////////////////////////////////////////////////

//用MF522計算CRC16函數(shù)

/////////////////////////////////////////////////////////////////////

voidCalulateCRC(unsignedchar*pIndata,unsignedcharlen,unsignedchar*pOutData)

{

unsignedchari,n;

ClearBitMask(DivIrqReg,0x04);

WriteRawRC(CommandReg,PCD_IDLE);

SetBitMask(FIFOLevelReg,0x80); for(i=0;i<len;i++)

{

WriteRawRC(FIFODataReg,*(pIndata+i));}

WriteRawRC(CommandReg,PCD_CALCCRC);

i=0xFF;

do{

n=ReadRawRC(DivIrqReg);

i--;

}

while((i!=0)&&!(n&0x04));

pOutData[0]=ReadRawRC(CRCResultRegL);

pOutData[1]=ReadRawRC(CRCResultRegM);

}

PcdReset()函數(shù)負責復(fù)位RC522,具體源碼如下:

【描述5.D.2】PcdReset()

/////////////////////////////////////////////////////////////////////

//功能:復(fù)位RC522

//返回:成功返回MI_OK

/////////////////////////////////////////////////////////////////////

unsignedcharPcdReset(void)

{

//PORTD|=(1<<RC522RST);

SET_RC522RST;

delay_ns(10); CLR_RC522RST;

delay_ns(10);

SET_RC522RST;

delay_ns(10);

WriteRawRC(CommandReg,PCD_RESETPHASE);

delay_ns(10);

//和Mifare卡通訊,CRC初始值0x6363

WriteRawRC(ModeReg,0x3D);

WriteRawRC(TReloadRegL,30);

WriteRawRC(TReloadRegH,0);

WriteRawRC(TModeReg,0x8D);

WriteRawRC(TPrescalerReg,0x3E); //必須要

WriteRawRC(TxAutoReg,0x40);

returnMI_OK;

}

M500PcdConfigISOType()函數(shù)負責設(shè)置RC522的工作方式,具體源碼如下:

【描述5.D.2】M500PcdConfigISOType()

//////////////////////////////////////////////////////////////////////

//設(shè)置RC522的工作方式

//////////////////////////////////////////////////////////////////////

unsignedcharM500PcdConfigISOType(unsignedchartype)

{

//設(shè)置工作方式為ISO14443_A

if(type==‘A’)

{

ClearBitMask(Status2Reg,0x08);

WriteRawRC(ModeReg,0x3D); WriteRawRC(RxSelReg,0x86);

WriteRawRC(RFCfgReg,0x7F);

WriteRawRC(TReloadRegL,30);

WriteRawRC(TReloadRegH,0);

WriteRawRC(TModeReg,0x8D);

WriteRawRC(TPrescalerReg,0x3E);

delay_ns(1000);

PcdAntennaOn();

}

else

{

return1;

}

returnMI_OK;

}

ReadRawRC()函數(shù)負責讀RC522寄存器,具體源碼如下:

【描述5.D.2】ReadRawRC()

/////////////////////////////////////////////////////////////////////

//功能:讀RC522寄存器

//參數(shù)說明:Address[IN]:寄存器地址

//返回:讀出的值

/////////////////////////////////////////////////////////////////////

unsignedcharReadRawRC(unsignedcharAddress)

{

unsignedcharucAddr;

unsignedcharucResult=0; CLR_SPI_CS;

ucAddr=((Address<<1)&0x7E)|0x80;

SPIWriteByte(ucAddr);

ucResult=SPIReadByte();

SET_SPI_CS;

returnucResult;

}

WriteRawRC()函數(shù)負責寫RC522寄存器,具體源碼如下:

【描述5.D.2】WriteRawRC()

/////////////////////////////////////////////////////////////////////

//功能:寫RC522寄存器

//參數(shù)說明:Address[IN]:寄存器地址

//value[IN]:寫入的值

/////////////////////////////////////////////////////////////////////

voidWriteRawRC(unsignedcharAddress,unsignedcharvalue)

{

unsignedcharucAddr; CLR_SPI_CS;

ucAddr=((Address<<1)&0x7E);

SPIWriteByte(ucAddr);

SPIWriteByte(value);

SET_SPI_CS;

}

SetBitMask()函數(shù)負責置RC522寄存器位,具體源碼如下:

【描述5.D.2】SetBitMask()

/////////////////////////////////////////////////////////////////////

//功能:置RC522寄存器位

//參數(shù)說明:reg[IN]:寄存器地址

//mask[IN]:置位值

/////////////////////////////////////////////////////////////////////

voidSetBitMask(unsignedcharreg,unsignedcharmask)

{

unsignedchartmp=0x0;

tmp=ReadRawRC(reg);

WriteRawRC(reg,tmp|mask);//setbitmask

}

ClearBitMask()函數(shù)負責清RC522寄存器位,具體源碼如下:

【描述5.D.2】ClearBitMask()

/////////////////////////////////////////////////////////////////////

//功能:清RC522寄存器位

//參數(shù)說明:reg[IN]:寄存器地址

//mask[IN]:清位值

/////////////////////////////////////////////////////////////////////

voidClearBitMask(unsignedcharreg,unsignedcharmask)

{

unsignedchartmp=0x0;

tmp=ReadRawRC(reg);

WriteRawRC(reg,tmp&~mask);//clearbitmask

}

PcdComMF522()函數(shù)負責通過RC522和ISO14443卡進行通信,傳遞相關(guān)參數(shù)和數(shù)據(jù),具體源碼如下:

【描述5.D.2】PcdComMF522()

/////////////////////////////////////////////////////////////////////

//功能:通過RC522和ISO14443卡通訊

//參數(shù)說明:Command[IN]:RC522命令字

//pInData[IN]:通過RC522發(fā)送到卡片的數(shù)據(jù)

//InLenByte[IN]:發(fā)送數(shù)據(jù)的字節(jié)長度

//pOutData[OUT]:接收到的卡片返回數(shù)據(jù)

//*pOutLenBit[OUT]:返回數(shù)據(jù)的位長度/////////////////////////////////////////////////////////////////////

unsignedcharPcdComMF522(unsignedcharCommand,

unsignedchar*pInData,

unsignedcharInLenByte,

unsignedchar*pOutData,

unsignedint*pOutLenBit)

{

unsignedcharstatus=MI_ERR;

unsignedcharirqEn=0x00;

unsignedcharwaitFor=0x00;

unsignedcharlastBits;

unsignedcharn;

unsignedinti; //分析命令

switch(Command)

{

casePCD_AUTHENT:

irqEn=0x12;

waitFor=0x10;

break;

casePCD_TRANSCEIVE:

irqEn=0x77;

waitFor=0x30;

break;

default:

break;

} //寫命令

WriteRawRC(ComIEnReg,irqEn|0x80);

ClearBitMask(ComIrqReg,0x80);

WriteRawRC(CommandReg,PCD_IDLE);

SetBitMask(FIFOLevelReg,0x80);

for(i=0;i<InLenByte;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論