Obsah:

RC522 a PN532 Základy RFID: 10 krokov
RC522 a PN532 Základy RFID: 10 krokov

Video: RC522 a PN532 Základy RFID: 10 krokov

Video: RC522 a PN532 Základy RFID: 10 krokov
Video: Arduino nano , NFC , relé , přístupový systém 2024, Júl
Anonim
Základy RC522 a PN532 RFID
Základy RC522 a PN532 RFID

POZNÁMKA: Teraz mám návod, ktorý ponúka kód Arduino pre RC522 a PN532.

Pred nejakým časom som si kúpil tri rôzne moduly RFID na experimentovanie. V predchádzajúcom projekte som podrobne popísal, ako používať jednoduchý 125-kHz modul na vykonanie základnej bezpečnostnej funkcie. Moduly, ako sú tieto, používajú značky iba na čítanie, takže proces vyhľadá ID, v prípade potreby ich uloží a porovná s uloženými ID. Ostatné moduly, ktoré som kúpil, pracujú na frekvencii 13,56 MHz a používajú značky, ktoré je možné čítať aj zapisovať, takže je zbytočné ich jednoducho používať na základné zabezpečenie. Dva bežné moduly používajú buď čip RC522, alebo čip PN532 - oba od spoločnosti NXP.

Ak ste čítali niektorý z mojich ďalších projektov, viete, že rád používam lacné mikrokontroléry PIC a program v montážnom jazyku. To, čo som hľadal, bola sekvencia krokov potrebných na rozhovor s modulmi a značkami RFID. Aj keď je pre moduly k dispozícii mnoho príkladov programov, väčšina z nich je napísaná v softvéri „C“pre Arduino a používa rozhranie SPI. Tiež manuály pre čipy a pre tagy Mifare vyžadujú trochu dešifrovanie. Tento príspevok je predovšetkým o informáciách, ktoré by som chcel mať pri spustení projektu. Zahrňujem tiež softvérové programy pre montáž PIC na vykonávanie základných príkazov požadovaných každým modulom. Aj keď nepoužívate jazyk PIC a/alebo assembler, zdrojový kód by vám mal aspoň poskytnúť dobrú predstavu o konkrétnych príkazoch potrebných na vykonanie každého kroku.

Krok 1: Sériové rozhrania

Sériové rozhrania
Sériové rozhrania
Sériové rozhrania
Sériové rozhrania
Sériové rozhrania
Sériové rozhrania
Sériové rozhrania
Sériové rozhrania

Oba čipy použité v týchto moduloch sú schopné prepojenia pomocou SPI, I2C alebo UART (HSSP). Modul PN532 má prepínač DIP, ktorý sa používa na výber požadovaného rozhrania, ale modul MFRC522 je pre rozhranie SPI pevne zapojený. Radšej používam vstavaný UART PIC, a tak som lovil online, aby som zistil, či existuje spôsob, ako dostať modul MFRC522 do režimu UART. Zistil som, že vyrezanie jednej stopy na doske bude stačiť. Rez efektívne odstráni 3,3 voltu z kolíka EA čipu. Technicky by mal byť kolík EA potom spojený so zemou, ale len málo ľudí dokáže tento spájkovací výkon zvládnuť vzhľadom na hustotu pinov čipu. Nemajte sa však čoho obávať, pretože kolík EA nemá vnútorné vysúvanie a „nepláva“ako staré logické vstupy TTL. Miesto na rezanie nájdete v schéme čipu a obrázku v časti dosky. Uistite sa, že ste skrátili iba krátku stopu smerujúcu priamo na kolík EA.

Krok 2: Hardvér

Hardvér
Hardvér

Hardvérové pripojenia pre komunikáciu UART sú znázornené na obrázku vyššie. Pripojenia UART pre MFRC522 nie sú na doske označené, ale ako je schematicky znázornené, pin SDA prijíma údaje UART a pin MISO vysiela údaje UART. Modul PN532 má označenie UART na spodnej strane dosky.

Oba moduly bežia na 3,3 voltov a 5-voltová logická úroveň z pinu PIC TX musí byť tiež obmedzená. Pripojenie LCD je štandardné 4-bitové nastavenie, ktoré bolo použité v mnohých mojich predchádzajúcich projektoch. Predvolený formát pre všetky správy je nastavený pre štandardný LCD displej 1602 (16 znakov po 2 riadkoch). Mám tiež 40 -riadkový LCD displej, ktorý používam na skládky nespracovaných dát počas ladenia, takže som do softvéru zahrnul definíciu, ktorá mi umožňuje využiť výhody extra zobrazovacieho priestoru.

Krok 3: Dátové bloky

Značky Mifare Classic 1k použité v tomto projekte sú nakonfigurované ako 16 sektorov, štyri dátové bloky na sektor, 16 bajtov na dátový blok. Zo 64 dátových blokov je skutočne použiteľných iba 47. Dátový blok 0 obsahuje údaje o výrobcovi a bloky 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59 a 63 sa nazývajú prívesné bloky. Bloky prívesu sú poslednými v každom sektore a obsahujú dva kľúče a prístupové bity k bloku. Kľúče a prístupové bity k blokom sa vzťahujú iba na dátové bloky v tomto sektore, takže pre každý sektor môžete mať rôzne kľúče a pravidlá prístupu. Predvolené klávesy sú nastavené na „FF FF FF FF FFh“. Na tento základný projekt používam iba jeden dátový blok a ponechávam predvolené kľúče a prístupové bity. S týmito kartami súvisí veľa dokumentov, takže stačí vyhľadať „Mifare“online alebo navštíviť webovú stránku NXP, ak ich chcete preskúmať podrobnejšie.

Krok 4: Všeobecná prevádzka

Aj keď sú oba moduly jedinečné v spôsobe, akým sa k nim pristupuje, a spôsobom, akým pristupujú k tagom, na vykonanie práce je potrebný všeobecný proces. Pri tomto projekte predpokladáme, že tagy sú typu Mifare Classic 1k a že v poli antény povoľujeme iba jeden tag súčasne. Základné kroky sú definované nižšie.

· Inicializácia modulu: Vo všeobecnosti to vyžaduje napríklad zápis hodnôt do registrov v čipe, odosielanie príkazov „prebudenia“a zapnutie napájania antény. V batériovej aplikácii by ste chceli zapnúť a vypnúť napájanie antény, aby ste ušetrili batériu, ale pre túto jednoduchú aplikáciu ju raz zapneme a potom necháme zapnutú.

· Vymazať príznak kryptomeny (iba 522): Keď je značka autentifikovaná, nastaví sa príznak, aby používateľ vedel, že komunikácia so značkou bude šifrovaná. Tento príznak musí používateľ vymazať pred ďalším skenovaním, aj keď je skenovaná značka rovnaká.

· Vyhľadať štítok: Modul sa v zásade pýta „Je tam niekto?“a značka odpovie „Som tu“. Ak modul nedostane rýchlu odpoveď, prestane počúvať. To znamená, že musíme opakovane odosielať skenovacie príkazy do modulu, kým nenájde značku.

· Získať identifikačné číslo používateľa (UID) štítku: Štítok odpovie na požiadavku na skenovanie obmedzenými informáciami, ako je napríklad typ štítka. To znamená, že možno budeme musieť odoslať ďalší príkaz, aby sme získali jeho UID. UID je štyri bajty pre značky Mifare Classic 1k. Môže to byť dlhšie pre iné značky, ale tento projekt ich nerieši.

· Vyberte štítok (iba 522): UID sa používa na výber štítku, pre ktorý chce používateľ autentifikovať čítanie a zápis. Je to založené na možnosti, že v poli antény môže byť viac ako jeden štítok. To nie je prípad našej jednoduchej aplikácie, ale značku musíme vybrať.

· Autentifikácia tagu: Tento krok je potrebný, ak chceme tag čítať alebo zapisovať. Ak všetko, čo chceme urobiť, je rozlišovať medzi značkami pre jednoduchú bezpečnostnú aplikáciu, potom stačí UID. Autentifikácia vyžaduje, aby sme poznali UID a aby sme poznali šifrovací kľúč pre dátový sektor značky, ku ktorej chceme získať prístup. Pri tomto projekte sa držíme predvolených kľúčov, ale môj nasledujúci projekt tieto kľúče mení, takže značku je možné použiť ako elektronickú peňaženku.

· Prečítajte alebo zapíšte značku: Pri čítaní sa vždy vráti všetkých 16 bajtov požadovaného bloku údajov. Zápisy vyžadujú, aby bolo všetkých 16 bajtov zapísaných súčasne. Ak chcete čítať alebo zapisovať ďalší blok v rovnakom dátovom sektore, značku nie je potrebné znova autentifikovať. Ak chcete čítať alebo zapisovať bloky v inom dátovom sektore, značku je potrebné znova autentifikovať pomocou kľúča pre daný sektor.

Krok 5: Sekvencia prístupu k modulu MFRC522

