Obsah:

RC522 a PN532 Základy RFID: 10 kroků
RC522 a PN532 Základy RFID: 10 kroků

Video: RC522 a PN532 Základy RFID: 10 kroků

Video: RC522 a PN532 Základy RFID: 10 kroků
Video: Arduino nano , NFC , relé , přístupový systém 2024, Červenec
Anonim
RC522 a PN532 Základy RFID
RC522 a PN532 Základy RFID

POZNÁMKA: Nyní mám Instructables, které nabízejí kód Arduino pro RC522 a PN532.

Před časem jsem koupil tři různé moduly RFID pro experimentování. V předchozím projektu jsem podrobně popsal, jak pomocí jednoduchého modulu 125 kHz provádět základní bezpečnostní funkce. Moduly, jako jsou ty, používají značky pouze pro čtení, takže proces vyhledá ID, v případě potřeby je uloží a porovná s uloženými ID. Ostatní moduly, které jsem koupil, pracují na frekvenci 13,56 MHz a používají značky, které lze číst i zapisovat, takže je prostě zbytečné je jednoduše používat pro základní zabezpečení. Dva běžné moduly používají buď čip RC522, nebo čip PN532 - oba od NXP.

Pokud jste četli některý z mých dalších projektů, víte, že rád používám levné mikrokontroléry PIC a program v jazyce sestavení. To, co jsem hledal, byla posloupnost kroků nutných k rozhovoru s moduly a se značkami RFID. Přestože je pro moduly k dispozici spousta příkladů programů online, většina z nich je napsána v softwaru „C“pro Arduino a používá rozhraní SPI. Také manuály pro čipy a pro tagy Mifare vyžadují trochu dešifrování. Tento příspěvek je především o informacích, které bych si přál mít při zahájení projektu. Zahrnuji také softwarové programy pro montáž PIC pro provádění základních příkazů požadovaných každým modulem. I když nepoužíváte jazyk PIC a/nebo sestavení, zdrojový kód by vám měl alespoň poskytnout dobrou představu o konkrétních příkazech požadovaných k provedení každého kroku.

Krok 1: Sériová rozhraní

Sériová rozhraní
Sériová rozhraní
Sériová rozhraní
Sériová rozhraní
Sériová rozhraní
Sériová rozhraní
Sériová rozhraní
Sériová rozhraní

Oba čipy použité v těchto modulech jsou schopné propojení přes SPI, I2C nebo UART (HSSP). Modul PN532 má přepínač DIP, který se používá k výběru požadovaného rozhraní, ale modul MFRC522 je pro rozhraní SPI pevně připojen. Raději používám vestavěný UART PIC, a tak jsem lovil online, abych zjistil, zda existuje způsob, jak dostat modul MFRC522 do režimu UART. Zjistil jsem, že vysekat jednu stopu na hrací ploše bude stačit. Řez účinně odstraňuje 3,3 voltů z EA kolíku čipu. Technicky by měl být pin EA spojen se zemí, ale vzhledem k hustotě pinů čipu tento proces pájení nemůže mnoho lidí zvládnout. Nemějte však obavy, protože pin EA nemá interní výsuv a „neplave“jako staré logické vstupy TTL. Místo, které chcete řezat, naleznete v diagramu čipu a obrázku v části desky. Ujistěte se, že jste zkrátili pouze krátkou stopu směřující přímo na pin EA.

Krok 2: Hardware

Hardware
Hardware

Hardwarová připojení pro komunikaci UART jsou uvedena na obrázku výše. Připojení UART pro MFRC522 nejsou na desce označena, ale, jak je znázorněno na schématu, pin SDA přijímá data UART a pin MISO vysílá data UART. Modul PN532 má označení UART na spodní straně desky.

Oba moduly běží na 3,3 voltů a také je třeba omezit 5voltovou logickou úroveň z pinu PIC TX. Připojení LCD je standardní 4bitové nastavení, které bylo použito v řadě mých předchozích projektů. Výchozí formát pro všechny zprávy je nastaven pro standardní 1602 LCD (16 znaků po 2 řádcích). Mám také 40řádkový 2řádkový LCD displej, který používám na skládky nezpracovaných dat během ladění, takže jsem do softwaru zahrnul definici, která mi umožňuje využít výhody dalšího zobrazovacího prostoru.

Krok 3: Datové bloky

Značky Mifare Classic 1k použité pro tento projekt jsou konfigurovány jako 16 sektorů, čtyři datové bloky na sektor, 16 bytů na datový blok. Ze 64 datových bloků je skutečně použitelných pouze 47. Datový blok 0 obsahuje data výrobce a bloky 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59 a 63 se nazývají přívěsné bloky. Bloky přívěsu jsou poslední v každém sektoru a obsahují dva klíče a přístupové bity bloku. Klíče a přístupové bity bloků se vztahují pouze na datové bloky v tomto sektoru, takže pro každý sektor můžete mít jiné klíče a přístupová pravidla. Výchozí klávesy jsou nastaveny na „FF FF FF FF FFh“. Pro tento základní projekt používám pouze jeden datový blok a ponechávám výchozí klíče a přístupové bity. S těmito kartami souvisí spousta dokumentů, takže stačí online vyhledat „Mifare“nebo navštívit web NXP, pokud je chcete prozkoumat hlouběji.

Krok 4: Obecná operace

Zatímco oba moduly jsou jedinečné ve způsobu, jakým jsou přístupné, a způsobem, jakým přistupují ke značkám, existuje obecný proces, který je nezbytný k provedení úlohy. U tohoto projektu předpokládáme, že tagy jsou typu Mifare Classic 1k a že v poli antény povolujeme pouze jeden tag najednou. Základní kroky jsou definovány níže.

· Inicializace modulu: Obecně to vyžaduje věci, jako je zápis hodnot do registrů v čipu, odesílání příkazů „probuzení“a zapnutí napájení antény. V aplikaci poháněné baterií byste chtěli mít možnost zapnout a vypnout napájení antény, aby se šetřila baterie, ale u této jednoduché aplikace ji jednou zapneme a poté ji necháme zapnutou.

· Vymazat příznak kryptoměny (pouze 522): Když je značka ověřena, nastaví se příznak, aby uživatel věděl, že komunikace se značkou bude šifrována. Tento příznak musí uživatel vymazat před dalším skenováním, i když je skenovaná značka stejná.

· Vyhledat značku: Modul se v zásadě zeptá „Je tam někdo?“a štítek odpovídá „Jsem tady“. Pokud modul nedostane rychlou odpověď, přestane poslouchat. To znamená, že musíme opakovaně odesílat skenovací příkazy do modulu, dokud nenajde značku.

· Získat identifikační číslo uživatele (UID): Štítek odpoví na požadavek na skenování s některými omezenými informacemi, jako je typ tagu, kterým je. To znamená, že možná budeme muset odeslat další příkaz, abychom získali jeho UID. UID je pro značky Mifare Classic 1k čtyři bajty. Může to být delší pro jiné značky, ale tento projekt je neřeší.

· Vyberte značku (pouze 522): UID se používá k výběru značky, pro kterou chce uživatel ověřovat čtení a zápis. To je založeno na možnosti, že v poli antény může být více než jeden tag. To není případ naší jednoduché aplikace, ale stejně musíme značku vybrat.

· Ověřit značku: Tento krok je vyžadován, pokud chceme značku číst nebo zapisovat. Pokud vše, co chceme udělat, je rozlišovat mezi tagy pro jednoduchou bezpečnostní aplikaci, pak stačí UID. Ověření vyžaduje, abychom znali UID a znali šifrovací klíč pro datový sektor značky, ke které chceme přistupovat. U tohoto projektu se držíme výchozích klíčů, ale můj následný projekt mění klíče, takže značku lze použít jako elektronickou peněženku.

· Přečíst nebo zapsat značku: Čtení vždy vrátí všech 16 bajtů požadovaného bloku dat. Zápisy vyžadují, aby bylo všech 16 bajtů zapsáno současně. Pokud chcete číst nebo zapisovat další blok ve stejném datovém sektoru, značku není nutné znovu ověřovat. Pokud chcete číst nebo zapisovat blok v jiném datovém sektoru, je třeba značku znovu ověřit pomocí klíče pro tento sektor.

Krok 5: Přístupová sekvence modulu MFRC522

