2016-04-28 82 views
1

對於我們試圖在ntag213(Mifare Ultralight C 180Bytes)上編寫的學校項目,我們無法編寫它。除此之外,圖書館正在閱讀Ultralight C/ntag213正常工作。用mxgxw/MFRC522-python庫和Raspi 2上的MFRC522閱讀器編寫ntag213(Mifare Ultralight C)

相同的設置,庫和硬件在Mifare 1K Tags 1024kB上運行良好。

有沒有人在那裏用MFRC522閱讀器和Mifare Ultralight C標籤(ntag213)在PYTHON中使用這個庫?

鏈接:
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" 

所以我們正在研究ToCard功能來搜索錯誤:

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

請找教程,儘量讓你的第一個步驟。當你遇到一些你自己無法解決的問題時,請在這裏問問。 –

+0

你好,謝謝你的回答,但你明白錯了!我們已經完成了整個設置,現在我們使用Raspberry Pi 2B上的MFRC522 Reader和Mifare 1kB標籤現在工作了一段時間(4周),所有工作都正常。因此,從技術上講,我們完成了我們的作業和教程,但是在閱讀小妹妹/ Mifare Ultralight C Tag時出現了一些問題......我們只是想知道是否有人已經這樣做了......沒有足夠的庫或者其他什麼......我只是找到了C++代碼......但是我們需要Python,因爲我們現在正在從mxgxw重寫庫,以便它可以與Ultralight – Tschabadu

+1

一起使用這太棒了!所以,在這裏問一下你會問你要找的人。解釋你有什麼,你嘗試過什麼,你想完成什麼。關鍵是你的問題和答案可能會是別人。沒有任何具體信息,您的問題可能會被關閉。 –

回答

1

我試圖做同樣的事情,它可能與超輕型卡不需要授權的事實相關聯。 至於你突出顯示的代碼的地方,我suggest重寫一遍

 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