Rutina spustenia obsahuje tieto základné kroky, ktoré sa nachádzajú vo väčšine aplikácií, na ktoré som sa pozeral:

· Odoslať fiktívny dátový bajt (pozri nasledujúci odsek)

· Mäkký reset

· Nastavte zisk RF prijímača (ak je požadované niečo iné ako predvolené)

· Nastaviť percento modulácie ASK na 100%

· Nastavte počiatočnú hodnotu pre výpočty CRC

· Zapnite anténu

· Získať verziu firmvéru (nevyžaduje sa)

Z nejakého nevysvetliteľného dôvodu sa môj modul zapne a myslí si, že dostal príkaz na zápis bez dátového bajtu. Neviem, či je to len problém s mojím modulom, ale nikde som na neho nevidel žiadne odkazy. Experimentoval som s resetmi hardvéru aj softvéru a ani jeden problém nevyriešil. Moje riešenie bolo pridať atrapu čítania na registráciu „0“(nedefinované) na začiatku rutiny inicializácie modulu. Ak to modul považuje za údaje pre neznámy príkaz na zápis, nezdá sa, že by to malo škodlivé účinky. Ak to vidí ako príkaz na čítanie, nič užitočné sa nestane. Trápi ma, že nemôžem úplne definovať problém, najmä vzhľadom na to, že hardvérový reset iba modulu problém nevyrieši.

Čip RC522 sa skladá z niekoľkých registrov, z ktorých väčšina je na čítanie aj zápis. Na vykonanie zápisu je do modulu odoslané registračné číslo a za ním hodnota, ktorá má byť zapísaná. Na vykonanie čítania je k registrovému číslu pridané 0x80 a je odoslané do modulu. Odpoveď na príkaz na zápis je ozvenou prístupného registra. Odpoveďou na príkaz na čítanie je obsah registra. Softvér využíva tieto znalosti na overenie, či bol príkaz správne vykonaný.

Krok 6: Sekvencia prístupu k modulu PN532

Rutina spustenia obsahuje tieto požadované kroky:

· Odoslať inicializačný reťazec: Toto je špecifické pre rozhranie UART. V príručke sa uvádza, že rozhranie UART sa prebudí na piatej stúpajúcej hrane zistenej na rozhraní. Odporúčame odoslať 0x55, 0x55, 0x00, 0x00, 0x00, 0x00. Väčšinou musí existovať dostatočný počet znakov so stúpajúcimi hranami a nesmú vyzerať ako príkazová preambula (00 00 FF).

· Prebudenie modulu: V užívateľskej príručke je uvedené, že modul sa inicializuje do akéhosi režimu spánku nazývaného „LowVbat“. Na opustenie tohto stavu musíme odoslať príkaz „SAMConfiguration“.

PN532 očakáva, že príkazy budú odoslané v definovanom formáte správy, ktorý obsahuje preambulu, správu a postamble. Správy s odpoveďami majú rovnaký formát. Správy príkazov a odpovedí obsahujú TFI (identifikátor rámca) a verziu príkazu. Príkaz používa TFI 0xD4 a odpoveď 0xD5. Verzie príkazov sa líšia, ale odpoveď vždy zvýši verziu príkazu a vráti ho v bajte nasledujúcom za TFI. Táto konzistencia umožňuje, aby sa v správach s odpoveďami ľahko skenovali relevantné informácie.

Každá správa príkazu (podľa preambuly) pozostáva z dĺžky správy, doplnku dĺžky správy, TFI, príkazu, údajov, kontrolného súčtu a postamble. Softvér zostaví jednotlivé príkazy a potom zavolá rutinu, ktorá vypočíta kontrolný súčet a pripojí postamble.

Formát správy pre odpoveď je podobný formátu pre príkaz. Typická odpoveď bude zahŕňať ACK (00 00 FF 00 FF 00), za ktorou bude nasledovať konkrétna odpoveď na príkaz. Každá odpoveď príkazu začína preambulou 00 00 FF. Odpoveď by mala mať aj TFI bajt D5, za ktorým by nasledovalo číslo príkazu zvýšené o 1. Pre náš príkaz „SAMConfiguration“(14) by to bolo 15. Príkaz „SAMConfiguration“dostane túto odpoveď: 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00.

Je možné odoslať aj ďalšie príkazy špecifické pre modul, ale nie sú pre túto aplikáciu potrebné. Zahrnul som však rutinu, ktorú je možné zavolať na získanie čísla verzie firmvéru. Typická odpoveď (po ACK a preambule) by bola: 06 FA D5 03 32 01 06 07 E8 00. „01 06 07“označuje číslo verzie firmvéru 1.6.7.

Krok 7: Sekvencia prístupu k tagu

Keď je modul pripravený, môžeme odoslať príkazy špecifické pre značky. Aby sme mohli čítať alebo zapisovať údaje značiek, musíme mať ich identifikačné číslo (UID). UID a kľúč sa potom použijú na autorizáciu konkrétneho sektora údajov značiek na čítanie/zápis. Čítanie/zápis údajov zo štítku sa vždy vykonáva na všetkých 16 bajtoch v uvedenom dátovom bloku. To znamená, že typická aplikácia načíta dátový blok, upraví údaje podľa potreby a potom zapíše nové údaje späť do značky.

Krok 8: Softvér

Softvér obsluhy prerušenia sa zavolá vždy, keď PIC UART prijme bajt údajov. V niektorých mojich predchádzajúcich projektoch UART som mohol namiesto dotazu na obsluhu prerušenia použiť iba dotaz na príznak prerušenia RX. To neplatí pre tento softvér, najmä pre PN532, ktorý komunikuje s oveľa vyššou prenosovou rýchlosťou ako RC522. Rozhranie UART RC522 je obmedzené na 9600 baudov, zatiaľ čo predvolené nastavenie pre PN532 je 115k a je možné ho nastaviť až na 1,288M baud. Prijaté bajty sú uložené v oblasti vyrovnávacej pamäte a hlavná časť softvéru ich podľa potreby obnoví.

Príznak New_Msg označuje, že boli prijaté bajty a Byte_Count udáva, koľko. Do softvéru som zahrnul rutinu „Disp_Buff“, ktorú je možné vyvolať na zobrazenie obsahu vyrovnávacej pamäte príjmu počas ladenia. Niektoré zo správ o návrate pretečú cez typický displej 1602, ale mám 40 riadkov x 2 riadky, ktoré som našiel na internete s prebytkom elektroniky. Definíciu „Max_Line“je možné nastaviť pre veľkosť LCD. Ak sa dosiahne „Max_Line“, rutina „Disp_Buff“pokračuje zápisom do druhého riadka. Ak máte 4-riadkový displej LCD, do tejto rutiny by ste mohli pridať malý kód a pokračovať na riadky tri a štyri. Pre PN532 existuje príznak, ktorý je možné nastaviť tak, že rutina buď vypisuje všetky prijaté bajty, alebo iba vypisuje 16 dátových bajtov z odpovede na čítanie.

Nie je potrebné vymazať vyrovnávaciu pamäť príjmu alebo Byte_Count, pretože vymazanie príznaku New_Msg spôsobí, že nástroj Byte_Count bude vymazaný obsluhou prerušenia a to je to, čo sa používa ako index do vyrovnávacej pamäte. New_Msg sa zvyčajne vymaže pred každým krokom príkazu, aby sa výsledky špecifické pre tento príkaz dali ľahko nájsť a overiť. V RC522 to znamená, že vyrovnávacia pamäť pre príjem má zvyčajne iba 1 až 4 bajty. V niektorých prípadoch, ako je čítanie bloku údajov, musí byť príkaz Read_FIFO zadaný viackrát, aby sa bajty z FIFO presunuli do vyrovnávacej pamäte príjmu. Všetky výsledky príkazov pre PN532 skončia v vyrovnávacej pamäti príjmu, takže sa vykoná skenovací postup na vyhľadanie konkrétnych potrebných bajtov.

Hlavná slučka v softvéri vyhľadá štítok a potom štítok autentifikuje na čítanie/zápis. V prípade tu zahrnutého testovacieho softvéru sa premenná Junk_Num upravuje zakaždým v hlavnej slučke a používa sa počas zápisu do značky. Zapísané hodnoty sa striedajú medzi hodnotou Junk_Num a doplnkom 1 Junk_Num. Nakoniec sa načíta a zobrazí 16 zapísaných hodnôt. Pre každý krok sú zobrazené správy s rutinnými hovormi s oneskorením, ktoré umožňujú čas na prečítanie každej správy. K dispozícii sú aj chybové správy, ktoré by sa však mali bežne vyskytovať iba vtedy, ak je počas operácie odstránený štítok.

Súčasťou inicializácie softvéru je časť kódu, ktorá sa vykoná iba pri zapnutí a preskočí sa, ak sa zistí reset softvéru. Chybové hlásenia sa spravidla ukončujú resetom softvéru ako spôsobom, ako opustiť hlavnú slučku. Reset sa vykoná v rutine „Tilt“, ktorá jednoducho aktivuje časovač Watchdog a potom prejde do nekonečnej slučky, ktorá čaká na časový limit.

Krok 9: Jedinečný softvér MFRC522

Na uskutočnenie komunikácie so značkami vyžaduje čip RC522 viac inštrukcií na nízkej úrovni ako čip PN532. Je to niečo ako programovanie v montážnom jazyku oproti programovaniu v „C“. Ďalším významným rozdielom je, že RC522 vyžaduje, aby bola komunikácia so značkou prenášaná cez vyrovnávaciu pamäť FIFO. Rutiny „Write_FIFO“a „Read_FIFO“tieto úlohy zvládajú. Softvér MFRC522 obsahuje časť pre mnoho príkazov nižšej úrovne, z ktorej sú postavené hlavné funkcie.

Výpočet kontrolného súčtu príkazu tag pre RC522 je veľmi odlišný ako pre PN532. Potom, čo je príkaz tagu zabudovaný do FIFO, je odoslaný príkaz modulu na výpočet kontrolného súčtu. 16-bitový výsledok nie je automaticky pripojený k príkazu tag, ale je k dispozícii na čítanie z dvoch 8-bitových registrov. Výpočet kontrolného súčtu vymaže údaje vo FIFO, takže požadovaná postupnosť je nasledovná:

· Vytvorte príkaz vo FIFO

· Príkaz na výpočet kontrolného súčtu

· Znova vytvorte príkaz vo FIFO

· Prečítajte si registre CRC a zapíšte bajty kontrolného súčtu do FIFO

· Odošlite buď príkaz Transceive alebo Authenticate

Príkaz Transceive prenesie vyrovnávaciu pamäť FIFO a potom sa automaticky prepne do režimu príjmu, aby počkal na odpoveď zo značky. Po príkaze Transceive musí nasledovať nastavenie bitu StartSend v BitFramingRegister, aby sa dáta skutočne prenášali. Príkaz Authenticate túto požiadavku nemá.

Aplikácie kódu Arduino „C“dostupné online používajú vo všeobecnosti registre príznaku prerušenia a register časového limitu, aby sa zabezpečilo včasné prijatie správnej odpovede. Podľa môjho názoru je to pre túto časovo kritickú aplikáciu zbytočné. Namiesto toho používam krátke časové limity softvéru, aby som počkal na odpoveď a potom overil, či je správna. Príručka k značkám Mifare podrobne popisuje načasovanie rôznych transakcií a čas je tiež povolený pre prijatie očakávaného počtu bajtov. Tieto časové oneskorenia sú súčasťou väčšiny podprogramov príkazov nízkej úrovne.

Krok 10: Jedinečný softvér PN532

Po inicializácii modulu sa vykonajú kroky potrebné na nájdenie a autentifikáciu značky napísaním príslušného príkazu, za ktorým nasledujú potrebné údaje. Príkaz scan vráti UID, ktoré sa potom použije na autentifikáciu. Potom čítanie a zápis značky odošle alebo vráti 16 bajtov pre adresný dátový blok.

Inicializačná sekvencia bola podrobne popísaná skôr a rovnaká softvérová rutina tiež posiela príkaz SAMConfiguration, aby sa modul dostal zo stavu „LowVbat“. Ostatné základné príkazy, ako napríklad Scan, Authenticate, Read/Write Tag, sú len postupne zostavené v príslušných rutinách. Kontrolný súčet sa vypočíta tak, že sa spočítajú bajty príkazov, urobí sa doplnok a potom sa pridá 1, aby sa stal doplnkom 2. 8-bitový výsledok je pripojený k príkazovému reťazcu tesne pred postamble.

Neexistuje žiadny FIFO ako v RC522, takže správy o kompletnej odpovedi sú prijímané automaticky. Rutina „Find_Response“skenuje vyrovnávaciu pamäť príjmu údajov pre TFI (0xD5). Rutina využíva znalosti toho, aké by mali byť očakávané správy, a ignoruje jednoduché odpovede ACK, ktoré neobsahujú údaje. Akonáhle je TFI nájdený, požadované reakcie sú známym ofsetom od neho. Echo príkazu a bajty stavu príkazu sú rutinou „Read_Buff“uložené na neskoršie overenie.

To je k tomuto príspevku všetko. Pozrite sa na moje ďalšie projekty v oblasti elektroniky na: www.boomerrules.wordpress.com

Odporúča: