/* * Function name: CalulateCRC * Description: MF522 calculated CRC * Input parameters: pIndata - CRC data, len - the length of the data, pOutData - calculate CRC result to be reading * Return value: no */ void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData) { uchar i, n; ClearBitMask(DivIrqReg, 0x04); //CRCIrq = 0 SetBitMask(FIFOLevelReg, 0x80); //清FIFO指针 //Write_MFRC522(CommandReg, PCD_IDLE); // FIFO Write Data for (i=0; i<len; i++) { Write_MFRC522(FIFODataReg, *(pIndata+i)); } Write_MFRC522(CommandReg, PCD_CALCCRC); // Wait for completion of the CRC calculation i = 0xFF; do { n = Read_MFRC522(DivIrqReg); i--; } while ((i!=0) && !(n&0x04)); //CRCIrq = 1 //Read the CRC calculation result pOutData[0] = Read_MFRC522(CRCResultRegL); pOutData[1] = Read_MFRC522(CRCResultRegM); }
void CalulateCRC(uint8_t *pIndata, uint8_t len, uint8_t *pOutData) { uint8_t i, n; ClearBitMask(DivIrqReg, 0x04); //CRCIrq = 0 SetBitMask(FIFOLevelReg, 0x80); //Write_MFRC522(CommandReg, PCD_IDLE); for (i=0; i<len; i++) { Write_MFRC522(FIFODataReg, *(pIndata+i)); } Write_MFRC522(CommandReg, PCD_CALCCRC); i = 0xFF; do { n = Read_MFRC522(DivIrqReg); i--; } while ((i!=0) && !(n&0x04)); //CRCIrq = 1 pOutData[0] = Read_MFRC522(CRCResultRegL); pOutData[1] = Read_MFRC522(CRCResultRegM); }
uchar RFID::MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum) { uchar status; uint recvBits; uchar i; uchar buff[12]; //????+???+????+???? buff[0] = authMode; buff[1] = BlockAddr; for (i=0; i<6; i++) { buff[i+2] = *(Sectorkey+i); } for (i=0; i<4; i++) { buff[i+8] = *(serNum+i); } status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits); if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08))) { status = MI_ERR; } return status; }
/* * Function name: MFRC522_Auth * Description: Verify card password * Input: authMode - password authentication mode 0x60 = Verify A key 0x61 = B key validation BlockAddr - block address Sectorkey - Sector password serNum - card serial number, 4 bytes * Return value: the successful return MI_OK */ uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum) { uchar status; uint recvBits; uchar i; uchar buff[12]; // Verify command + block address + sectors password + card serial number buff[0] = authMode; buff[1] = BlockAddr; for (i=0; i<6; i++) { buff[i+2] = *(Sectorkey+i); } for (i=0; i<4; i++) { buff[i+8] = *(serNum+i); } status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits); if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08))) { status = MI_ERR; } return status; }
uint8_t MFRC522_Auth(uint8_t authMode, uint8_t BlockAddr, uint8_t *Sectorkey, uint8_t *serNum) { uint8_t status; uint32_t recvBits; uint8_t i; uint8_t buff[12]; buff[0] = authMode; buff[1] = BlockAddr; for (i=0; i<6; i++) { buff[i+2] = *(Sectorkey+i); } for (i=0; i<4; i++) { buff[i+8] = *(serNum+i); } status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits); if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08))) { status = MI_ERR; } return status; }
void RFID::AntennaOn(void) { uchar temp; temp = Read_MFRC522(TxControlReg); if (!(temp & 0x03)) { SetBitMask(TxControlReg, 0x03); } }
void AntennaOn(void) { uint8_t temp; temp = Read_MFRC522(TxControlReg); if (!(temp & 0x03)) { SetBitMask(TxControlReg, 0x03); } }
uchar RFID::MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen) { uchar status = MI_ERR; uchar irqEn = 0x00; uchar waitIRq = 0x00; uchar lastBits; uchar n; uint i; switch (command) { case PCD_AUTHENT: //???? { irqEn = 0x12; waitIRq = 0x10; break; } case PCD_TRANSCEIVE: //??FIFO??? { irqEn = 0x77; waitIRq = 0x30; break; } default: break; } Write_MFRC522(CommIEnReg, irqEn|0x80); //?????? ClearBitMask(CommIrqReg, 0x80); //????????? SetBitMask(FIFOLevelReg, 0x80); //FlushBuffer=1, FIFO??? Write_MFRC522(CommandReg, PCD_IDLE); //NO action;?????? ??? //?FIFO????? for (i=0; i<sendLen; i++) { Write_MFRC522(FIFODataReg, sendData[i]); } //???? Write_MFRC522(CommandReg, command); if (command == PCD_TRANSCEIVE) { SetBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts } //???????? i = 2000; //i????????,??M1???????25ms ??? do { //CommIrqReg[7..0] //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq n = Read_MFRC522(CommIrqReg); i--; } while ((i!=0) && !(n&0x01) && !(n&waitIRq)); ClearBitMask(BitFramingReg, 0x80); //StartSend=0 if (i != 0) { if(!(Read_MFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr { status = MI_OK; if (n & irqEn & 0x01) { status = MI_NOTAGERR; //?? } if (command == PCD_TRANSCEIVE) { n = Read_MFRC522(FIFOLevelReg); lastBits = Read_MFRC522(ControlReg) & 0x07; if (lastBits) { *backLen = (n-1)*8 + lastBits; } else { *backLen = n*8; } if (n == 0) { n = 1; } if (n > MAX_LEN) { n = MAX_LEN; } //??FIFO??????? for (i=0; i<n; i++) { backData[i] = Read_MFRC522(FIFODataReg); } } } else { status = MI_ERR; } } //SetBitMask(ControlReg,0x80); //timer stops //Write_MFRC522(CommandReg, PCD_IDLE); return status; }
void RFID::ClearBitMask(uchar reg, uchar mask) { uchar tmp; tmp = Read_MFRC522(reg); Write_MFRC522(reg, tmp & (~mask)); }
void RFID::SetBitMask(uchar reg, uchar mask) { uchar tmp; tmp = Read_MFRC522(reg); Write_MFRC522(reg, tmp | mask); // set bit mask }
void ClearBitMask(uchar reg, uchar mask) { uchar tmp; tmp = Read_MFRC522(reg); Write_MFRC522(reg, tmp & (~mask)); // clear bit mask }
/* * Function name: MFRC522_ToCard * Description: RC522 and ISO14443 card communication * Input Parameters: command - MF522 command word, * SendData - RC522 sent to the card data, * SendLen - length of data sent * BackData - received the card data is returned, * BackLen - returns the bit length of the data * Return value: the successful return MI_OK */ unsigned char MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen) { uchar status = MI_ERR; uchar irqEn = 0x00; uchar waitIRq = 0x00; uchar lastBits; uchar n; uint i; switch (command) { case PCD_AUTHENT: //Certification card secret { irqEn = 0x12; waitIRq = 0x10; break; } case PCD_TRANSCEIVE: //Transmit FIFO data { irqEn = 0x77; waitIRq = 0x30; break; } default: break; } Write_MFRC522(CommIEnReg, irqEn|0x80); //Interrupt request ClearBitMask(CommIrqReg, 0x80); //Clear all interrupt request bit SetBitMask(FIFOLevelReg, 0x80); //FlushBuffer=1, FIFO Initialization Write_MFRC522(CommandReg, PCD_IDLE); //NO action ??? !!! ATENTION //Data is written to the FIFO for (i=0; i<sendLen; i++) { Write_MFRC522(FIFODataReg, sendData[i]); } //Execute command Write_MFRC522(CommandReg, command); if (command == PCD_TRANSCEIVE) { SetBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts } //Waiting to receive data to complete i = 2000; // i clock frequency adjustment, operating maximum wait time of 25ms ??? do { //CommIrqReg[7..0] //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq n = Read_MFRC522(CommIrqReg); i--; } while ((i!=0) && !(n&0x01) && !(n&waitIRq)); ClearBitMask(BitFramingReg, 0x80); //StartSend=0 if (i != 0) { if(!(Read_MFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr { status = MI_OK; if (n & irqEn & 0x01){ status = MI_NOTAGERR; //?? } if (command == PCD_TRANSCEIVE){ n = Read_MFRC522(FIFOLevelReg); lastBits = Read_MFRC522(ControlReg) & 0x07; if (lastBits){ *backLen = (n-1)*8 + lastBits; } else{ *backLen = n*8; } if (n == 0){ n = 1; } if (n > MAX_LEN){ n = MAX_LEN; } // Read the FIFO data received for (i=0; i<n; i++){ backData[i] = Read_MFRC522(FIFODataReg); } } } else{ status = MI_ERR; } } //SetBitMask(ControlReg,0x80); //timer stops //Write_MFRC522(CommandReg, PCD_IDLE); return status; }
void main(void) { unsigned char i=0; unsigned char status; unsigned char str[MAX_LEN]; unsigned char RC_size; unsigned char blockAddr; unsigned char mynum[20]; unsigned char serNum[7]; uint8_t RCV; int resulta=0; int fd; int a=0; fd=Init_SPI("/dev/spidev0.0"); setup_io(); SET_INPUT(25); SET_OUTPUT(25); ApiInit(fd); MFRC522_Init(); a=Read_MFRC522(VersionReg); printf("MFRC Version Read %02X \r\n",a); // for(a=0;a<10;a++) // { // RCV=Read_MFRC522(VersionReg); // //RCV=SPI_transfer(fd,a); // printf("RCV %02X \r\n",RCV); // SET_BIT(25); // sleep(1); // CLR_BIT(25); // sleep(1); // } while(1) { status = MFRC522_Request(PICC_REQIDL, str); if(resulta==status){ }else{ resulta=status; } if (status == MI_OK) { mifare_tag_type(str); //usleep(1000); } status = MFRC522_Anticoll(str); memcpy(serNum, str,5); if (status == MI_OK) { printf("UID :"); for(i=0;i<5;i++) { printf("["); printf("%02X",serNum[i]); printf("]"); } printf("\n"); //usleep(1000); } RC_size=MFRC522_SelectTag(serNum); if(RC_size !=0) { printf("Select_OK Size %02d \n",RC_size); puts(""); puts(""); } } close(fd); }
void ClearBitMask(uint8_t reg, uint8_t mask) { uint8_t tmp; tmp = Read_MFRC522(reg); Write_MFRC522(reg, tmp & (~mask)); // clear bit mask }
void SetBitMask(uint8_t reg, uint8_t mask) { uint8_t tmp; tmp = Read_MFRC522(reg); Write_MFRC522(reg, tmp | mask); // set bit mask }