int MFRC522::writeToTag(byte block, byte *data) { int status, i, len; byte buffer[18]; buffer[0] = MF1_WRITE; buffer[1] = block; calculateCRC(buffer, 2, &buffer[2]); status = commandTag(MFRC522_TRANSCEIVE, buffer, 4, buffer, &len); if ((status != MI_OK) || (len != 4) || ((buffer[0] & 0x0F) != 0x0A)) { status = MI_ERR; } if (status == MI_OK) { for (i = 0; i < 16; i++) { buffer[i] = data[i]; } calculateCRC(buffer, 16, &buffer[16]); status = commandTag(MFRC522_TRANSCEIVE, buffer, 18, buffer, &len); if ((status != MI_OK) || (len != 4) || ((buffer[0] & 0x0F) != 0x0A)) { status = MI_ERR; } } return status; }
void MFRC522::haltTag() { int status, len; byte buffer[4]; buffer[0] = MF1_HALT; buffer[1] = 0; calculateCRC(buffer, 2, &buffer[2]); clearBitMask(Status2Reg, 0x08); // turn off encryption status = commandTag(MFRC522_TRANSCEIVE, buffer, 4, buffer, &len); }
int MFRC522::requestTag(byte mode, byte *data) { int status, len; writeToRegister(BitFramingReg, 0x07); // TxLastBists = BitFramingReg[2..0] data[0] = mode; status = commandTag(MFRC522_TRANSCEIVE, data, 1, data, &len); if ((status != MI_OK) || (len != 0x10)) { status = MI_ERR; } return status; }
int MFRC522::readFromTag(byte block, byte *result) { int status, len; result[0] = MF1_READ; result[1] = block; calculateCRC(result, 2, &result[2]); status = commandTag(MFRC522_TRANSCEIVE, result, 4, result, &len); if ((status != MI_OK) || (len != 0x90)) { status = MI_ERR; } return status; }
int MFRC522::authenticate(byte mode, byte block, byte *key, byte *serial) { int i, status, len; byte buffer[12]; //Verify the command block address + sector + password + tag serial number buffer[0] = mode; // 0th byte is the mode buffer[1] = block; // 1st byte is the block to address. for (i = 0; i < 6; i++) { // 2nd to 7th byte is the authentication key. buffer[i+2] = key[i]; } for (i = 0; i < 4; i++) { // 8th to 11th byte is the serial of the tag. buffer[i+8] = serial[i]; } status = commandTag(MFRC522_AUTHENT, buffer, 12, buffer, &len); if ((status != MI_OK) || (!(readFromRegister(Status2Reg) & 0x08))) { status = MI_ERR; } return status; }
byte MFRC522::selectTag(byte *serial) { int i, status, len; byte sak; byte buffer[9]; buffer[0] = MF1_SELECTTAG; buffer[1] = 0x70; for (i = 0; i < 5; i++) { buffer[i+2] = serial[i]; } calculateCRC(buffer, 7, &buffer[7]); status = commandTag(MFRC522_TRANSCEIVE, buffer, 9, buffer, &len); if ((status == MI_OK) && (len == 0x18)) { sak = buffer[0]; } else { sak = 0; } return sak; }
int MFRC522::antiCollision(byte *serial) { int status, i, len; byte check = 0x00; writeToRegister(BitFramingReg, 0x00); // TxLastBits = BitFramingReg[2..0] serial[0] = MF1_ANTICOLL; serial[1] = 0x20; status = commandTag(MFRC522_TRANSCEIVE, serial, 2, serial, &len); len = len / 8; // len is in bits, and we want each byte. if (status == MI_OK) { // The checksum of the tag is the ^ of all the values. for (i = 0; i < len-1; i++) { check ^= serial[i]; } // The checksum should be the same as the one provided from the // tag (serial[4]). if (check != serial[i]) { status = MI_ERR; } } return status; }