cpp-mfrc522/src/mfrc522.cpp

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);
}