/****************************************************************************** * 函 数 名:write * 功能描述:写块数据 * 输入参数:blockAddr--块地址;writeData--向块写16字节数据 * 返 回 值:成功返回MI_OK ******************************************************************************/ unsigned char RFID::write(unsigned char blockAddr, unsigned char *writeData) { unsigned char status; unsigned int recvBits; unsigned char i; unsigned char buff[18]; buff[0] = PICC_WRITE; buff[1] = blockAddr; calculateCRC(buff, 2, &buff[2]); status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits); if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) status = MI_ERR; if (status == MI_OK) { for (i=0; i<16; i++) //?FIFO?16Byte?? Datos a la FIFO 16Byte escribir buff[i] = *(writeData+i); calculateCRC(buff, 16, &buff[16]); status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits); if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) status = MI_ERR; } return status; }
/* * MFRC522Write -> write * La escritura de datos de bloque * blockAddr - dirección del bloque; WriteData - para escribir 16 bytes del bloque de datos * Valor de retorno: el retorno exitoso MI_OK */ uint8_t RFID::write(uint8_t blockAddr, uint8_t *writeData) { uint8_t status; uint16_t recvBits; uint8_t i; uint8_t buff[18]; buff[0] = PICC_WRITE; buff[1] = blockAddr; calculateCRC(buff, 2, &buff[2]); status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits); if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) { status = MI_ERR; } if (status == MI_OK) { for (i=0; i<16; i++) //?FIFO?16Byte?? Datos a la FIFO 16Byte escribir { buff[i] = *(writeData+i); } calculateCRC(buff, 16, &buff[16]); status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits); if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) { status = MI_ERR; } } return status; }
/* * MFRC522Auth -> auth * Verificar la contraseña de la tarjeta * Los parámetros de entrada: AuthMode - Modo de autenticación de contraseña 0x60 = A 0x60 = validación KeyA 0x61 = B 0x61 = validación KeyB BlockAddr-- bloque de direcciones Sectorkey-- sector contraseña serNum--,4? Tarjeta de número de serie, 4 bytes * MI_OK Valor de retorno: el retorno exitoso MI_OK */ uint8_t RFID::auth(uint8_t authMode, uint8_t BlockAddr, uint8_t *Sectorkey, uint8_t *serNum) { uint8_t status; uint16_t recvBits; uint8_t i; uint8_t buff[12]; //????+???+????+???? Verifique la dirección de comandos de bloques del sector + + contraseña + número de la tarjeta de serie 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 = MFRC522ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits); if ((status != MI_OK) || (!(readMFRC522(Status2Reg) & 0x08))) { status = MI_ERR; } return status; }
/** * MFRC522Anticoll -> anticoll * Anti-detección de colisiones, la lectura del número de serie de la tarjeta de tarjeta * @param serNum - devuelve el número de tarjeta 4 bytes de serie, los primeros 5 bytes de bytes de paridad * @return retorno exitoso MI_OK */ uint8_t RFID::anticoll(uint8_t *serNum) { uint8_t status; uint8_t i; uint8_t serNumCheck=0; uint16_t unLen; //ClearBitMask(Status2Reg, 0x08); //TempSensclear //ClearBitMask(CollReg,0x80); //ValuesAfterColl writeMFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0] serNum[0] = PICC_ANTICOLL; serNum[1] = 0x20; status = MFRC522ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen); if (status == MI_OK) { //?????? Compruebe el número de serie de la tarjeta for (i=0; i<4; i++) { serNumCheck ^= serNum[i]; } if (serNumCheck != serNum[i]) { status = MI_ERR; } } //SetBitMask(CollReg, 0x80); //ValuesAfterColl=1 return status; }
/* * MFRC522Auth -> auth * Verificar la contraseña de la tarjeta * Los parámetros de entrada: AuthMode - Modo de autenticación de contraseña 0x60 = A 0x60 = validación KeyA 0x61 = B 0x61 = validación KeyB BlockAddr-- bloque de direcciones Sectorkey-- sector contraseña serNum--,4? Tarjeta de número de serie, 4 bytes * MI_OK Valor de retorno: el retorno exitoso MI_OK */ unsigned char RFID::auth(unsigned char authMode, unsigned char BlockAddr, unsigned char *Sectorkey, unsigned char *serNum) { unsigned char status; unsigned int recvBits; unsigned char i; unsigned char buff[12]; //????+???+????+???? Verifique la dirección de comandos de bloques del sector + + contraseña + número de la tarjeta de serie 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 = MFRC522ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits); if ((status != MI_OK) || (!(readMFRC522(Status2Reg) & 0x08))) { status = MI_ERR; } return status; }
/****************************************************************************** * 函 数 名:selectTag * 功能描述:选卡,读取卡存储器容量 * 输入参数:serNum--传入卡序列号 * 返 回 值:成功返回卡容量 ******************************************************************************/ unsigned char RFID::selectTag(unsigned char *serNum) { unsigned char i; unsigned char status; unsigned char size; unsigned int recvBits; unsigned char buffer[9]; //ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0 buffer[0] = PICC_SElECTTAG; buffer[1] = 0x70; for (i=0; i<5; i++) buffer[i+2] = *(serNum+i); calculateCRC(buffer, 7, &buffer[7]); status = MFRC522ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits); if ((status == MI_OK) && (recvBits == 0x18)) size = buffer[0]; else size = 0; return size; }
/****************************************************************************** * 函 数 名:anticoll * 功能描述:防冲突检测,读取选中卡片的卡序列号 * 输入参数:serNum--返回4字节卡序列号,第5字节为校验字节 * 返 回 值:成功返回MI_OK ******************************************************************************/ unsigned char RFID::anticoll(unsigned char *serNum) { unsigned char status; unsigned char i; unsigned char serNumCheck=0; unsigned int unLen; //ClearBitMask(Status2Reg, 0x08); //TempSensclear //ClearBitMask(CollReg,0x80); //ValuesAfterColl writeMFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0] serNum[0] = PICC_ANTICOLL; serNum[1] = 0x20; status = MFRC522ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen); if (status == MI_OK) { //校验卡序列号 for (i=0; i<4; i++) serNumCheck ^= serNum[i]; if (serNumCheck != serNum[i]) status = MI_ERR; } //SetBitMask(CollReg, 0x80); //ValuesAfterColl=1 return status; }
/* * MFRC522Halt -> halt * Cartas de Mando para dormir * Los parámetros de entrada: Ninguno * Valor devuelto: Ninguno */ void RFID::halt() { unsigned char status; unsigned int unLen; unsigned char buff[4]; buff[0] = PICC_HALT; buff[1] = 0; calculateCRC(buff, 2, &buff[2]); status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen); }
/* * MFRC522Halt -> halt * Cartas de Mando para dormir * Los parámetros de entrada: Ninguno * Valor devuelto: Ninguno */ void RFID::halt() { uint8_t status; uint16_t unLen; uint8_t buff[4]; buff[0] = PICC_HALT; buff[1] = 0; calculateCRC(buff, 2, &buff[2]); clearBitMask(Status2Reg, 0x08); // turn off encryption status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen); }
/****************************************************************************** * 函 数 名:read * 功能描述:读块数据 * 输入参数:blockAddr--块地址;recvData--读出的块数据 * 返 回 值:成功返回MI_OK ******************************************************************************/ unsigned char RFID::read(unsigned char blockAddr, unsigned char *recvData) { unsigned char status; unsigned int unLen; recvData[0] = PICC_READ; recvData[1] = blockAddr; calculateCRC(recvData,2, &recvData[2]); status = MFRC522ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen); if ((status != MI_OK) || (unLen != 0x90)) status = MI_ERR; return status; }
/****************************************************************************** * 函 数 名:MFRC522Request * 功能描述:寻卡,读取卡类型号 * 输入参数:reqMode--寻卡方式, * TagType--返回卡片类型 * 0x4400 = Mifare_UltraLight * 0x0400 = Mifare_One(S50) * 0x0200 = Mifare_One(S70) * 0x0800 = Mifare_Pro(X) * 0x4403 = Mifare_DESFire * 返 回 值:成功返回MI_OK ******************************************************************************/ unsigned char RFID::MFRC522Request(unsigned char reqMode, unsigned char *TagType) { unsigned char status; unsigned int backBits; //接收到的数据位数 writeMFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ??? TagType[0] = reqMode; status = MFRC522ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits); if ((status != MI_OK) || (backBits != 0x10)) status = MI_ERR; return status; }
/* * MFRC522Read -> read * Lectura de datos de bloque * Los parámetros de entrada: blockAddr - dirección del bloque; recvData - leer un bloque de datos * MI_OK Valor de retorno: el retorno exitoso MI_OK */ uint8_t RFID::read(uint8_t blockAddr, uint8_t *recvData) { uint8_t status; uint16_t unLen; recvData[0] = PICC_READ; recvData[1] = blockAddr; calculateCRC(recvData,2, &recvData[2]); status = MFRC522ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen); if ((status != MI_OK) || (unLen != 0x90)) { status = MI_ERR; } return status; }
/* * Nombre de la función: MFRC522_Request * Descripción: Buscar las cartas, leer el número de tipo de tarjeta * Los parámetros de entrada: reqMode - encontrar el modo de tarjeta, * Tagtype - Devuelve el tipo de tarjeta * 0x4400 = Mifare_UltraLight * 0x0400 = Mifare_One(S50) * 0x0200 = Mifare_One(S70) * 0x0800 = Mifare_Pro(X) * 0x4403 = Mifare_DESFire * Valor de retorno: el retorno exitoso MI_OK */ uint8_t RFID::MFRC522Request(uint8_t reqMode, uint8_t *TagType) { uint8_t status; uint16_t backBits; // Recibió bits de datos writeMFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ??? TagType[0] = reqMode; status = MFRC522ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits); if ((status != MI_OK) || (backBits != 0x10)) { status = MI_ERR; } return status; }
/****************************************************************************** * 函 数 名:auth * 功能描述:验证卡片密码 * 输入参数:authMode--密码验证模式 * 0x60 = 验证A密钥 * 0x61 = 验证B密钥 * BlockAddr--块地址 * Sectorkey--扇区密码 * serNum--卡片序列号,4字节 * 返 回 值:成功返回MI_OK ******************************************************************************/ unsigned char RFID::auth(unsigned char authMode, unsigned char BlockAddr, unsigned char *Sectorkey, unsigned char *serNum) { unsigned char status; unsigned int recvBits; unsigned char i; unsigned char 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 = MFRC522ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits); if ((status != MI_OK) || (!(readMFRC522(Status2Reg) & 0x08))) status = MI_ERR; return status; }