Finished it
Added CalulateCRC, the Auth func, and the read and write functions. They work, and it's awesome.
This commit is contained in:
parent
bacaeddece
commit
0bd5ebf0dc
1 changed files with 389 additions and 296 deletions
157
MFRC522.py
157
MFRC522.py
|
@ -1,8 +1,10 @@
|
|||
import RPi.GPIO as GPIO
|
||||
import spi
|
||||
import signal
|
||||
|
||||
class MFRC522:
|
||||
|
||||
import RPi.GPIO as GPIO
|
||||
import spi
|
||||
import signal
|
||||
|
||||
class MFRC522:
|
||||
NRSTPD = 22
|
||||
|
||||
MAX_LEN = 16
|
||||
|
@ -103,21 +105,6 @@ class MFRC522:
|
|||
|
||||
serNum = []
|
||||
|
||||
writeData = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100]
|
||||
moneyConsume = 18
|
||||
moneyAdd = 10
|
||||
|
||||
sectorKeyA = [
|
||||
[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
|
||||
[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
|
||||
[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
|
||||
]
|
||||
|
||||
sectorNewKeyA = [
|
||||
[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
|
||||
[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14],
|
||||
[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x33,0x07,0x15,0x34,0x14],
|
||||
]
|
||||
|
||||
def __init__(self,spd=1000000):
|
||||
spi.openSPI(speed=spd)
|
||||
|
@ -172,26 +159,21 @@ class MFRC522:
|
|||
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)
|
||||
|
||||
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:
|
||||
|
@ -207,7 +189,6 @@ class MFRC522:
|
|||
backLen = (n-1)*8 + lastBits
|
||||
else:
|
||||
backLen = n*8
|
||||
|
||||
if n == 0:
|
||||
n = 1
|
||||
if n > self.MAX_LEN:
|
||||
|
@ -265,6 +246,105 @@ class MFRC522:
|
|||
|
||||
return (status,backData)
|
||||
|
||||
def CalulateCRC(self, pIndata):
|
||||
self.ClearBitMask(self.DivIrqReg, 0x04)
|
||||
self.SetBitMask(self.FIFOLevelReg, 0x80);
|
||||
i = 0
|
||||
while i<len(pIndata):
|
||||
self.Write_MFRC522(self.FIFODataReg, pIndata[i])
|
||||
i = i + 1
|
||||
self.Write_MFRC522(self.CommandReg, self.PCD_CALCCRC)
|
||||
i = 0xFF
|
||||
while True:
|
||||
n = self.Read_MFRC522(self.DivIrqReg)
|
||||
i = i - 1
|
||||
if not ((i != 0) and not (n&0x04)):
|
||||
break
|
||||
pOutData = []
|
||||
pOutData.append(self.Read_MFRC522(self.CRCResultRegL))
|
||||
pOutData.append(self.Read_MFRC522(self.CRCResultRegM))
|
||||
return pOutData
|
||||
|
||||
def MFRC522_SelectTag(self, serNum):
|
||||
backData = []
|
||||
buf = []
|
||||
buf.append(self.PICC_SElECTTAG)
|
||||
buf.append(0x70)
|
||||
i = 0
|
||||
while i<5:
|
||||
buf.append(serNum[i])
|
||||
i = i + 1
|
||||
pOut = self.CalulateCRC(buf)
|
||||
buf.append(pOut[0])
|
||||
buf.append(pOut[1])
|
||||
(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf)
|
||||
if (status == self.MI_OK) and (backLen == 0x18):
|
||||
size = backData[0]
|
||||
else:
|
||||
size = 0
|
||||
return size
|
||||
|
||||
def MFRC522_Auth(self, authMode, BlockAddr, Sectorkey, serNum):
|
||||
buff = []
|
||||
buff.append(authMode)
|
||||
buff.append(BlockAddr)
|
||||
i = 0
|
||||
while(i < 6):
|
||||
buff.append(Sectorkey[i])
|
||||
i = i + 1
|
||||
i = 0
|
||||
while(i < 4):
|
||||
buff.append(serNum[i])
|
||||
i = i +1
|
||||
(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_AUTHENT,buff)
|
||||
if not(status == self.MI_OK):
|
||||
print "AUTH ERROR!!"
|
||||
if not(self.Read_MFRC522(self.Status2Reg) & 0x08):
|
||||
print "AUTH ERROR(status2reg & 0x08 != 0"
|
||||
|
||||
def MFRC522_Read(self, blockAddr):
|
||||
recvData = []
|
||||
recvData.append(self.PICC_READ)
|
||||
recvData.append(blockAddr)
|
||||
pOut = self.CalulateCRC(recvData)
|
||||
recvData.append(pOut[0])
|
||||
recvData.append(pOut[1])
|
||||
(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, recvData)
|
||||
if not(status == self.MI_OK):
|
||||
print "Error while reading!"
|
||||
|
||||
print "Got data size: "+str(backLen)
|
||||
i = 0
|
||||
if len(backData) == 16:
|
||||
print "Sector "+str(blockAddr)+" "+str(backData)
|
||||
|
||||
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)
|
||||
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 writen"
|
||||
|
||||
|
||||
def MFRC522_Init(self):
|
||||
GPIO.output(self.NRSTPD, 1)
|
||||
|
||||
|
@ -280,18 +360,18 @@ class MFRC522:
|
|||
self.Write_MFRC522(self.ModeReg, 0x3D)
|
||||
self.AntennaOn()
|
||||
|
||||
continue_reading = True
|
||||
# Capture SIGINT
|
||||
def end_read(signal,frame):
|
||||
continue_reading = True
|
||||
# Capture SIGINT
|
||||
def end_read(signal,frame):
|
||||
global continue_reading
|
||||
print "Ctrl+C captured, ending read."
|
||||
continue_reading = False
|
||||
|
||||
signal.signal(signal.SIGINT, end_read)
|
||||
signal.signal(signal.SIGINT, end_read)
|
||||
|
||||
MIFAREReader = MFRC522()
|
||||
MIFAREReader = MFRC522()
|
||||
|
||||
while continue_reading:
|
||||
while continue_reading:
|
||||
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
|
||||
|
||||
if status == MIFAREReader.MI_OK:
|
||||
|
@ -299,4 +379,17 @@ while continue_reading:
|
|||
|
||||
(status,backData) = MIFAREReader.MFRC522_Anticoll()
|
||||
if status == MIFAREReader.MI_OK:
|
||||
print "Numero de la tarjeta: "+str(backData[0])+","+str(backData[1])+","+str(backData[2])+","+str(backData[3])+","+str(backData[4])
|
||||
print "Card read UID: "+str(backData[0])+","+str(backData[1])+","+str(backData[2])+","+str(backData[3])+","+str(backData[4])
|
||||
MIFAREReader.MFRC522_SelectTag(backData)
|
||||
key = [0xFF,0xFF,0xFF,0xFF,0xFF]
|
||||
|
||||
|
||||
MIFAREReader.MFRC522_Auth(0x60,0,keyA,backData)
|
||||
MIFAREReader.MFRC522_Read(0)
|
||||
i = 1
|
||||
while i < 64:
|
||||
MIFAREReader.MFRC522_Auth(0x60,i,keyA,backData)
|
||||
MIFAREReader.MFRC522_Read(i)
|
||||
i = i + 1
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue