Turinys:

RC522 ir PN532 RFID pagrindai: 10 žingsnių
RC522 ir PN532 RFID pagrindai: 10 žingsnių

Video: RC522 ir PN532 RFID pagrindai: 10 žingsnių

Video: RC522 ir PN532 RFID pagrindai: 10 žingsnių
Video: PN532 RFID NFC Module with Arduino, How to use HSU UART, SPI, & I2C 2024, Liepa
Anonim
RC522 ir PN532 RFID pagrindai
RC522 ir PN532 RFID pagrindai

PASTABA: dabar turiu „Instructables“, siūlančią „Arduino“kodą RC522 ir PN532.

Prieš kurį laiką eksperimentams nusipirkau tris skirtingus RFID modulius. Ankstesniame projekte aš išsamiai aprašiau, kaip naudoti paprastą 125 kHz modulį pagrindinei saugos funkcijai atlikti. Tokie moduliai naudoja tik skaitymo žymes, todėl procesas nuskaito ID, jei reikia, išsaugo ir palygina su saugomais ID. Kiti moduliai, kuriuos nusipirkau, veikia 13,56 MHz dažniu ir naudoja etiketes, kurias galima skaityti ir rašyti, todėl paprasčiausiai jas naudoti pagrindiniam saugumui yra švaistymas. Du bendri moduliai naudoja arba RC522 mikroschemą, arba PN532 mikroschemą - abu pagaminti NXP.

Jei perskaitėte kitus mano projektus, žinote, kad man patinka naudoti pigius PIC mikrovaldiklius ir programą surinkimo kalba. Taigi aš ieškojau veiksmų sekos, reikalingos kalbėtis su moduliais ir RFID žymomis. Nors internete yra daugybė pavyzdinių programų moduliams, dauguma jų yra parašytos „Arduino“programine įranga ir naudoja SPI sąsają. Be to, lustų ir „Mifare“žymų vadovai šiek tiek iššifruojami. Šis pranešimas pirmiausia yra apie informaciją, kurią norėčiau turėti pradėdamas projektą. Taip pat įtraukiu PIC surinkimo programinės įrangos programas, skirtas atlikti pagrindines kiekvieno modulio reikalaujamas komandas. Net jei nenaudojate PIC ir (arba) surinkimo kalbos, šaltinio kodas turėtų bent jau gerai suprasti, kokias komandas reikia atlikti kiekvienam žingsniui.

1 žingsnis: nuosekliosios sąsajos

Serijinės sąsajos
Serijinės sąsajos
Serijinės sąsajos
Serijinės sąsajos
Serijinės sąsajos
Serijinės sąsajos
Serijinės sąsajos
Serijinės sąsajos

Abi šiuose moduliuose naudojamos mikroschemos gali jungtis per SPI, I2C arba UART (HSSP). PN532 modulis turi DIP jungiklį, kuris naudojamas norimai sąsajai pasirinkti, tačiau MFRC522 modulis yra prijungtas prie SPI sąsajos. Man labiau patinka naudoti integruotą PIC UART, todėl medžiojau internete, norėdamas sužinoti, ar yra būdas įjungti MFRC522 modulį į UART režimą. Radau, kad nupjovus vieną pėdsaką ant lentos pavyks. Pjūvis efektyviai pašalina 3,3 volto lusto EA kaištį. Techniškai EA kaištis turėtų būti prijungtas prie žemės, tačiau nedaug žmonių gali ištraukti tą litavimo žygdarbį, atsižvelgiant į lusto kaiščio tankį. Tačiau nesijaudinkite, nes EA kaištis neturi vidinio prisitraukimo ir „neplaukioja“, kaip tai daro senosios TTL loginės įvestys. Pjovimo vietą žr. Įsitikinkite, kad nukirpėte tik trumpą pėdsaką, einantį tiesiai į EA kaištį.

2 žingsnis: Aparatūra

Techninė įranga
Techninė įranga

