diff --git a/src/rc522.cpp b/src/mfrc522.cpp similarity index 61% rename from src/rc522.cpp rename to src/mfrc522.cpp index 4a5fa6b..3eba64e 100644 --- a/src/rc522.cpp +++ b/src/mfrc522.cpp @@ -1,92 +1,109 @@ #include "spi.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(val); - spi::cs_high(); + *cs_port |= (1<<cs_pin); } -uchar Read_MFRC522(uchar addr) +uchar MFRC522::get(uchar addr) { uchar val; - spi::cs_low(); + //spi::cs_low(); + *cs_port &= ~(1<<cs_pin); //address format: 1XXXXXX0 spi::transfer(((addr<<1)&0x7E) | 0x80); val =spi::transfer(0x00); - spi::cs_high(); + //spi::cs_high(); + *cs_port |= (1<<cs_pin); return val; } -void SetBitMask(uchar reg, uchar mask) +void MFRC522::SetBitMask(uchar reg, uchar mask) { uchar tmp; - tmp = Read_MFRC522(reg); - Write_MFRC522(reg, tmp | mask); // set bit mask + tmp = get(reg); + put(reg, tmp | mask); // set bit mask } -void ClearBitMask(uchar reg, uchar mask) +void MFRC522::ClearBitMask(uchar reg, uchar mask) { uchar tmp; - tmp = Read_MFRC522(reg); - Write_MFRC522(reg, tmp & (~mask)); // clear bit mask + tmp = get(reg); + put(reg, tmp & (~mask)); // clear bit mask } -void AntennaOn(void) +void MFRC522::AntennaOn(void) { uchar temp; - temp = Read_MFRC522(TxControlReg); + temp = get(TxControlReg); if (!(temp & 0x03)) { SetBitMask(TxControlReg, 0x03); } } -void AntennaOff(void) +void MFRC522::AntennaOff(void) { 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(); - NRSTPD_DDR |= (1<<NRSTPD_PIN); - NRSTPD_PORT |= (1<<NRSTPD_PIN); + // NRSTPD_DDR |= (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 - Write_MFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler - Write_MFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg - Write_MFRC522(TReloadRegL, 30); - Write_MFRC522(TReloadRegH, 0); - Write_MFRC522(TxAutoReg, 0x40); //100%ASK - Write_MFRC522(ModeReg, 0x3D); //CRC original value 0x6363 ??? + put(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler + put(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg + put(TReloadRegL, 30); + put(TReloadRegH, 0); + put(TxAutoReg, 0x40); //100%ASK + put(ModeReg, 0x3D); //CRC original value 0x6363 ??? AntennaOn(); // open antenna } -uchar MFRC522_Request(uchar reqMode, uchar *TagType) +uchar MFRC522::Request(uchar reqMode, uchar *TagType) { uchar status; uint backBits; // bits of data received - Write_MFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ??? + put(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ??? 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)) { @@ -96,7 +113,7 @@ uchar MFRC522_Request(uchar reqMode, uchar *TagType) 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 irqEn = 0x00; @@ -124,20 +141,20 @@ uchar irqEn = 0x00; 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 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 for (i=0; i<sendLen; i++) { - Write_MFRC522(FIFODataReg, sendData[i]); + put(FIFODataReg, sendData[i]); } // execute command - Write_MFRC522(CommandReg, command); + put(CommandReg, command); if (command == PCD_TRANSCEIVE) { SetBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts @@ -150,7 +167,7 @@ uchar irqEn = 0x00; { //CommIrqReg[7..0] //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq - n = Read_MFRC522(CommIrqReg); + n = get(CommIrqReg); i--; } while ((i!=0) && !(n&0x01) && !(n&waitIRq)); @@ -159,7 +176,7 @@ uchar irqEn = 0x00; if (i != 0) { - if(!(Read_MFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr + if(!(get(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr { status = MI_OK; if (n & irqEn & 0x01) @@ -170,8 +187,8 @@ uchar irqEn = 0x00; if (command == PCD_TRANSCEIVE) { - n = Read_MFRC522(FIFOLevelReg); - lastBits = Read_MFRC522(ControlReg) & 0x07; + n = get(FIFOLevelReg); + lastBits = get(ControlReg) & 0x07; if (lastBits) { *backLen = (n-1)*8 + lastBits; @@ -194,7 +211,7 @@ uchar irqEn = 0x00; // read the data received in FIFO for (i=0; i<n; i++) { - backData[i] = Read_MFRC522(FIFODataReg); + backData[i] = get(FIFODataReg); } } } @@ -212,18 +229,18 @@ uchar irqEn = 0x00; return status; } -uchar MFRC522_Anticoll(uchar *serNum) +uchar MFRC522::Anticoll(uchar *serNum) { uchar status; uchar i; uchar serNumCheck=0; uint unLen; - Write_MFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0] + put(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0] serNum[0] = PICC_ANTICOLL; serNum[1] = 0x20; - status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen); + status = ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen); if (status == MI_OK) { @@ -244,7 +261,7 @@ uchar MFRC522_Anticoll(uchar *serNum) return status; } -void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData) +void MFRC522::CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData) { uchar i, n; @@ -255,26 +272,26 @@ void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData) // write data into FIFO 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 i = 0xFF; do { - n = Read_MFRC522(DivIrqReg); + n = get(DivIrqReg); i--; } while ((i!=0) && !(n&0x04)); //CRCIrq = 1 // read result from CRC calculation - pOutData[0] = Read_MFRC522(CRCResultRegL); - pOutData[1] = Read_MFRC522(CRCResultRegM); + pOutData[0] = get(CRCResultRegL); + pOutData[1] = get(CRCResultRegM); } -uchar MFRC522_SelectTag(uchar *serNum) +uchar MFRC522::SelectTag(uchar *serNum) { uchar i; uchar status; @@ -291,7 +308,7 @@ uchar MFRC522_SelectTag(uchar *serNum) buffer[i+2] = *(serNum+i); } 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)) @@ -306,7 +323,7 @@ if ((status == MI_OK) && (recvBits == 0x18)) 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; uint recvBits; @@ -324,9 +341,9 @@ uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *ser { 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; } @@ -334,7 +351,7 @@ uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *ser return status; } -uchar MFRC522_Read(uchar blockAddr, uchar *recvData) +uchar MFRC522::Read(uchar blockAddr, uchar *recvData) { uchar status; @@ -343,7 +360,7 @@ uchar MFRC522_Read(uchar blockAddr, uchar *recvData) recvData[0] = PICC_READ; recvData[1] = blockAddr; 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)) { @@ -353,7 +370,7 @@ uchar MFRC522_Read(uchar blockAddr, uchar *recvData) return status; } -uchar MFRC522_Write(uchar blockAddr, uchar *writeData) +uchar MFRC522::Write(uchar blockAddr, uchar *writeData) { uchar status; uint recvBits; @@ -364,7 +381,7 @@ uchar MFRC522_Write(uchar blockAddr, uchar *writeData) buff[0] = PICC_WRITE; buff[1] = blockAddr; 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)) { @@ -378,7 +395,7 @@ uchar MFRC522_Write(uchar blockAddr, uchar *writeData) buff[i] = *(writeData+i); } 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)) { @@ -389,9 +406,8 @@ uchar MFRC522_Write(uchar blockAddr, uchar *writeData) return status; } -void MFRC522_Halt(void) +char MFRC522::Halt(void) { - uchar status; uint unLen; uchar buff[4]; @@ -399,5 +415,5 @@ void MFRC522_Halt(void) buff[1] = 0; CalulateCRC(buff, 2, &buff[2]); - status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen); + return ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen); } \ No newline at end of file diff --git a/src/rc522.h b/src/mfrc522.h similarity index 80% rename from src/rc522.h rename to src/mfrc522.h index ccda289..6aef285 100644 --- a/src/rc522.h +++ b/src/mfrc522.h @@ -1,5 +1,4 @@ -#ifndef RC522_H -#define RC522_H +#pragma once #include <avr/io.h> @@ -115,21 +114,36 @@ #ifndef NRSTPD_PORT #define NRSTPD_PORT PORTB #define NRSTPD_DDR DDRB - #define NRSTPD_PIN PB1 + #define NRSTPD_PIN PB2 #endif #define MAX_LEN 16 -void MFRC522_Init(void); -void MFRC522_Halt(void); -uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen); -void Write_MFRC522(uchar addr, uchar val); -uchar Read_MFRC522(uchar addr); -uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum); -uchar MFRC522_Write(uchar blockAddr, uchar *writeData); -uchar MFRC522_Read(uchar blockAddr, uchar *recvData); -uchar MFRC522_Request(uchar reqMode, uchar *TagType); -uchar MFRC522_Anticoll(uchar *serNum); -uchar MFRC522_SelectTag(uchar *serNum); +class MFRC522 +{ +private: + /* data */ + volatile uchar *reset_port, *cs_port; + volatile uchar reset_pin, cs_pin; + void SetBitMask(uchar reg, uchar mask); + void ClearBitMask(uchar reg, uchar mask); + void AntennaOn(void); + void AntennaOff(void); + 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 \ No newline at end of file diff --git a/test/main.cpp b/test/main.cpp index 4f281d3..c6ae6b9 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -2,35 +2,58 @@ #include <avr/io.h> #include "../lib/usart/src/usart.h" #include "string.h" +#include <util/delay.h> -#define uchar unsigned char +#define uint8_t unsigned char #define uint unsigned int #define MAX_LEN 16 const int chipSelectPin = 10; const int NRSTPD = 5; -uchar serNum[5]; -uchar writeDate[16] ={'T', 'e', 'n', 'g', ' ', 'B', 'o', 0, 0, 0, 0, 0, 0, 0, 0,0}; +uint8_t serNum[5]; +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() { usart::init(1000000); printf("Hello"); 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) { - MFRC522_Init(); - uchar i; - uchar status; - uchar str[MAX_LEN]; - uchar RC_size; - uchar blockAddr; //Select the address of the operation 0~63 + + uint8_t i; + uint8_t status; + uint8_t str[MAX_LEN]; + uint8_t RC_size; + uint8_t blockAddr; //Select the address of the operation 0~63 // 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); if (status == MI_OK) { @@ -43,20 +66,21 @@ int main() { } // select card, return card capacity - RC_size = MFRC522_SelectTag(serNum); + RC_size = mfrc522->SelectTag(serNum); if (RC_size != 0) {} - if(PINC & (1<<PC6)) { + if(reader) { // write data card 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) { // write data blockAddr = blockAddr - 3 ; - status = MFRC522_Write(blockAddr, writeDate); + writeDate[15] = writeDate[15] + 1; + status = mfrc522->Write(blockAddr, writeDate); if(status == MI_OK) { printf("OK!\n\r"); @@ -65,26 +89,27 @@ int main() { } else { // read card 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) { // read data blockAddr = blockAddr - 3 ; - status = MFRC522_Read(blockAddr, str); + status = mfrc522->Read(blockAddr, str); if (status == MI_OK) { printf("Read from the card ,the data is : \n\r"); for (i=0; i<16; i++) { - printf("%c", str[i]); + printf("%x", str[i]); if(writeDate[i] != str[i]) printf("Not equal"); } printf("\n\r"); } } } - printf("\n\r"); - MFRC522_Halt(); // command card into sleeping mode + printf("\n\r\n\n\n"); + mfrc522->Halt(); // command card into sleeping mode + _delay_ms(1000); }