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