Aparatūros jungtys UART ryšiams parodytos aukščiau esančioje diagramoje. MFRC522 UART jungtys nėra pažymėtos lentoje, tačiau, kaip parodyta schemoje, SDA kaištis priima UART duomenis, o MISO kaištis perduoda UART duomenis. PN532 modulis turi UART žymes apatinėje plokštės pusėje.

Abu moduliai veikia 3,3 volto įtampą, o 5 voltų loginį lygį iš PIC TX kaiščio taip pat reikia apriboti. LCD jungtis yra standartinė 4 bitų sąranka, kuri buvo naudojama daugelyje ankstesnių projektų. Numatytasis visų pranešimų formatas nustatytas standartiniam 1602 LCD (16 simbolių ir 2 eilučių). Taip pat turiu 40 simbolių 2 eilučių skystųjų kristalų ekraną, kurį naudoju neapdorotų duomenų iškėlimui derinimo metu, todėl į programinę įrangą įtraukiau apibrėžimą, leidžiantį pasinaudoti papildoma ekrano erdve.

3 žingsnis: duomenų blokai

Šiam projektui naudojamos „Mifare Classic 1k“žymos sukonfigūruotos kaip 16 sektorių, keturi duomenų blokai kiekvienam sektoriui, 16 baitų duomenų blokui. Iš 64 duomenų blokų tik 47 yra tinkami naudoti. Duomenų bloke 0 yra gamintojo duomenys, o 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59 ir 63 blokai vadinami priekabų blokais. Priekabos blokai yra paskutiniai kiekviename sektoriuje ir juose yra du raktai ir blokų prieigos bitai. Raktai ir blokavimo prieigos bitai taikomi tik to sektoriaus duomenų blokams, kad galėtumėte turėti skirtingus raktus ir prieigos taisykles kiekvienam sektoriui. Numatytieji klavišai yra „FF FF FF FF FFh“. Šiam pagrindiniam projektui naudoju tik vieną duomenų bloką ir pasilieku numatytuosius raktus ir prieigos bitus. Yra daug su šiomis kortelėmis susijusių dokumentų, todėl tiesiog ieškokite internete „Mifare“arba apsilankykite NXP svetainėje, jei norite juos nuodugniau ištirti.

4 žingsnis: Bendra operacija

Nors abu moduliai yra unikalūs tuo, kaip jie pasiekiami ir kaip jie pasiekia žymas, yra bendras procesas, reikalingas darbui atlikti. Šiame projekte darome prielaidą, kad žymos yra „Mifare Classic 1k“tipo ir kad vienu metu leidžiame naudoti tik vieną žymę antenos lauke. Pagrindiniai veiksmai yra apibrėžti toliau.

· Inicijuokite modulį: paprastai tam reikalingi tokie dalykai kaip reikšmių įrašymas į registrus mikroschemoje, „pažadinimo“komandų siuntimas ir įjungimas į anteną. Naudodami akumuliatoriumi veikiančią programą norėtumėte įjungti ir išjungti antenos maitinimą, kad sutaupytumėte akumuliatoriaus energijos, tačiau šią paprastą programą įjungiame vieną kartą ir paliekame įjungtą.

· Išvalyti šifravimo vėliavą (tik 522): kai žyma autentifikuojama, vėliava nustatoma taip, kad vartotojas žinotų, jog ryšiai su žyma bus užšifruoti. Šią vėliavą vartotojas turi išvalyti prieš kitą nuskaitymą, net jei nuskaityta žyma yra ta pati.

· Ieškokite žymos: modulis iš esmės klausia „Ar kas nors yra?“ir žyma atsako „aš čia“. Jei modulis nesulaukia greito atsako, jis nustoja klausytis. Tai reiškia, kad turime pakartotinai siųsti nuskaitymo komandas moduliui, kol jis suras žymą.

· Gaukite žymę Vartotojo identifikavimo numeris (UID): Žyma atsakys į nuskaitymo užklausą, pateikdama tam tikrą ribotą informaciją, pvz., Kokios žymos tipą. Tai reiškia, kad mums gali tekti išsiųsti kitą komandą, kad gautume jos UID. UID yra keturi baitai, skirti „Mifare Classic 1k“žymėms. Kitoms žymėms jis gali būti ilgesnis, tačiau šis projektas į jas neatsižvelgia.

· Pasirinkite žymą (tik 522): UID naudojamas žymei, kurią vartotojas nori patvirtinti skaitydamas ir rašydamas, pasirinkti. Tai pagrįsta galimybe, kad antenos lauke gali būti daugiau nei viena žyma. Mūsų paprastos programos atveju taip nėra, tačiau vis tiek turime pasirinkti žymą.

· Autentifikuoti žymą: šis veiksmas yra būtinas, jei norime perskaityti ar parašyti žymą. Jei norime tik atskirti paprastos saugos programos žymas, pakanka UID. Autentifikavimas reikalauja, kad žinotume UID ir žinotume norimos pasiekti žymos duomenų sektoriaus šifravimo raktą. Šiam projektui mes laikomės numatytųjų raktų, tačiau mano tolesnis projektas keičia raktus, kad žyma galėtų būti naudojama kaip elektroninė piniginė.

· Skaitykite arba rašykite žymą: skaitymai visada grąžina visus 16 prašomų duomenų bloko baitų. Rašant reikalaujama, kad visi 16 baitų būtų parašyti vienu metu. Jei norite perskaityti ar parašyti kitą bloką tame pačiame duomenų sektoriuje, žymos nereikia patvirtinti dar kartą. Jei norite skaityti ar rašyti bloką kitame duomenų sektoriuje, žyma turi būti dar kartą patvirtinta naudojant to sektoriaus raktą.

5 veiksmas: MFRC522 modulio prieigos seka

Į paleisties rutiną įeina šie pagrindiniai veiksmai, rasti daugelyje programų, kurias peržiūrėjau:

· Siųsti fiktyvius duomenų baitus (žr. Kitą pastraipą)

· Minkštas atstatymas

· Nustatykite RF imtuvo stiprinimą (jei pageidaujate ko nors kito, nei numatytasis)

· Nustatykite ASK moduliacijos procentą iki 100%

· Nustatykite sėklos vertę CRC skaičiavimams

· Įjunkite anteną

· Gaukite programinės aparatinės įrangos versiją (nebūtina)

Dėl kokių nors nepaaiškinamų priežasčių mano modulis įsijungia ir mano, kad jis gavo rašymo komandą be duomenų baito. Nežinau, ar tai tik mano modulio problema, bet nemačiau nuorodų į jį kitur. Eksperimentavau tiek iš naujo nustatydamas aparatinę, tiek programinę įrangą ir nė viena neišsprendžiau problemos. Mano sprendimas buvo pridėti netikrą skaitymo skambutį, kad modulio inicijavimo rutinos pradžioje būtų užregistruotas „0“(neapibrėžtas). Jei modulis mato tai kaip nežinomos rašymo komandos duomenis, neatrodo, kad atsiras jokių neigiamų padarinių. Jei tai laikoma skaitymo komanda, nieko naudingo neįvyksta. Mane neramina tai, kad negaliu visiškai apibrėžti problemos, ypač atsižvelgiant į tai, kad tik modulio aparatinės įrangos atstatymas problemos neišsprendžia.

RC522 mikroschemą sudaro daugybė registrų, kurių dauguma yra ir skaitomi, ir rašomi. Norėdami atlikti įrašymą, registro numeris siunčiamas į modulį, po kurio rašoma reikšmė. Norint atlikti nuskaitymą, registro numeris pridedamas prie 0x80 ir siunčiamas į modulį. Atsakymas į rašymo komandą yra registro aidas, prie kurio prisijungta. Atsakymas į skaitymo komandą yra registro turinys. Programinė įranga pasinaudoja šiomis žiniomis, kad patikrintų, ar komanda buvo tinkamai įvykdyta.

6 veiksmas: PN532 modulio prieigos seka

Paleidimo procedūra apima šiuos būtinus veiksmus:

· Siųsti inicializacijos eilutę: tai būdinga UART sąsajai. Instrukcijoje teigiama, kad UART sąsaja atsibus penktame sąsajoje aptiktame kylančiame krašte. Rekomenduojama siųsti 0x55, 0x55, 0x00, 0x00, 0x00, 0x00. Daugeliu atvejų tiesiog turi būti pakankamai simbolių su kylančiais kraštais ir jie neturi atrodyti kaip komandų preambulė (00 00 FF).

· Pažadinkite modulį: palaidotas vartotojo vadove rodo, kad modulis inicijuoja tam tikrą miego būseną, vadinamą „LowVbat“. Norėdami išeiti iš šios būsenos, turime atsiųsti komandą „SAMConfiguration“.

PN532 tikisi, kad komandos bus išsiųstos apibrėžtu pranešimo formatu, apimančiu preambulę, pranešimą ir pašto ženklą. Atsakymo pranešimai yra to paties formato. Tiek komandų, tiek atsakymų pranešimuose yra TFI (kadro identifikatorius) ir komandos versija. Komanda naudoja 0xD4 TFI, o atsakymas naudoja 0xD5. Komandų versijos skiriasi, tačiau atsakymas visada padidins komandos versiją ir grąžins ją baitais po TFI. Šis nuoseklumas leidžia lengvai nuskaityti atsakymo pranešimus ir gauti reikiamos informacijos.

Kiekvieną komandinį pranešimą (po preambulės) sudaro pranešimo ilgis, 2 papildomas pranešimo ilgis, TFI, komanda, duomenys, kontrolinė suma ir pašto ženklas. Programinė įranga sukuria atskiras komandas ir tada iškviečia įprastą programą, kuri apskaičiuoja kontrolinę sumą ir prideda pašto ženklą.

Atsakymo pranešimo formatas yra panašus į komandos. Įprastas atsakymas apima ACK (00 00 FF 00 FF 00), po kurio seka konkretus atsakymas į komandą. Kiekvienas komandos atsakymas prasideda 00 00 FF preambule. Atsakyme taip pat turėtų būti TFI baitas D5, po kurio komandos numeris padidintas 1. Mūsų komandai „SAMConfiguration“(14) tai būtų 15. Komanda „SAMConfiguration“gauna tokį atsakymą: 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00.

Yra ir kitų konkrečiam moduliui skirtų komandų, kurias galima siųsti, tačiau jos nėra reikalingos šiai programai. Tačiau aš įtraukiau rutiną, kurią galima iškviesti norint gauti programinės įrangos versijos numerį. Įprastas atsakymas (po ACK ir preambulės) būtų toks: 06 FA D5 03 32 01 06 07 E8 00. „01 06 07“nurodo programinės įrangos versijos numerį 1.6.7.

7 veiksmas: prieigos prie žymos seka

Kai modulis bus paruoštas, galėsime siųsti komandas, skirtas konkrečioms žymoms. Norėdami skaityti ar rašyti žymos duomenis, turime turėti jo identifikavimo numerį (UID). Tada UID ir raktas bus naudojami tam tikram žymų duomenų sektoriui skaityti/rašyti. Žymos duomenų skaitymai/įrašymai visada atliekami visuose 16 baitų nurodytame duomenų bloke. Tai reiškia, kad įprasta programa perskaitys duomenų bloką, pakeis duomenis pagal pageidavimą ir tada įrašys naujus duomenis atgal į žymą.

8 žingsnis: programinė įranga

Nutraukimo tvarkyklės programinė įranga iškviečiama kaskart, kai PIC UART gauna duomenų baitą. Kai kuriuose ankstesniuose UART projektuose galėjau tiesiog apklausti RX pertraukimo vėliavą, o ne naudoti pertraukimo tvarkyklę. Taip nėra šios programinės įrangos atveju, ypač PN532, kuris palaiko daug didesnį duomenų perdavimo greitį nei RC522. RC522 UART sąsaja yra apribota iki 9600 baudų, o numatytoji PN532 yra 115k ir gali būti nustatyta iki 1.288M baudų. Gauti baitai saugomi buferinėje zonoje, o pagrindinė programinės įrangos dalis prireikus juos nuskaito.

Vėliava New_Msg rodo, kad baitai buvo gauti, o baitų skaičius - kiek. Į programinę įrangą įtraukiau „Disp_Buff“rutiną, kurią galima iškviesti, kad derinant būtų rodomas priėmimo buferio turinys. Kai kurie grąžinimo pranešimai perpildys įprastą 1602 ekraną, tačiau turiu 40 simbolių 2 eilučių skystųjų kristalų ekraną, kurį radau internetinėje elektronikos pertekliaus svetainėje. „Max_Line“apibrėžimą galima nustatyti pagal jūsų LCD dydį. Jei pasiekiama „Max_Line“, „Disp_Buff“rutina tęsiama rašant į antrąją eilutę. Jei turite keturių eilučių skystųjų kristalų ekraną, prie šios tvarkos galite pridėti šiek tiek kodo, kad galėtumėte tęsti trečią ir ketvirtą eilutes. PN532 yra vėliava, kurią galima nustatyti taip, kad rutina išmestų visus gautus baitus arba tiesiog išmestų 16 duomenų baitų iš skaitymo atsakymo.

Nereikia išvalyti priėmimo buferio ar „Byte_Count“, nes išvalius „New_Msg“vėliavą „Byte_Count“bus pašalintas pertraukos tvarkytuvu ir tai yra naudojama kaip buferio indeksas. „New_Msg“paprastai pašalinamas prieš kiekvieną komandos veiksmą, kad būtų galima lengvai rasti ir patikrinti tos komandos rezultatus. RC522 tai reiškia, kad priėmimo buferis paprastai turi tik 1–4 baitus. Kai kuriais atvejais, pvz., Skaitant duomenų blokus, „Read_FIFO“komanda turi būti išduodama kelis kartus, kad būtų galima perkelti baitus iš FIFO į priėmimo buferį. Visi PN532 komandų rezultatai patenka į priėmimo buferį, todėl atliekama nuskaitymo procedūra, skirta surasti reikiamus baitus.

Pagrindinė programinės įrangos kilpa nuskaito žymą ir tada patvirtina skaitymo/rašymo žymą. Čia esančiai bandymo programinei įrangai kintamasis „Junk_Num“kiekvieną kartą keičiamas per pagrindinę kilpą ir naudojamas rašant į žymą. Užrašytos vertės pakaitomis keičiamos tarp „Junk_Num“ir „Junk_Num“1 papildinio. Galiausiai perskaitomos ir rodomos 16 parašytų verčių. Kiekvienam žingsniui yra rodomi pranešimai su atidėtais įprastiniais skambučiais, kad būtų galima perskaityti kiekvieną pranešimą. Taip pat pateikiami klaidų pranešimai, tačiau paprastai jie turėtų atsirasti tik tada, kai žyma pašalinama operacijos metu.

Dalis programinės įrangos inicijavimo yra kodo dalis, kuri vykdoma tik įjungus ir praleidžiama, jei aptinkamas programinės įrangos atstatymas. Klaidų pranešimai paprastai baigiasi iš naujo nustatant programinę įrangą, kad būtų galima išeiti iš pagrindinės kilpos. Atstatymas įvyksta „pakreipimo“režimu, kuris tiesiog įgalina „Watchdog“laikmatį ir tada eina į begalinę ciklą, laukdamas skirtojo laiko.

9 veiksmas: unikali programinė įranga MFRC522

RC522 mikroschemai reikia daugiau žemo lygio instrukcijų nei PN532 mikroschemai, kad būtų galima bendrauti su žymėmis. Tai tarsi programavimas surinkimo kalba, palyginti su programavimu „C“. Kitas svarbus skirtumas yra tas, kad RC522 reikalauja, kad ryšiai su žyma būtų nukreipti per FIFO buferį. Rutinos „Write_FIFO“ir „Read_FIFO“tvarko šias užduotis. „MFRC522“programinėje įrangoje yra skyrius daugeliui žemesnio lygio komandų, iš kurių sukurtos pagrindinės funkcijos.

Žymos komandos kontrolinės sumos apskaičiavimas RC522 labai skiriasi nuo PN532. FIFO sukūrus žymos komandą, siunčiama modulio komanda, skirta apskaičiuoti kontrolinę sumą. 16 bitų rezultatas nėra automatiškai pridedamas prie žymos komandos, tačiau jį galima skaityti iš dviejų 8 bitų registrų. Kontrolinės sumos apskaičiavimas ištrina FIFO duomenis, todėl reikalinga seka yra tokia:

· Sukurkite komandą FIFO

· Nurodykite kontrolinės sumos apskaičiavimą

· Vėl sukurkite komandą FIFO

· Perskaitykite CRC registrus ir parašykite kontrolinės sumos baitus FIFO

· Siųsti komandą Gauti arba Autentifikuoti

Komanda „Gauti“perduos FIFO buferį ir automatiškai persijungs į priėmimo režimą, kad lauktų atsakymo iš žymos. Norint iš tikrųjų perduoti duomenis, po komandos „Priimti“turi būti nustatytas „StartSend“bitas „BitFramingRegister“. Komandai Autentifikuoti tokio reikalavimo nėra.

Apskritai, „Arduino“„C“kodo programose, prieinamose internete, naudojami pertraukimo vėliavų registrai ir skirtojo laiko registras, siekiant užtikrinti, kad teisingas atsakymas būtų gautas laiku. Mano nuomone, tai yra per daug šiai ne laiko kritinei programai. Vietoj to aš naudoju trumpą programinės įrangos skirtąjį laiką, kad laukčiau atsakymo ir patikrinau, ar jis teisingas. „Mifare“žymų vadove išsamiai aprašomas įvairių operacijų laikas ir laikas, taip pat leidžiama gauti numatytą baitų skaičių. Šie laiko vėlavimai yra įtraukti į daugumą žemo lygio komandų paprogramių.

10 veiksmas: unikali PN532 programinė įranga

Kai modulis inicijuojamas, veiksmai, kurių reikia norint surasti ir autentifikuoti žymą, atliekami rašant atitinkamą komandą, po kurios reikiami duomenys. Nuskaitymo komanda grąžina UID, kuris vėliau naudojamas autentifikavimui. Po to, skaitant ir rašant žymą, siunčiamas arba grąžinamas 16 baitų adresuotas duomenų blokas.

Inicializavimo seka buvo išsamiai aprašyta anksčiau, o ta pati programinė įranga taip pat siunčia komandą SAMConfiguration, kad modulis išeitų iš „LowVbat“būsenos. Likusios pagrindinės komandos, tokios kaip nuskaitymas, autentifikavimas, skaitymo/rašymo žyma, yra sudaromos nuosekliai pagal taikomas procedūras. Kontrolinė suma apskaičiuojama tiesiog sudėjus komandų baitus, atlikus papildymą ir pridėjus 1, kad jis taptų 2 papildymu. 8 bitų rezultatas pridedamas prie komandų eilutės prieš pat postamble.

Nėra tokio FIFO kaip RC522, todėl visi atsakymo pranešimai gaunami automatiškai. „Find_Response“rutina nuskaito TFI gavimo duomenų buferį (0xD5). Įprasta pasinaudoti žinant, kokie turėtų būti laukiami pranešimai, ir ignoruojami paprasti ACK atsakymai, kuriuose nėra duomenų. Suradus TFI, norimi atsakymai yra žinomi nuo jo. Komandos aidas ir komandos būsenos baitai išsaugomi naudojant „Read_Buff“, kad vėliau būtų galima patikrinti.

Tai šiam įrašui. Peržiūrėkite kitus mano elektronikos projektus: www.boomerrules.wordpress.com

Rekomenduojamas: