From f50b0c513c63b30b851dba89961d8fdbe448c46b Mon Sep 17 00:00:00 2001 From: danjperron Date: Wed, 17 Jan 2024 16:20:18 -0500 Subject: [PATCH] add NTAG NFC --- Pico_example/Pico_read.py | 16 +++++-- mfrc522.py | 96 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 108 insertions(+), 4 deletions(-) diff --git a/Pico_example/Pico_read.py b/Pico_example/Pico_read.py index 8950f52..60acc16 100644 --- a/Pico_example/Pico_read.py +++ b/Pico_example/Pico_read.py @@ -23,6 +23,7 @@ try: while True: reader.init() + (stat, tag_type) = reader.request(reader.REQIDL) #print('request stat:',stat,' tag_type:',tag_type) if stat == reader.OK: @@ -31,9 +32,18 @@ try: continue if stat == reader.OK: print("Card detected {} uid={}".format(hex(int.from_bytes(bytes(uid),"little",False)).upper(),reader.tohexstring(uid))) - defaultKey = [255,255,255,255,255,255] - reader.MFRC522_DumpClassic1K(uid, Start=0, End=64, keyA=defaultKey) - print("Done") + + if reader.IsNTAG(): + print("Got NTAG{}".format(reader.NTAG)) + reader.MFRC522_Dump_NTAG(Start=0,End=reader.NTAG_MaxPage) + #print("Write Page 5 to 0x1,0x2,0x3,0x4 in 2 second") + #utime.sleep(2) + #data = [1,2,3,4] + #reader.writeNTAGPage(5,data) + #reader.MFRC522_Dump_NTAG(uid,Start=5,End=6) + else: + defaultKey = [255,255,255,255,255,255] + reader.MFRC522_DumpClassic1K(Start=0, End=64, keyA=defaultKey) PreviousCard = uid else: pass diff --git a/mfrc522.py b/mfrc522.py index adf97ac..1e891a3 100644 --- a/mfrc522.py +++ b/mfrc522.py @@ -9,6 +9,12 @@ class MFRC522: NOTAGERR = 1 ERR = 2 + + NTAG_213 = 213 + NTAG_215 = 215 + NTAG_216 = 216 + NTAG_NONE = 0 + REQIDL = 0x26 REQALL = 0x52 AUTHENT1A = 0x60 @@ -29,7 +35,8 @@ class MFRC522: self.rst.value(0) self.cs.value(1) - + self.NTAG = 0 + self.NTAG_MaxPage = 0 board = uname()[0] if board == 'WiPy' or board == 'LoPy' or board == 'FiPy': @@ -379,4 +386,91 @@ class MFRC522: return self.ERR return self.OK + def MFRC522_Dump_NTAG(self,Start=0, End=135): + for absoluteBlock in range(Start,End,4): + MaxIndex = 4 * 135 + status = self.OK + print("Page {:02d}: ".format(absoluteBlock),end="") + if status == self.OK: + status, block = self.read(absoluteBlock) + if status == self.ERR: + break + else: + Index = absoluteBlock*4 + for i in range(len(block)): + if Index < MaxIndex : + print("{:02X} ".format(block[i]),end="") + else: + print(" ",end="") + if (i%4)==3: + print(" ",end="") + Index+=1 + print(" ",end="") + Index = absoluteBlock*4 + for value in block: + if Index < MaxIndex: + if (value > 0x20) and (value < 0x7f): + print(chr(value),end="") + else: + print('.',end="") + Index+=1 + print("") + else: + break + if status == self.ERR: + print("Authentication error") + return self.ERR + return self.OK + def writeNTAGPage(self,page,data): + if page>self.NTAG_MaxPage: + return self.ERR + if page < 4: + return self.ERR + if len(data) != 4: + return self.ERR + + return self.write(page,data+[0]*12) + + def getNTAGVersion(self): + buf = [0x60] + buf += self._crc(buf) + stat, recv,_ = self._tocard(0x0C, buf) + return stat, recv + + + #Version NTAG213 = [0x0 ,0x4, 0x4, 0x2, 0x1, 0x0,0x0f, 0x3] + #Version NTAG215 = [0x0 ,0x4, 0x4, 0x2, 0x1, 0x0,0x11, 0x3] + #Version NTAG216 = [0x0 ,0x4, 0x4, 0x2, 0x1, 0x0,0x13, 0x3] + + def IsNTAG(self): + self.NTAG = self.NTAG_NONE + self.NTAG_MaxPage=0 + (stat , rcv) = self.getNTAGVersion() + if stat == self.OK: + if len(rcv) < 8: + return False #do we have at least 8 bytes + if rcv[0] != 0: + return False #check header + if rcv[1] != 4: + return False #check Vendor ID + if rcv[2] != 4: + return False #check product type + if rcv[3] != 2: + return False #check subtype + if rcv[7] != 3: + return False #check protocol + if rcv[6] == 0xf: + self.NTAG= self.NTAG_213 + self.NTAG_MaxPage = 44 + return True + if rcv[6] == 0x11: + self.NTAG= self.NTAG_215 + self.NTAG_MaxPage = 134 + return True + if rcv[7] == 0x13: + self.NTAG= self.NTAG_216 + self.NTAG_MaxPage = 230 + return True + return false +