Rutina spouštění zahrnuje tyto základní kroky, které se nacházejí ve většině aplikací, na které jsem se podíval:

· Odeslat fiktivní datový bajt (viz další odstavec)

· Soft reset

· Nastavte zisk RF přijímače (pokud je požadováno něco jiného než výchozí)

· Nastavit procento modulace ASK na 100%

· Nastavit počáteční hodnotu pro výpočty CRC

· Zapněte anténu

· Získat verzi firmwaru (není vyžadováno)

Z nějakého nevysvětleného důvodu se můj modul zapne a myslí si, že obdržel příkaz pro zápis bez datového bajtu. Nevím, jestli je to jen problém mého modulu, ale nikde jsem na něj neviděl žádné odkazy. Experimentoval jsem s resetováním hardwaru i softwaru a ani problém nevyřešil. Moje řešení bylo přidat na začátku rutiny inicializace modulu fiktivní volání pro registraci „0“(nedefinováno). Pokud to modul vidí jako data pro neznámý příkaz pro zápis, nezdá se, že by to mělo nějaké škodlivé účinky. Pokud to vidí jako příkaz ke čtení, nic užitečného se nestane. Vadí mi, že nemohu problém plně definovat, zvláště vzhledem k tomu, že hardwarový reset pouze modulu problém nevyřeší.

Čip RC522 se skládá z řady registrů, z nichž většina je jak pro čtení, tak pro zápis. K provedení zápisu je do modulu odesláno registrační číslo a za ním hodnota pro zápis. K provedení čtení je k registrovému číslu přidáno 0x80 a je odesláno do modulu. Odpověď na příkaz pro zápis je ozvěnou přístupného registru. Odpovědí na příkaz ke čtení je obsah registru. Software využívá těchto znalostí k ověření, že byl příkaz správně proveden.

Krok 6: Sekvence přístupu k modulu PN532

Rutina spouštění obsahuje tyto požadované kroky:

· Odeslat inicializační řetězec: Toto je specifické pro rozhraní UART. Manuál uvádí, že rozhraní UART se probudí na páté stoupající hraně detekované na rozhraní. Doporučuje odeslat 0x55, 0x55, 0x00, 0x00, 0x00, 0x00. Většinou musí existovat dostatečný počet postav se stoupajícími hranami a nesmí vypadat jako příkazová preambule (00 00 FF).

· Probuzení modulu: Uložený v uživatelské příručce ukazuje, že modul se inicializuje do jakéhosi režimu spánku nazývaného „LowVbat“. K opuštění tohoto stavu musíme odeslat příkaz „SAMConfiguration“.

PN532 očekává, že příkazy budou odeslány v definovaném formátu zprávy, který obsahuje preambuli, zprávu a postamble. Zprávy s odpovědí mají stejný formát. Zprávy příkazů a odpovědí obsahují TFI (identifikátor rámce) a verzi příkazu. Příkaz používá TFI 0xD4 a odpověď používá 0xD5. Verze příkazů se liší, ale odpověď vždy zvýší verzi příkazu a vrátí ji v bajtu následujícím za TFI. Tato konzistence umožňuje, aby zprávy odpovědí byly snadno skenovány pro relevantní informace.

Každá zpráva příkazu (v návaznosti na preambuli) se skládá z délky zprávy, doplňku délky zprávy 2, TFI, příkazu, dat, kontrolního součtu a postamble. Software vytvoří jednotlivé příkazy a poté zavolá rutinu, která vypočítá kontrolní součet a připojí postamble.

Formát zprávy pro odpověď je podobný formátu příkazu. Typická odpověď bude zahrnovat ACK (00 00 FF 00 FF 00) následovanou konkrétní odpovědí na příkaz. Každá odpověď příkazu začíná preambulou 00 00 FF. Odpověď by také měla mít TFI byte D5 následovaný číslem příkazu zvýšeným o 1. Pro náš příkaz „SAMConfiguration“(14) by to bylo 15. Příkaz „SAMConfiguration“dostane tuto odpověď: 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00.

Lze odeslat další příkazy specifické pro modul, ale nejsou pro tuto aplikaci potřeba. Zahrnul jsem však rutinu, kterou lze zavolat pro načtení čísla verze firmwaru. Typická odpověď (po ACK a preambuli) by byla: 06 FA D5 03 32 01 06 07 E8 00. „01 06 07“označuje číslo verze firmwaru 1.6.7.

Krok 7: Sekvence přístupu k tagům

Poté, co se modul připraví, můžeme odeslat příkazy specifické pro tagy. Abychom mohli číst nebo zapisovat data značek, musíme mít jejich identifikační číslo (UID). UID a klíč pak budou použity k autorizaci konkrétního sektoru dat tagů pro čtení/zápisy. Čtení/zápis dat tagu se vždy provádí na všech 16 bajtech v zadaném datovém bloku. To znamená, že typická aplikace načte datový blok, upraví data podle potřeby a poté zapíše nová data zpět do značky.

Krok 8: Software

Software obsluhy přerušení se zavolá vždy, když PIC UART obdrží bajt dat. V některých mých předchozích projektech UART jsem byl schopen pouze dotazovat příznak přerušení RX místo toho, abych musel používat obslužný program přerušení. To neplatí pro tento software, zvláště pro PN532, který komunikuje s mnohem vyšší přenosovou rychlostí než RC522. Rozhraní UART RC522 je omezeno na 9600 baudů, zatímco výchozí pro PN532 je 115k a lze jej nastavit až na 1,288M baud. Přijaté bajty jsou uloženy v oblasti vyrovnávací paměti a hlavní část softwaru je podle potřeby načte.

Příznak New_Msg označuje, že byly přijaty bajty, a Byte_Count udává, kolik. Do softwaru jsem zahrnul rutinu „Disp_Buff“, kterou lze vyvolat pro zobrazení obsahu přijímací vyrovnávací paměti během ladění. Některé zprávy o návratu přetékají typickým displejem 1602, ale mám 40řádkový 2řádkový LCD displej, který jsem našel na online přebytečné stránce s elektronikou. Definici „Max_Line“lze nastavit pro velikost vašeho LCD. Pokud je dosaženo „Max_Line“, pokračuje rutina „Disp_Buff“zápisem do druhého řádku. Pokud máte 4řádkový displej LCD, můžete do této rutiny přidat malý kód a pokračovat na řádky tři a čtyři. Pro PN532 existuje příznak, který lze nastavit tak, že rutina buď vypisuje všechny přijaté bajty, nebo pouze vypisuje 16 datových bytů z odpovědi na čtení.

Není nutné vymazat přijímací vyrovnávací paměť nebo Byte_Count, protože vymazání příznaku New_Msg způsobí, že Byte_Count bude vymazán obsluhou přerušení a to je to, co se používá jako index do vyrovnávací paměti. New_Msg se obvykle vymaže před každým krokem příkazu, aby bylo možné snadno vyhledat a ověřit výsledky specifické pro daný příkaz. V RC522 to znamená, že přijímací vyrovnávací paměť má obvykle pouze 1 až 4 bajty. V některých případech, například při čtení datových bloků, musí být příkaz Read_FIFO vydán vícekrát, aby bylo možné přesunout bajty z FIFO do přijímací vyrovnávací paměti. Všechny výsledky příkazů pro PN532 končí v přijímací vyrovnávací paměti, takže je provedena procedura skenování k vyhledání konkrétních potřebných bytů.

Hlavní smyčka v softwaru vyhledá tag a poté autentizuje tag pro čtení/zápis. U zde zahrnutého testovacího softwaru je proměnná Junk_Num upravována pokaždé v hlavní smyčce a používá se během zápisu do tagu. Zapisované hodnoty se střídají mezi hodnotou Junk_Num a doplňkem 1 Junk_Num. Nakonec se načte a zobrazí 16 zapsaných hodnot. Pro každý krok jsou zobrazeny zprávy se zpožděním rutinních hovorů, které umožňují čas na přečtení každé zprávy. K dispozici jsou také chybové zprávy, které by se však normálně měly vyskytovat pouze v případě, že je tag během operace odstraněn.

Součástí inicializace softwaru je část kódu, která se spouští pouze při zapnutí a je přeskočena, pokud je detekován reset softwaru. Chybové zprávy obecně končí softwarovým resetem jako způsobem, jak opustit hlavní smyčku. Reset se provádí v rutině „Tilt“, která jednoduše aktivuje časovač Watchdog a poté přejde do nekonečné smyčky čekající na časový limit.

Krok 9: Unikátní software MFRC522

Čip RC522 vyžaduje k provádění komunikace se značkami více instrukcí nižší úrovně než čip PN532. Je to něco jako programování v assembleru oproti programování v „C“. Dalším významným rozdílem je, že RC522 vyžaduje, aby komunikace se značkou byla přenášena prostřednictvím vyrovnávací paměti FIFO. Tyto úlohy zvládají rutiny „Write_FIFO“a „Read_FIFO“. Software MFRC522 obsahuje část pro mnoho příkazů nižší úrovně, ze kterých jsou postaveny hlavní funkce.

Výpočet kontrolního součtu příkazu tag pro RC522 je velmi odlišný než pro PN532. Poté, co je ve FIFO vytvořen příkaz tag, je odeslán příkaz modulu pro výpočet kontrolního součtu. 16bitový výsledek není automaticky připojen k příkazu tag, ale je k dispozici pro čtení ze dvou 8bitových registrů. Výpočet kontrolního součtu smaže data ve FIFO, takže požadovaná posloupnost je následující:

· Sestavte příkaz ve FIFO

· Příkaz pro výpočet kontrolního součtu

· Znovu sestavte příkaz ve FIFO

· Přečtěte si registry CRC a zapište bajty kontrolního součtu do FIFO

· Odeslat buď příkaz Transceive nebo Authenticate

Příkaz Transceive přenese vyrovnávací paměť FIFO a poté se automaticky přepne do režimu příjmu a čeká na odpověď od značky. Aby bylo možné data skutečně přenášet, musí za příkazem Transceive následovat nastavení bitu StartSend v BitFramingRegister. Příkaz Authenticate tento požadavek nemá.

Obecně platí, že aplikace kódu Arduino „C“dostupné online používají registry příznaků přerušení a registr časového limitu, aby zajistily včasné přijetí správné odpovědi. Podle mého názoru je to pro tuto časově kritickou aplikaci zbytečné. Místo toho používám krátké softwarové časové limity, abych čekal na odpověď a poté ověřil, že je správná. Manuál pro značky Mifare podrobně popisuje časování různých transakcí a čas je také povolen pro očekávaný počet bytů, které mají být přijaty. Tato časová zpoždění jsou integrována do většiny podprogramů příkazů nízké úrovně.

Krok 10: Jedinečný software PN532

Poté, co je modul inicializován, jsou kroky potřebné k nalezení a autentizaci značky provedeny napsáním příslušného příkazu následovaným potřebnými údaji. Příkaz skenování vrátí UID, které se poté použije pro autentizaci. Poté čte a zapisuje značku, která odesílá nebo vrací 16 bajtů pro adresovaný datový blok.

Sekvence inicializace byla podrobně popsána dříve a stejná softwarová rutina také odesílá příkaz SAMConfiguration, aby modul dostal ze stavu „LowVbat“. Zbytek základních příkazů, jako je Scan, Authenticate, Read/Write Tag, je právě vytvářen postupně v příslušných rutinách. Kontrolní součet se vypočítá pouhým sečtením bajtů příkazu, provedením doplňku a přidáním 1, aby byl doplněk 2. 8bitový výsledek je připojen k příkazovému řetězci těsně před postamble.

Neexistuje žádný FIFO jako v RC522, takže zprávy s kompletní odpovědí jsou přijímány automaticky. Rutina „Find_Response“skenuje vyrovnávací paměť přijímaných dat pro TFI (0xD5). Rutina využívá znalosti toho, jaké by měly být očekávané zprávy, a ignoruje jednoduché odpovědi ACK, které neobsahují data. Jakmile je TFI nalezen, požadované reakce jsou známým offsetem od něj. Echo příkazu a bajty stavu příkazu jsou uloženy rutinou „Read_Buff“pro pozdější ověření.

To je k tomuto příspěvku. Podívejte se na mé další projekty v oblasti elektroniky na: www.boomerrules.wordpress.com

Doporučuje: