2016-04-28 4 views
1

Für ein Schulprojekt versuchen wir auf ntag213 schreiben (Mifare Ultralight C 180Bytes) und wir sind nicht in der Lage zu schreiben. Abgesehen davon funktioniert die Bibliothek gut mit dem Lesen des Ultralight C/ntag213.Schreiben ntag213 (Mifare Ultralight C) mit mxgxw/MFRC522-python Bibliothek und MFRC522 Reader auf Raspi 2

Die gleiche Einstellung, Bibliothek und Hardware funktioniert gut auf den Mifare 1K Tags 1024kB.

Gibt es jemanden da draußen, der diese Bibliothek bereits in PYTHON mit einem MFRC522 Reader und einem Mifare Ultralight C Tag (ntag213) gemacht hat?

Links:
https://github.com/mxgxw/MFRC522-python http://cache.nxp.com/documents/data_sheet/NTAG213_215_216.pdf?pspll=1

def MFRC522_Write(self, blockAddr, writeData): 
buff = [] 
buff.append(self.PICC_WRITE) 
buff.append(blockAddr) 
crc = self.CalulateCRC(buff) 
buff.append(crc[0]) 
buff.append(crc[1]) 
(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buff) 

#because of a timeout in function ToCard, backdata after this is empty!!!!!!!!! 

if not(status == self.MI_OK) or not(backLen == 4) or not((backData[0] & 0x0F) == 0x0A): 
    status = self.MI_ERR 

print str(backLen)+" backdata &0x0F == 0x0A "+str(backData[0]&0x0F) 
if status == self.MI_OK: 
    i = 0 
    buf = [] 
    while i < 16: 
     buf.append(writeData[i]) 
     i = i + 1 
    crc = self.CalulateCRC(buf) 
    buf.append(crc[0]) 
    buf.append(crc[1]) 
    (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE,buf) 
    if not(status == self.MI_OK) or not(backLen == 4) or not((backData[0] & 0x0F) == 0x0A): 
     print "Error while writing" 
    if status == self.MI_OK: 
     print "Data written" 

So in ToCard Funktion suchen wir den Fehler zu suchen:

def MFRC522_ToCard(self,command,sendData): 
backData = [] 
backLen = 0 
status = self.MI_ERR 
irqEn = 0x00 
waitIRq = 0x00 
lastBits = None 
n = 0 
i = 0 

if command == self.PCD_AUTHENT: 
    irqEn = 0x12 
    waitIRq = 0x10 
if command == self.PCD_TRANSCEIVE: 
    irqEn = 0x77 
    waitIRq = 0x30 

self.Write_MFRC522(self.CommIEnReg, irqEn|0x80) 
self.ClearBitMask(self.CommIrqReg, 0x80) 
self.SetBitMask(self.FIFOLevelReg, 0x80) 

self.Write_MFRC522(self.CommandReg, self.PCD_IDLE); 

while(i<len(sendData)): 
    self.Write_MFRC522(self.FIFODataReg, sendData[i]) 
    i = i+1 

self.Write_MFRC522(self.CommandReg, command) 

if command == self.PCD_TRANSCEIVE: 
    self.SetBitMask(self.BitFramingReg, 0x80) 
#!!!!!!!!!!!!!!!!!!!!!!!!!!! 
# as we saw in the data sheet we figured out that until here everything looks correctly. 
# despite of this fact self.Read_MFRC522(self.CommIrqReg) never gets an ACK 
#!!!!!!!!!!!!!!!!!!!!!!!!!!! 
i = 2000 
while True: 
    n = self.Read_MFRC522(self.CommIrqReg) 
    i = i - 1 
    if ~((i!=0) and ~(n&0x01) and ~(n&waitIRq)): 
    break 

self.ClearBitMask(self.BitFramingReg, 0x80) 

if i != 0: 
    if (self.Read_MFRC522(self.ErrorReg) & 0x1B)==0x00: 
    status = self.MI_OK 

    if n & irqEn & 0x01: 
     status = self.MI_NOTAGERR 

    if command == self.PCD_TRANSCEIVE: 
     n = self.Read_MFRC522(self.FIFOLevelReg) 
     lastBits = self.Read_MFRC522(self.ControlReg) & 0x07 
     if lastBits != 0: 
     backLen = (n-1)*8 + lastBits 
     else: 
     backLen = n*8 

     if n == 0: 
     n = 1 
     if n > self.MAX_LEN: 
     n = self.MAX_LEN 

     i = 0 
     while i<n: 
     backData.append(self.Read_MFRC522(self.FIFODataReg)) 
     i = i + 1; 
    else: 
    status = self.MI_ERR 

return (status,backData,backLen) 
+0

Bitte, Tutorial, versuchen Sie Ihre ersten Schritte zu machen. Wenn Sie auf ein Problem stoßen, das Sie nicht selbst lösen können, fragen Sie hier. –

+0

Hallo, danke fürs Beantworten, aber du verstehst falsch! Wir haben bereits das ganze Setup gemacht, wir haben jetzt eine Weile (4 Wochen) mit dem MFRC522 Reader auf Raspberry Pi 2B und den Mifare 1kB Tags gearbeitet und alles funktioniert gut. Also technisch haben wir unsere Hausaufgaben und unsere Tutorials durch und durch gemacht ... aber etwas stimmt nicht mit dem Lesen der kleinen Schwester/Mifare Ultralight C Tag ... und wir fragen uns nur, ob jemand das schon getan hat ... es gibt keine adäquate Bibliothek oder etwas ... Ich habe gerade C++ Code gefunden ... aber wir brauchen Python, weil wir jetzt die Bibliothek von mxgxw neu schreiben, so dass es mit dem Ultralight funktioniert – Tschabadu

+1

Das ist großartig! Also, frag hier, was du "jemanden" fragst, nach dem du suchst. Erkläre, was du hast, was du versucht hast, was du erreichen willst. Der Punkt ist, dass Ihre Fragen und Antworten wahrscheinlich jemand anderes sein wird. Ohne spezielle Informationen werden Ihre Fragen wahrscheinlich geschlossen. –

Antwort

1

Ich versuche, das gleiche zu tun, ist es wahrscheinlich verbunden mit der Tatsache, dass ultralight-Karten keine Genehmigung benötigen. Was den Ort der Code, den Sie markierten, ich suggest umschreiben es

 while True: 
     n = self.dev_read(0x04) 
     if n == 0: 
      continue # Too fast 
     if n & irq_wait: 
      break # Got it! 
     if n & 0x01: 
      error = True 
      break # The timer decrements the timer value in register TCounterValReg to zero