Changed to Class renamed files
This commit is contained in:
parent
a82a2e2b19
commit
cf2c0d4f24
|
@ -1,92 +1,109 @@
|
||||||
#include "spi.h"
|
#include "spi.h"
|
||||||
#include "rc522.h"
|
#include "rc522.h"
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void Write_MFRC522(uchar addr, uchar val)
|
MFRC522::MFRC522(volatile uchar cs_pin, volatile uchar *cs_port, volatile uchar reset_pin, volatile uchar *reset_port) {
|
||||||
|
this->cs_pin = cs_pin;
|
||||||
|
this->cs_port = cs_port;
|
||||||
|
this->reset_pin = reset_pin;
|
||||||
|
this->reset_port = reset_port;
|
||||||
|
*(cs_port-1) |= (1<<cs_pin);
|
||||||
|
*(cs_port) |= (1<<cs_pin);
|
||||||
|
*(reset_port-1) |= (1<<reset_pin);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void MFRC522::put(uchar addr, uchar val)
|
||||||
{
|
{
|
||||||
spi::cs_low();
|
*cs_port &= ~(1<<cs_pin);
|
||||||
spi::transfer((addr<<1)&0x7E);
|
spi::transfer((addr<<1)&0x7E);
|
||||||
spi::transfer(val);
|
spi::transfer(val);
|
||||||
spi::cs_high();
|
*cs_port |= (1<<cs_pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uchar Read_MFRC522(uchar addr)
|
uchar MFRC522::get(uchar addr)
|
||||||
{
|
{
|
||||||
uchar val;
|
uchar val;
|
||||||
spi::cs_low();
|
//spi::cs_low();
|
||||||
|
*cs_port &= ~(1<<cs_pin);
|
||||||
//address format: 1XXXXXX0
|
//address format: 1XXXXXX0
|
||||||
spi::transfer(((addr<<1)&0x7E) | 0x80);
|
spi::transfer(((addr<<1)&0x7E) | 0x80);
|
||||||
val =spi::transfer(0x00);
|
val =spi::transfer(0x00);
|
||||||
spi::cs_high();
|
//spi::cs_high();
|
||||||
|
*cs_port |= (1<<cs_pin);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SetBitMask(uchar reg, uchar mask)
|
void MFRC522::SetBitMask(uchar reg, uchar mask)
|
||||||
{
|
{
|
||||||
uchar tmp;
|
uchar tmp;
|
||||||
tmp = Read_MFRC522(reg);
|
tmp = get(reg);
|
||||||
Write_MFRC522(reg, tmp | mask); // set bit mask
|
put(reg, tmp | mask); // set bit mask
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ClearBitMask(uchar reg, uchar mask)
|
void MFRC522::ClearBitMask(uchar reg, uchar mask)
|
||||||
{
|
{
|
||||||
uchar tmp;
|
uchar tmp;
|
||||||
tmp = Read_MFRC522(reg);
|
tmp = get(reg);
|
||||||
Write_MFRC522(reg, tmp & (~mask)); // clear bit mask
|
put(reg, tmp & (~mask)); // clear bit mask
|
||||||
}
|
}
|
||||||
|
|
||||||
void AntennaOn(void)
|
void MFRC522::AntennaOn(void)
|
||||||
{
|
{
|
||||||
uchar temp;
|
uchar temp;
|
||||||
|
|
||||||
temp = Read_MFRC522(TxControlReg);
|
temp = get(TxControlReg);
|
||||||
if (!(temp & 0x03))
|
if (!(temp & 0x03))
|
||||||
{
|
{
|
||||||
SetBitMask(TxControlReg, 0x03);
|
SetBitMask(TxControlReg, 0x03);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AntennaOff(void)
|
void MFRC522::AntennaOff(void)
|
||||||
{
|
{
|
||||||
ClearBitMask(TxControlReg, 0x03);
|
ClearBitMask(TxControlReg, 0x03);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MFRC522_Reset(void)
|
void MFRC522::Reset(void)
|
||||||
{
|
{
|
||||||
Write_MFRC522(CommandReg, PCD_RESETPHASE);
|
put(CommandReg, PCD_RESETPHASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MFRC522_Init(void)
|
void MFRC522::Init(void)
|
||||||
{
|
{
|
||||||
spi::init();
|
spi::init();
|
||||||
NRSTPD_DDR |= (1<<NRSTPD_PIN);
|
// NRSTPD_DDR |= (1<<NRSTPD_PIN);
|
||||||
NRSTPD_PORT |= (1<<NRSTPD_PIN);
|
// NRSTPD_PORT |= (1<<NRSTPD_PIN);
|
||||||
|
*reset_port &= ~(1<<reset_pin);
|
||||||
|
*reset_port |= (1<<reset_pin);
|
||||||
|
|
||||||
MFRC522_Reset();
|
Reset();
|
||||||
|
|
||||||
//Timer: TPrescaler*TreloadVal/6.78MHz = 24ms
|
//Timer: TPrescaler*TreloadVal/6.78MHz = 24ms
|
||||||
Write_MFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler
|
put(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler
|
||||||
Write_MFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg
|
put(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg
|
||||||
Write_MFRC522(TReloadRegL, 30);
|
put(TReloadRegL, 30);
|
||||||
Write_MFRC522(TReloadRegH, 0);
|
put(TReloadRegH, 0);
|
||||||
Write_MFRC522(TxAutoReg, 0x40); //100%ASK
|
put(TxAutoReg, 0x40); //100%ASK
|
||||||
Write_MFRC522(ModeReg, 0x3D); //CRC original value 0x6363 ???
|
put(ModeReg, 0x3D); //CRC original value 0x6363 ???
|
||||||
|
|
||||||
AntennaOn(); // open antenna
|
AntennaOn(); // open antenna
|
||||||
}
|
}
|
||||||
uchar MFRC522_Request(uchar reqMode, uchar *TagType)
|
uchar MFRC522::Request(uchar reqMode, uchar *TagType)
|
||||||
{
|
{
|
||||||
uchar status;
|
uchar status;
|
||||||
|
|
||||||
uint backBits; // bits of data received
|
uint backBits; // bits of data received
|
||||||
Write_MFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ???
|
put(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ???
|
||||||
|
|
||||||
TagType[0] = reqMode;
|
TagType[0] = reqMode;
|
||||||
status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);
|
status = ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);
|
||||||
|
|
||||||
if ((status != MI_OK) || (backBits != 0x10))
|
if ((status != MI_OK) || (backBits != 0x10))
|
||||||
{
|
{
|
||||||
|
@ -96,7 +113,7 @@ uchar MFRC522_Request(uchar reqMode, uchar *TagType)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen)
|
uchar MFRC522::ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen)
|
||||||
{
|
{
|
||||||
uchar status = MI_ERR;
|
uchar status = MI_ERR;
|
||||||
uchar irqEn = 0x00;
|
uchar irqEn = 0x00;
|
||||||
|
@ -124,20 +141,20 @@ uchar irqEn = 0x00;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Write_MFRC522(CommIEnReg, irqEn|0x80); // permission for interrupt request
|
put(CommIEnReg, irqEn|0x80); // permission for interrupt request
|
||||||
ClearBitMask(CommIrqReg, 0x80); // clear all bits of the interrupt request
|
ClearBitMask(CommIrqReg, 0x80); // clear all bits of the interrupt request
|
||||||
SetBitMask(FIFOLevelReg, 0x80); //FlushBuffer=1, FIFO initialize
|
SetBitMask(FIFOLevelReg, 0x80); //FlushBuffer=1, FIFO initialize
|
||||||
|
|
||||||
Write_MFRC522(CommandReg, PCD_IDLE); //NO action; clear current command ???
|
put(CommandReg, PCD_IDLE); //NO action; clear current command ???
|
||||||
|
|
||||||
// write data into FIFO
|
// write data into FIFO
|
||||||
for (i=0; i<sendLen; i++)
|
for (i=0; i<sendLen; i++)
|
||||||
{
|
{
|
||||||
Write_MFRC522(FIFODataReg, sendData[i]);
|
put(FIFODataReg, sendData[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// execute command
|
// execute command
|
||||||
Write_MFRC522(CommandReg, command);
|
put(CommandReg, command);
|
||||||
if (command == PCD_TRANSCEIVE)
|
if (command == PCD_TRANSCEIVE)
|
||||||
{
|
{
|
||||||
SetBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts
|
SetBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts
|
||||||
|
@ -150,7 +167,7 @@ uchar irqEn = 0x00;
|
||||||
{
|
{
|
||||||
//CommIrqReg[7..0]
|
//CommIrqReg[7..0]
|
||||||
//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
|
//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
|
||||||
n = Read_MFRC522(CommIrqReg);
|
n = get(CommIrqReg);
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
while ((i!=0) && !(n&0x01) && !(n&waitIRq));
|
while ((i!=0) && !(n&0x01) && !(n&waitIRq));
|
||||||
|
@ -159,7 +176,7 @@ uchar irqEn = 0x00;
|
||||||
|
|
||||||
if (i != 0)
|
if (i != 0)
|
||||||
{
|
{
|
||||||
if(!(Read_MFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr
|
if(!(get(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr
|
||||||
{
|
{
|
||||||
status = MI_OK;
|
status = MI_OK;
|
||||||
if (n & irqEn & 0x01)
|
if (n & irqEn & 0x01)
|
||||||
|
@ -170,8 +187,8 @@ uchar irqEn = 0x00;
|
||||||
|
|
||||||
if (command == PCD_TRANSCEIVE)
|
if (command == PCD_TRANSCEIVE)
|
||||||
{
|
{
|
||||||
n = Read_MFRC522(FIFOLevelReg);
|
n = get(FIFOLevelReg);
|
||||||
lastBits = Read_MFRC522(ControlReg) & 0x07;
|
lastBits = get(ControlReg) & 0x07;
|
||||||
if (lastBits)
|
if (lastBits)
|
||||||
{
|
{
|
||||||
*backLen = (n-1)*8 + lastBits;
|
*backLen = (n-1)*8 + lastBits;
|
||||||
|
@ -194,7 +211,7 @@ uchar irqEn = 0x00;
|
||||||
// read the data received in FIFO
|
// read the data received in FIFO
|
||||||
for (i=0; i<n; i++)
|
for (i=0; i<n; i++)
|
||||||
{
|
{
|
||||||
backData[i] = Read_MFRC522(FIFODataReg);
|
backData[i] = get(FIFODataReg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -212,18 +229,18 @@ uchar irqEn = 0x00;
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
uchar MFRC522_Anticoll(uchar *serNum)
|
uchar MFRC522::Anticoll(uchar *serNum)
|
||||||
{
|
{
|
||||||
uchar status;
|
uchar status;
|
||||||
uchar i;
|
uchar i;
|
||||||
uchar serNumCheck=0;
|
uchar serNumCheck=0;
|
||||||
uint unLen;
|
uint unLen;
|
||||||
|
|
||||||
Write_MFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0]
|
put(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0]
|
||||||
|
|
||||||
serNum[0] = PICC_ANTICOLL;
|
serNum[0] = PICC_ANTICOLL;
|
||||||
serNum[1] = 0x20;
|
serNum[1] = 0x20;
|
||||||
status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);
|
status = ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);
|
||||||
|
|
||||||
if (status == MI_OK)
|
if (status == MI_OK)
|
||||||
{
|
{
|
||||||
|
@ -244,7 +261,7 @@ uchar MFRC522_Anticoll(uchar *serNum)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)
|
void MFRC522::CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)
|
||||||
{
|
{
|
||||||
uchar i, n;
|
uchar i, n;
|
||||||
|
|
||||||
|
@ -255,26 +272,26 @@ void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)
|
||||||
// write data into FIFO
|
// write data into FIFO
|
||||||
for (i=0; i<len; i++)
|
for (i=0; i<len; i++)
|
||||||
{
|
{
|
||||||
Write_MFRC522(FIFODataReg, *(pIndata+i));
|
put(FIFODataReg, *(pIndata+i));
|
||||||
}
|
}
|
||||||
Write_MFRC522(CommandReg, PCD_CALCCRC);
|
put(CommandReg, PCD_CALCCRC);
|
||||||
|
|
||||||
// wait for completion of CRC calculation
|
// wait for completion of CRC calculation
|
||||||
i = 0xFF;
|
i = 0xFF;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
n = Read_MFRC522(DivIrqReg);
|
n = get(DivIrqReg);
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
while ((i!=0) && !(n&0x04)); //CRCIrq = 1
|
while ((i!=0) && !(n&0x04)); //CRCIrq = 1
|
||||||
|
|
||||||
// read result from CRC calculation
|
// read result from CRC calculation
|
||||||
pOutData[0] = Read_MFRC522(CRCResultRegL);
|
pOutData[0] = get(CRCResultRegL);
|
||||||
pOutData[1] = Read_MFRC522(CRCResultRegM);
|
pOutData[1] = get(CRCResultRegM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uchar MFRC522_SelectTag(uchar *serNum)
|
uchar MFRC522::SelectTag(uchar *serNum)
|
||||||
{
|
{
|
||||||
uchar i;
|
uchar i;
|
||||||
uchar status;
|
uchar status;
|
||||||
|
@ -291,7 +308,7 @@ uchar MFRC522_SelectTag(uchar *serNum)
|
||||||
buffer[i+2] = *(serNum+i);
|
buffer[i+2] = *(serNum+i);
|
||||||
}
|
}
|
||||||
CalulateCRC(buffer, 7, &buffer[7]); //??
|
CalulateCRC(buffer, 7, &buffer[7]); //??
|
||||||
status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);
|
status = ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);
|
||||||
|
|
||||||
if ((status == MI_OK) && (recvBits == 0x18))
|
if ((status == MI_OK) && (recvBits == 0x18))
|
||||||
|
|
||||||
|
@ -306,7 +323,7 @@ if ((status == MI_OK) && (recvBits == 0x18))
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum)
|
uchar MFRC522::Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum)
|
||||||
{
|
{
|
||||||
uchar status;
|
uchar status;
|
||||||
uint recvBits;
|
uint recvBits;
|
||||||
|
@ -324,9 +341,9 @@ uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *ser
|
||||||
{
|
{
|
||||||
buff[i+8] = *(serNum+i);
|
buff[i+8] = *(serNum+i);
|
||||||
}
|
}
|
||||||
status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);
|
status = ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);
|
||||||
|
|
||||||
if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08)))
|
if ((status != MI_OK) || (!(get(Status2Reg) & 0x08)))
|
||||||
{
|
{
|
||||||
status = MI_ERR;
|
status = MI_ERR;
|
||||||
}
|
}
|
||||||
|
@ -334,7 +351,7 @@ uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *ser
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
uchar MFRC522_Read(uchar blockAddr, uchar *recvData)
|
uchar MFRC522::Read(uchar blockAddr, uchar *recvData)
|
||||||
{
|
{
|
||||||
|
|
||||||
uchar status;
|
uchar status;
|
||||||
|
@ -343,7 +360,7 @@ uchar MFRC522_Read(uchar blockAddr, uchar *recvData)
|
||||||
recvData[0] = PICC_READ;
|
recvData[0] = PICC_READ;
|
||||||
recvData[1] = blockAddr;
|
recvData[1] = blockAddr;
|
||||||
CalulateCRC(recvData,2, &recvData[2]);
|
CalulateCRC(recvData,2, &recvData[2]);
|
||||||
status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);
|
status = ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);
|
||||||
|
|
||||||
if ((status != MI_OK) || (unLen != 0x90))
|
if ((status != MI_OK) || (unLen != 0x90))
|
||||||
{
|
{
|
||||||
|
@ -353,7 +370,7 @@ uchar MFRC522_Read(uchar blockAddr, uchar *recvData)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
uchar MFRC522_Write(uchar blockAddr, uchar *writeData)
|
uchar MFRC522::Write(uchar blockAddr, uchar *writeData)
|
||||||
{
|
{
|
||||||
uchar status;
|
uchar status;
|
||||||
uint recvBits;
|
uint recvBits;
|
||||||
|
@ -364,7 +381,7 @@ uchar MFRC522_Write(uchar blockAddr, uchar *writeData)
|
||||||
buff[0] = PICC_WRITE;
|
buff[0] = PICC_WRITE;
|
||||||
buff[1] = blockAddr;
|
buff[1] = blockAddr;
|
||||||
CalulateCRC(buff, 2, &buff[2]);
|
CalulateCRC(buff, 2, &buff[2]);
|
||||||
status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);
|
status = ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);
|
||||||
|
|
||||||
if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
|
if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
|
||||||
{
|
{
|
||||||
|
@ -378,7 +395,7 @@ uchar MFRC522_Write(uchar blockAddr, uchar *writeData)
|
||||||
buff[i] = *(writeData+i);
|
buff[i] = *(writeData+i);
|
||||||
}
|
}
|
||||||
CalulateCRC(buff, 16, &buff[16]);
|
CalulateCRC(buff, 16, &buff[16]);
|
||||||
status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);
|
status = ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);
|
||||||
|
|
||||||
if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
|
if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
|
||||||
{
|
{
|
||||||
|
@ -389,9 +406,8 @@ uchar MFRC522_Write(uchar blockAddr, uchar *writeData)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MFRC522_Halt(void)
|
char MFRC522::Halt(void)
|
||||||
{
|
{
|
||||||
uchar status;
|
|
||||||
uint unLen;
|
uint unLen;
|
||||||
uchar buff[4];
|
uchar buff[4];
|
||||||
|
|
||||||
|
@ -399,5 +415,5 @@ void MFRC522_Halt(void)
|
||||||
buff[1] = 0;
|
buff[1] = 0;
|
||||||
CalulateCRC(buff, 2, &buff[2]);
|
CalulateCRC(buff, 2, &buff[2]);
|
||||||
|
|
||||||
status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);
|
return ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);
|
||||||
}
|
}
|
|
@ -1,5 +1,4 @@
|
||||||
#ifndef RC522_H
|
#pragma once
|
||||||
#define RC522_H
|
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
@ -115,21 +114,36 @@
|
||||||
#ifndef NRSTPD_PORT
|
#ifndef NRSTPD_PORT
|
||||||
#define NRSTPD_PORT PORTB
|
#define NRSTPD_PORT PORTB
|
||||||
#define NRSTPD_DDR DDRB
|
#define NRSTPD_DDR DDRB
|
||||||
#define NRSTPD_PIN PB1
|
#define NRSTPD_PIN PB2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MAX_LEN 16
|
#define MAX_LEN 16
|
||||||
|
|
||||||
void MFRC522_Init(void);
|
class MFRC522
|
||||||
void MFRC522_Halt(void);
|
{
|
||||||
uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen);
|
private:
|
||||||
void Write_MFRC522(uchar addr, uchar val);
|
/* data */
|
||||||
uchar Read_MFRC522(uchar addr);
|
volatile uchar *reset_port, *cs_port;
|
||||||
uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum);
|
volatile uchar reset_pin, cs_pin;
|
||||||
uchar MFRC522_Write(uchar blockAddr, uchar *writeData);
|
void SetBitMask(uchar reg, uchar mask);
|
||||||
uchar MFRC522_Read(uchar blockAddr, uchar *recvData);
|
void ClearBitMask(uchar reg, uchar mask);
|
||||||
uchar MFRC522_Request(uchar reqMode, uchar *TagType);
|
void AntennaOn(void);
|
||||||
uchar MFRC522_Anticoll(uchar *serNum);
|
void AntennaOff(void);
|
||||||
uchar MFRC522_SelectTag(uchar *serNum);
|
void Reset(void);
|
||||||
|
void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData);
|
||||||
|
public:
|
||||||
|
MFRC522(volatile uchar cs_pin, volatile uchar *cs_port, volatile uchar reset_pin, volatile uchar *reset_port);
|
||||||
|
~MFRC522();
|
||||||
|
void Init(void);
|
||||||
|
char Halt(void);
|
||||||
|
uchar ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen);
|
||||||
|
void put(uchar addr, uchar val);
|
||||||
|
uchar get(uchar addr);
|
||||||
|
uchar Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum);
|
||||||
|
uchar Write(uchar blockAddr, uchar *writeData);
|
||||||
|
uchar Read(uchar blockAddr, uchar *recvData);
|
||||||
|
uchar Request(uchar reqMode, uchar *TagType);
|
||||||
|
uchar Anticoll(uchar *serNum);
|
||||||
|
uchar SelectTag(uchar *serNum);
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
|
|
@ -2,35 +2,58 @@
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include "../lib/usart/src/usart.h"
|
#include "../lib/usart/src/usart.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
#include <util/delay.h>
|
||||||
|
|
||||||
#define uchar unsigned char
|
#define uint8_t unsigned char
|
||||||
#define uint unsigned int
|
#define uint unsigned int
|
||||||
#define MAX_LEN 16
|
#define MAX_LEN 16
|
||||||
const int chipSelectPin = 10;
|
const int chipSelectPin = 10;
|
||||||
const int NRSTPD = 5;
|
const int NRSTPD = 5;
|
||||||
|
|
||||||
uchar serNum[5];
|
uint8_t serNum[5];
|
||||||
uchar writeDate[16] ={'T', 'e', 'n', 'g', ' ', 'B', 'o', 0, 0, 0, 0, 0, 0, 0, 0,0};
|
uint8_t writeDate[16] ={'T', 'e', 'n', 'g', ' ', 'B', 'o', 0, 0, 0, 0, 0, 0, 0, 0,0};
|
||||||
|
|
||||||
uchar sectorKeyA[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
uint8_t sectorKeyA[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
||||||
int main() {
|
int main() {
|
||||||
usart::init(1000000);
|
usart::init(1000000);
|
||||||
printf("Hello");
|
printf("Hello");
|
||||||
PORTC |= (1<<PC6)|(1<<PC7);
|
PORTC |= (1<<PC6)|(1<<PC7);
|
||||||
|
MFRC522 *mfrc522;
|
||||||
|
MFRC522 mfrc522_1(PB4, &PORTB, PB2, &PORTB);
|
||||||
|
MFRC522 mfrc522_2(PB3, &PORTB, PB2, &PORTB);
|
||||||
|
printf("%x %x ", &PORTB, &DDRB);
|
||||||
|
printf("%x %x ", &PORTC, &DDRC);
|
||||||
|
int reader;
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
MFRC522_Init();
|
|
||||||
uchar i;
|
uint8_t i;
|
||||||
uchar status;
|
uint8_t status;
|
||||||
uchar str[MAX_LEN];
|
uint8_t str[MAX_LEN];
|
||||||
uchar RC_size;
|
uint8_t RC_size;
|
||||||
uchar blockAddr; //Select the address of the operation 0~63
|
uint8_t blockAddr; //Select the address of the operation 0~63
|
||||||
|
|
||||||
|
|
||||||
// searching card, return card type
|
// searching card, return card type
|
||||||
while(MFRC522_Request(PICC_REQIDL, str) != MI_OK);
|
while(1) {
|
||||||
|
mfrc522_1.Init();
|
||||||
|
if(mfrc522_1.Request(PICC_REQIDL, str) == MI_OK) {
|
||||||
|
mfrc522 = &mfrc522_1;
|
||||||
|
printf("Reader 1\n\r");
|
||||||
|
reader = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mfrc522_2.Init();
|
||||||
|
if(mfrc522_2.Request(PICC_REQIDL, str) == MI_OK) {
|
||||||
|
mfrc522 = &mfrc522_2;
|
||||||
|
printf("Reader 2\n\r");
|
||||||
|
reader = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status = MFRC522_Anticoll(str);
|
status = mfrc522->Anticoll(str);
|
||||||
memcpy(serNum, str, 5);
|
memcpy(serNum, str, 5);
|
||||||
if (status == MI_OK)
|
if (status == MI_OK)
|
||||||
{
|
{
|
||||||
|
@ -43,20 +66,21 @@ int main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// select card, return card capacity
|
// select card, return card capacity
|
||||||
RC_size = MFRC522_SelectTag(serNum);
|
RC_size = mfrc522->SelectTag(serNum);
|
||||||
if (RC_size != 0)
|
if (RC_size != 0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
if(PINC & (1<<PC6)) {
|
if(reader) {
|
||||||
// write data card
|
// write data card
|
||||||
blockAddr = 7; // data block 7
|
blockAddr = 7; // data block 7
|
||||||
status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorKeyA, serNum); // authentication
|
status = mfrc522->Auth(PICC_AUTHENT1A, blockAddr, sectorKeyA, serNum); // authentication
|
||||||
if (status == MI_OK)
|
if (status == MI_OK)
|
||||||
|
|
||||||
{
|
{
|
||||||
// write data
|
// write data
|
||||||
blockAddr = blockAddr - 3 ;
|
blockAddr = blockAddr - 3 ;
|
||||||
status = MFRC522_Write(blockAddr, writeDate);
|
writeDate[15] = writeDate[15] + 1;
|
||||||
|
status = mfrc522->Write(blockAddr, writeDate);
|
||||||
if(status == MI_OK)
|
if(status == MI_OK)
|
||||||
{
|
{
|
||||||
printf("OK!\n\r");
|
printf("OK!\n\r");
|
||||||
|
@ -65,26 +89,27 @@ int main() {
|
||||||
} else {
|
} else {
|
||||||
// read card
|
// read card
|
||||||
blockAddr = 7; // data block 7
|
blockAddr = 7; // data block 7
|
||||||
status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorKeyA, serNum); // authentication
|
status = mfrc522->Auth(PICC_AUTHENT1A, blockAddr, sectorKeyA, serNum); // authentication
|
||||||
if (status == MI_OK)
|
if (status == MI_OK)
|
||||||
{
|
{
|
||||||
// read data
|
// read data
|
||||||
blockAddr = blockAddr - 3 ;
|
blockAddr = blockAddr - 3 ;
|
||||||
status = MFRC522_Read(blockAddr, str);
|
status = mfrc522->Read(blockAddr, str);
|
||||||
if (status == MI_OK)
|
if (status == MI_OK)
|
||||||
{
|
{
|
||||||
printf("Read from the card ,the data is : \n\r");
|
printf("Read from the card ,the data is : \n\r");
|
||||||
for (i=0; i<16; i++)
|
for (i=0; i<16; i++)
|
||||||
{
|
{
|
||||||
printf("%c", str[i]);
|
printf("%x", str[i]);
|
||||||
if(writeDate[i] != str[i]) printf("Not equal");
|
if(writeDate[i] != str[i]) printf("Not equal");
|
||||||
}
|
}
|
||||||
printf("\n\r");
|
printf("\n\r");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("\n\r");
|
printf("\n\r\n\n\n");
|
||||||
MFRC522_Halt(); // command card into sleeping mode
|
mfrc522->Halt(); // command card into sleeping mode
|
||||||
|
_delay_ms(1000);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue