/****************************************************************************** * Includes ******************************************************************************/ #include "rfid.h" //=================================================================================== void RFID_powerOn(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1); // SPI DISABLE HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, 1); // POWERDOWN OFF } //=================================================================================== bool RFID_isCard() { uint8_t status; uint8_t str[MAX_LEN]; status = RFID_MFRC522Request(PICC_REQIDL, str); if (status == MI_OK) { return true; } else { return false;} } //=================================================================================== bool RFID_readCardSerial(){ uint8_t status; uint8_t str[MAX_LEN]; // Anti-collision, return card serial number 4 bytes status = RFID_anticoll(str); memcpy(serNum, str, 5); if (status == MI_OK) { return true; } else { return false;} } //=================================================================================== void RFID_init() { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, 1); RFID_reset(); //Timer: TPrescaler*TreloadVal/6.78MHz = 24ms RFID_writeMFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler RFID_writeMFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg RFID_writeMFRC522(TReloadRegL, 30); RFID_writeMFRC522(TReloadRegH, 0); RFID_writeMFRC522(TxAutoReg, 0x40); //100%ASK RFID_writeMFRC522(ModeReg, 0x3D); // CRC initial value : 0x6363 //RFID_clearBitMask(Status2Reg, 0x08); //MFCrypto1On=0 //RFID_writeMFRC522(RxSelReg, 0x86); //RxWait = RxSelReg[5..0] //RFID_writeMFRC522(RFCfgReg, 0x7F); //RxGain = 48dB RFID_antennaOn(); } //=================================================================================== void RFID_reset() { RFID_writeMFRC522(CommandReg, PCD_RESETPHASE); } //=================================================================================== void RFID_writeMFRC522(uint8_t addr, uint8_t val) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0); spi1Transfer((addr<<1)&0x7E); // Address Format :0XXXXXX0 spi1Transfer(val); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1); } //=================================================================================== void RFID_antennaOn(void) { uint8_t temp; temp = RFID_readMFRC522(TxControlReg); if (!(temp & 0x03)) { RFID_setBitMask(TxControlReg, 0x03); } } //=================================================================================== uint8_t RFID_readMFRC522(uint8_t addr) { uint8_t val; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0); spi1Transfer(((addr<<1)&0x7E) | 0x80); // Address Format :1XXXXXX0 val = spi1Transfer(0x00); // push ('write to read') HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1); return val; } //=================================================================================== void RFID_setBitMask(uint8_t reg, uint8_t mask) { uint8_t tmp; tmp = RFID_readMFRC522(reg); RFID_writeMFRC522(reg, tmp | mask); // set bit mask } //=================================================================================== void RFID_clearBitMask(uint8_t reg, uint8_t mask) { uint8_t tmp; tmp = RFID_readMFRC522(reg); RFID_writeMFRC522(reg, tmp & (~mask)); // clear bit mask } //=================================================================================== /* * Function Name : CalulateCRC * Description: CRC calculation with MF522 * Input parameters : pIndata - To read the CRC data , len - the data length , pOutData - CRC calculation results * Return value: None */ void RFID_calculateCRC(uint8_t *pIndata, uint8_t len, uint8_t *pOutData) { uint8_t i, n; RFID_clearBitMask(DivIrqReg, 0x04); //CRCIrq = 0 RFID_setBitMask(FIFOLevelReg, 0x80); // FIFO //Write_MFRC522(CommandReg, PCD_IDLE); // Write data to the FIFO for (i=0; i cancel the current command // Write data to the FIFO for (i=0; i MAX_LEN) { n = MAX_LEN; } // Read the received data in FIFO for (i=0; i