2016-04-28 132 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