111 lines
2.6 KiB
C++
111 lines
2.6 KiB
C++
#include "mfrc522.h"
|
|
|
|
MFRC522::MFRC522(SPI *spi)
|
|
{
|
|
// Open SPI bus
|
|
this->spi = spi;
|
|
spi->SpiOpenPort();
|
|
|
|
// SPI needs configuring for speed as per;
|
|
// def __init__(self, dev='/dev/spidev0.0', spd=1000000):
|
|
// spi.openSPI(device = dev, speed = spd)
|
|
|
|
// Setup GPIO for CS
|
|
//GPIO.setmode(GPIO.BOARD)
|
|
//GPIO.setup(self.NRSTPD, GPIO.OUT)
|
|
//GPIO.output(self.NRSTPD, 1)
|
|
// call init
|
|
MFRC522_Init();
|
|
}
|
|
|
|
MFRC522::~MFRC522()
|
|
{
|
|
spi->SpiClosePort();
|
|
}
|
|
|
|
void MFRC522::MFRC522_Init()
|
|
{
|
|
//GPIO.output(self.NRSTPD, 1);
|
|
MFRC522_Reset();
|
|
Write_MFRC522(MFRC522RegEnum::TModeReg, 0x8D);
|
|
Write_MFRC522(MFRC522RegEnum::TPrescalerReg, 0x3E);
|
|
Write_MFRC522(MFRC522RegEnum::TReloadRegL, 30);
|
|
Write_MFRC522(MFRC522RegEnum::TReloadRegH, 0);
|
|
Write_MFRC522(MFRC522RegEnum::TxAutoReg, 0x40);
|
|
Write_MFRC522(MFRC522RegEnum::ModeReg, 0x3D);
|
|
AntennaOn();
|
|
}
|
|
|
|
void MFRC522::MFRC522_Reset()
|
|
{
|
|
// self.Write_MFRC522(self.CommandReg, self.PCD_RESETPHASE)
|
|
Write_MFRC522(MFRC522RegEnum::CommandReg, MFRC522::PCD_RESETPHASE);
|
|
}
|
|
|
|
void MFRC522::Write_MFRC522(unsigned char addr, unsigned char val)
|
|
{
|
|
//def Write_MFRC522(self, addr, val)
|
|
// spi.transfer(((addr << 1) & 0x7E, val))
|
|
unsigned char buf;
|
|
buf = val;
|
|
this->spi->SpiWriteAndRead(&buf, (addr << 1) & 0x7E);
|
|
|
|
}
|
|
|
|
unsigned char MFRC522::Read_MFRC522(unsigned char addr)
|
|
{
|
|
//def Read_MFRC522(self, addr)
|
|
// val = spi.transfer((((addr << 1) & 0x7E) | 0x80, 0)) return val[1]
|
|
unsigned char buf;
|
|
this->spi->SpiWriteAndRead(&buf, (addr << 1) & 0x7E);
|
|
return buf;
|
|
|
|
}
|
|
|
|
void MFRC522::AntennaOn()
|
|
{
|
|
/*
|
|
def AntennaOn(self):
|
|
temp = self.Read_MFRC522(self.TxControlReg)
|
|
if (~(temp & 0x03)):
|
|
self.SetBitMask(self.TxControlReg, 0x03)
|
|
*/
|
|
uint8_t temp = Read_MFRC522(MFRC522RegEnum::TxControlReg);
|
|
if (~(temp & 0x03)) {
|
|
SetBitMask(MFRC522RegEnum::TxControlReg, 0x03);
|
|
}
|
|
}
|
|
|
|
void MFRC522::AntennaOff()
|
|
{
|
|
/*
|
|
def AntennaOff(self):
|
|
self.ClearBitMask(self.TxControlReg, 0x03)
|
|
*/
|
|
ClearBitMask(MFRC522RegEnum::TxControlReg, 0x03);
|
|
}
|
|
|
|
void MFRC522::SetBitMask(uint8_t addr, uint8_t mask)
|
|
{
|
|
/*
|
|
def SetBitMask(self, reg, mask):
|
|
tmp = self.Read_MFRC522(reg)
|
|
self.Write_MFRC522(reg, tmp | mask)
|
|
*/
|
|
uint8_t temp = Read_MFRC522(addr);
|
|
Write_MFRC522(addr, temp | mask);
|
|
|
|
}
|
|
|
|
void MFRC522::ClearBitMask(uint8_t addr, uint8_t mask)
|
|
{
|
|
/*
|
|
def ClearBitMask(self, reg, mask):
|
|
tmp = self.Read_MFRC522(reg);
|
|
self.Write_MFRC522(reg, tmp & (~mask))
|
|
|
|
*/
|
|
uint8_t temp = Read_MFRC522(addr);
|
|
Write_MFRC522(addr, temp & ~mask);
|
|
|
|
} |