forked from semaf/MFRC522_I2C_Library
Removed Arduino.h header dependency
This commit is contained in:
379
MFRC522_I2C.cpp
379
MFRC522_I2C.cpp
@@ -6,8 +6,9 @@
|
|||||||
* Author: arozcan @ https://github.com/arozcan/MFRC522-I2C-Library
|
* Author: arozcan @ https://github.com/arozcan/MFRC522-I2C-Library
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <MFRC522_I2C.h>
|
#include <MFRC522_I2C.h>
|
||||||
|
|
||||||
|
#include <HardwareSerial.h>
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -18,8 +19,8 @@
|
|||||||
* Constructor.
|
* Constructor.
|
||||||
* Prepares the output pins.
|
* Prepares the output pins.
|
||||||
*/
|
*/
|
||||||
MFRC522::MFRC522( byte chipAddress,
|
MFRC522::MFRC522( uint8_t chipAddress,
|
||||||
byte resetPowerDownPin ///< Arduino pin connected to MFRC522's reset and power down input (Pin 6, NRSTPD, active low)
|
uint8_t resetPowerDownPin ///< Arduino pin connected to MFRC522's reset and power down input (Pin 6, NRSTPD, active low)
|
||||||
) {
|
) {
|
||||||
_chipAddress = chipAddress;
|
_chipAddress = chipAddress;
|
||||||
_resetPowerDownPin = resetPowerDownPin;
|
_resetPowerDownPin = resetPowerDownPin;
|
||||||
@@ -34,8 +35,8 @@ MFRC522::MFRC522( byte chipAddress,
|
|||||||
* Writes a byte to the specified register in the MFRC522 chip.
|
* Writes a byte to the specified register in the MFRC522 chip.
|
||||||
* The interface is described in the datasheet section 8.1.2.
|
* The interface is described in the datasheet section 8.1.2.
|
||||||
*/
|
*/
|
||||||
void MFRC522::PCD_WriteRegister( byte reg, ///< The register to write to. One of the PCD_Register enums.
|
void MFRC522::PCD_WriteRegister( uint8_t reg, ///< The register to write to. One of the PCD_Register enums.
|
||||||
byte value ///< The value to write.
|
uint8_t value ///< The value to write.
|
||||||
) {
|
) {
|
||||||
Wire.beginTransmission(_chipAddress);
|
Wire.beginTransmission(_chipAddress);
|
||||||
Wire.write(reg);
|
Wire.write(reg);
|
||||||
@@ -47,13 +48,13 @@ void MFRC522::PCD_WriteRegister( byte reg, ///< The register to write to. One o
|
|||||||
* Writes a number of bytes to the specified register in the MFRC522 chip.
|
* Writes a number of bytes to the specified register in the MFRC522 chip.
|
||||||
* The interface is described in the datasheet section 8.1.2.
|
* The interface is described in the datasheet section 8.1.2.
|
||||||
*/
|
*/
|
||||||
void MFRC522::PCD_WriteRegister( byte reg, ///< The register to write to. One of the PCD_Register enums.
|
void MFRC522::PCD_WriteRegister( uint8_t reg, ///< The register to write to. One of the PCD_Register enums.
|
||||||
byte count, ///< The number of bytes to write to the register
|
uint8_t count, ///< The number of bytes to write to the register
|
||||||
byte *values ///< The values to write. Byte array.
|
uint8_t *values ///< The values to write. Byte array.
|
||||||
) {
|
) {
|
||||||
Wire.beginTransmission(_chipAddress);
|
Wire.beginTransmission(_chipAddress);
|
||||||
Wire.write(reg);
|
Wire.write(reg);
|
||||||
for (byte index = 0; index < count; index++) {
|
for (uint8_t index = 0; index < count; index++) {
|
||||||
Wire.write(values[index]);
|
Wire.write(values[index]);
|
||||||
}
|
}
|
||||||
Wire.endTransmission();
|
Wire.endTransmission();
|
||||||
@@ -63,9 +64,9 @@ void MFRC522::PCD_WriteRegister( byte reg, ///< The register to write to. One o
|
|||||||
* Reads a byte from the specified register in the MFRC522 chip.
|
* Reads a byte from the specified register in the MFRC522 chip.
|
||||||
* The interface is described in the datasheet section 8.1.2.
|
* The interface is described in the datasheet section 8.1.2.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PCD_ReadRegister( byte reg ///< The register to read from. One of the PCD_Register enums.
|
uint8_t MFRC522::PCD_ReadRegister( uint8_t reg ///< The register to read from. One of the PCD_Register enums.
|
||||||
) {
|
) {
|
||||||
byte value;
|
uint8_t value;
|
||||||
//digitalWrite(_chipSelectPin, LOW); // Select slave
|
//digitalWrite(_chipSelectPin, LOW); // Select slave
|
||||||
Wire.beginTransmission(_chipAddress);
|
Wire.beginTransmission(_chipAddress);
|
||||||
Wire.write(reg);
|
Wire.write(reg);
|
||||||
@@ -80,16 +81,16 @@ byte MFRC522::PCD_ReadRegister( byte reg ///< The register to read from. One of
|
|||||||
* Reads a number of bytes from the specified register in the MFRC522 chip.
|
* Reads a number of bytes from the specified register in the MFRC522 chip.
|
||||||
* The interface is described in the datasheet section 8.1.2.
|
* The interface is described in the datasheet section 8.1.2.
|
||||||
*/
|
*/
|
||||||
void MFRC522::PCD_ReadRegister( byte reg, ///< The register to read from. One of the PCD_Register enums.
|
void MFRC522::PCD_ReadRegister( uint8_t reg, ///< The register to read from. One of the PCD_Register enums.
|
||||||
byte count, ///< The number of bytes to read
|
uint8_t count, ///< The number of bytes to read
|
||||||
byte *values, ///< Byte array to store the values in.
|
uint8_t *values, ///< Byte array to store the values in.
|
||||||
byte rxAlign ///< Only bit positions rxAlign..7 in values[0] are updated.
|
uint8_t rxAlign ///< Only bit positions rxAlign..7 in values[0] are updated.
|
||||||
) {
|
) {
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
byte address = reg;
|
uint8_t address = reg;
|
||||||
byte index = 0; // Index in values array.
|
uint8_t index = 0; // Index in values array.
|
||||||
Wire.beginTransmission(_chipAddress);
|
Wire.beginTransmission(_chipAddress);
|
||||||
Wire.write(address);
|
Wire.write(address);
|
||||||
Wire.endTransmission();
|
Wire.endTransmission();
|
||||||
@@ -97,12 +98,12 @@ void MFRC522::PCD_ReadRegister( byte reg, ///< The register to read from. One o
|
|||||||
while (Wire.available()) {
|
while (Wire.available()) {
|
||||||
if (index == 0 && rxAlign) { // Only update bit positions rxAlign..7 in values[0]
|
if (index == 0 && rxAlign) { // Only update bit positions rxAlign..7 in values[0]
|
||||||
// Create bit mask for bit positions rxAlign..7
|
// Create bit mask for bit positions rxAlign..7
|
||||||
byte mask = 0;
|
uint8_t mask = 0;
|
||||||
for (byte i = rxAlign; i <= 7; i++) {
|
for (uint8_t i = rxAlign; i <= 7; i++) {
|
||||||
mask |= (1 << i);
|
mask |= (1 << i);
|
||||||
}
|
}
|
||||||
// Read value and tell that we want to read the same address again.
|
// Read value and tell that we want to read the same address again.
|
||||||
byte value = Wire.read();
|
uint8_t value = Wire.read();
|
||||||
// Apply mask to both current value of values[0] and the new data in value.
|
// Apply mask to both current value of values[0] and the new data in value.
|
||||||
values[0] = (values[index] & ~mask) | (value & mask);
|
values[0] = (values[index] & ~mask) | (value & mask);
|
||||||
}
|
}
|
||||||
@@ -116,10 +117,10 @@ void MFRC522::PCD_ReadRegister( byte reg, ///< The register to read from. One o
|
|||||||
/**
|
/**
|
||||||
* Sets the bits given in mask in register reg.
|
* Sets the bits given in mask in register reg.
|
||||||
*/
|
*/
|
||||||
void MFRC522::PCD_SetRegisterBitMask( byte reg, ///< The register to update. One of the PCD_Register enums.
|
void MFRC522::PCD_SetRegisterBitMask( uint8_t reg, ///< The register to update. One of the PCD_Register enums.
|
||||||
byte mask ///< The bits to set.
|
uint8_t mask ///< The bits to set.
|
||||||
) {
|
) {
|
||||||
byte tmp;
|
uint8_t tmp;
|
||||||
tmp = PCD_ReadRegister(reg);
|
tmp = PCD_ReadRegister(reg);
|
||||||
PCD_WriteRegister(reg, tmp | mask); // set bit mask
|
PCD_WriteRegister(reg, tmp | mask); // set bit mask
|
||||||
} // End PCD_SetRegisterBitMask()
|
} // End PCD_SetRegisterBitMask()
|
||||||
@@ -127,10 +128,10 @@ void MFRC522::PCD_SetRegisterBitMask( byte reg, ///< The register to update. One
|
|||||||
/**
|
/**
|
||||||
* Clears the bits given in mask from register reg.
|
* Clears the bits given in mask from register reg.
|
||||||
*/
|
*/
|
||||||
void MFRC522::PCD_ClearRegisterBitMask( byte reg, ///< The register to update. One of the PCD_Register enums.
|
void MFRC522::PCD_ClearRegisterBitMask( uint8_t reg, ///< The register to update. One of the PCD_Register enums.
|
||||||
byte mask ///< The bits to clear.
|
uint8_t mask ///< The bits to clear.
|
||||||
) {
|
) {
|
||||||
byte tmp;
|
uint8_t tmp;
|
||||||
tmp = PCD_ReadRegister(reg);
|
tmp = PCD_ReadRegister(reg);
|
||||||
PCD_WriteRegister(reg, tmp & (~mask)); // clear bit mask
|
PCD_WriteRegister(reg, tmp & (~mask)); // clear bit mask
|
||||||
} // End PCD_ClearRegisterBitMask()
|
} // End PCD_ClearRegisterBitMask()
|
||||||
@@ -141,9 +142,9 @@ void MFRC522::PCD_ClearRegisterBitMask( byte reg, ///< The register to update. O
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PCD_CalculateCRC( byte *data, ///< In: Pointer to the data to transfer to the FIFO for CRC calculation.
|
uint8_t MFRC522::PCD_CalculateCRC( uint8_t *data, ///< In: Pointer to the data to transfer to the FIFO for CRC calculation.
|
||||||
byte length, ///< In: The number of bytes to transfer.
|
uint8_t length, ///< In: The number of bytes to transfer.
|
||||||
byte *result ///< Out: Pointer to result buffer. Result is written to result[0..1], low byte first.
|
uint8_t *result ///< Out: Pointer to result buffer. Result is written to result[0..1], low byte first.
|
||||||
) {
|
) {
|
||||||
PCD_WriteRegister(CommandReg, PCD_Idle); // Stop any active command.
|
PCD_WriteRegister(CommandReg, PCD_Idle); // Stop any active command.
|
||||||
PCD_WriteRegister(DivIrqReg, 0x04); // Clear the CRCIRq interrupt request bit
|
PCD_WriteRegister(DivIrqReg, 0x04); // Clear the CRCIRq interrupt request bit
|
||||||
@@ -152,8 +153,8 @@ byte MFRC522::PCD_CalculateCRC( byte *data, ///< In: Pointer to the data to tra
|
|||||||
PCD_WriteRegister(CommandReg, PCD_CalcCRC); // Start the calculation
|
PCD_WriteRegister(CommandReg, PCD_CalcCRC); // Start the calculation
|
||||||
|
|
||||||
// Wait for the CRC calculation to complete. Each iteration of the while-loop takes 17.73<EFBFBD>s.
|
// Wait for the CRC calculation to complete. Each iteration of the while-loop takes 17.73<EFBFBD>s.
|
||||||
word i = 5000;
|
unsigned int i = 5000;
|
||||||
byte n;
|
uint8_t n;
|
||||||
while (1) {
|
while (1) {
|
||||||
n = PCD_ReadRegister(DivIrqReg); // DivIrqReg[7..0] bits are: Set2 reserved reserved MfinActIRq reserved CRCIRq reserved reserved
|
n = PCD_ReadRegister(DivIrqReg); // DivIrqReg[7..0] bits are: Set2 reserved reserved MfinActIRq reserved CRCIRq reserved reserved
|
||||||
if (n & 0x04) { // CRCIRq bit set - calculation done
|
if (n & 0x04) { // CRCIRq bit set - calculation done
|
||||||
@@ -228,7 +229,7 @@ void MFRC522::PCD_Reset() {
|
|||||||
* After a reset these pins are disabled.
|
* After a reset these pins are disabled.
|
||||||
*/
|
*/
|
||||||
void MFRC522::PCD_AntennaOn() {
|
void MFRC522::PCD_AntennaOn() {
|
||||||
byte value = PCD_ReadRegister(TxControlReg);
|
uint8_t value = PCD_ReadRegister(TxControlReg);
|
||||||
if ((value & 0x03) != 0x03) {
|
if ((value & 0x03) != 0x03) {
|
||||||
PCD_WriteRegister(TxControlReg, value | 0x03);
|
PCD_WriteRegister(TxControlReg, value | 0x03);
|
||||||
}
|
}
|
||||||
@@ -248,7 +249,7 @@ void MFRC522::PCD_AntennaOff() {
|
|||||||
*
|
*
|
||||||
* @return Value of the RxGain, scrubbed to the 3 bits used.
|
* @return Value of the RxGain, scrubbed to the 3 bits used.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PCD_GetAntennaGain() {
|
uint8_t MFRC522::PCD_GetAntennaGain() {
|
||||||
return PCD_ReadRegister(RFCfgReg) & (0x07<<4);
|
return PCD_ReadRegister(RFCfgReg) & (0x07<<4);
|
||||||
} // End PCD_GetAntennaGain()
|
} // End PCD_GetAntennaGain()
|
||||||
|
|
||||||
@@ -257,7 +258,7 @@ byte MFRC522::PCD_GetAntennaGain() {
|
|||||||
* See 9.3.3.6 / table 98 in http://www.nxp.com/documents/data_sheet/MFRC522.pdf
|
* See 9.3.3.6 / table 98 in http://www.nxp.com/documents/data_sheet/MFRC522.pdf
|
||||||
* NOTE: Given mask is scrubbed with (0x07<<4)=01110000b as RCFfgReg may use reserved bits.
|
* NOTE: Given mask is scrubbed with (0x07<<4)=01110000b as RCFfgReg may use reserved bits.
|
||||||
*/
|
*/
|
||||||
void MFRC522::PCD_SetAntennaGain(byte mask) {
|
void MFRC522::PCD_SetAntennaGain(uint8_t mask) {
|
||||||
if (PCD_GetAntennaGain() != mask) { // only bother if there is a change
|
if (PCD_GetAntennaGain() != mask) { // only bother if there is a change
|
||||||
PCD_ClearRegisterBitMask(RFCfgReg, (0x07<<4)); // clear needed to allow 000 pattern
|
PCD_ClearRegisterBitMask(RFCfgReg, (0x07<<4)); // clear needed to allow 000 pattern
|
||||||
PCD_SetRegisterBitMask(RFCfgReg, mask & (0x07<<4)); // only set RxGain[2:0] bits
|
PCD_SetRegisterBitMask(RFCfgReg, mask & (0x07<<4)); // only set RxGain[2:0] bits
|
||||||
@@ -276,7 +277,7 @@ bool MFRC522::PCD_PerformSelfTest() {
|
|||||||
PCD_Reset();
|
PCD_Reset();
|
||||||
|
|
||||||
// 2. Clear the internal buffer by writing 25 bytes of 00h
|
// 2. Clear the internal buffer by writing 25 bytes of 00h
|
||||||
byte ZEROES[25] = {0x00};
|
uint8_t ZEROES[25] = {0x00};
|
||||||
PCD_SetRegisterBitMask(FIFOLevelReg, 0x80); // flush the FIFO buffer
|
PCD_SetRegisterBitMask(FIFOLevelReg, 0x80); // flush the FIFO buffer
|
||||||
PCD_WriteRegister(FIFODataReg, 25, ZEROES); // write 25 bytes of 00h to FIFO
|
PCD_WriteRegister(FIFODataReg, 25, ZEROES); // write 25 bytes of 00h to FIFO
|
||||||
PCD_WriteRegister(CommandReg, PCD_Mem); // transfer to internal buffer
|
PCD_WriteRegister(CommandReg, PCD_Mem); // transfer to internal buffer
|
||||||
@@ -291,8 +292,8 @@ bool MFRC522::PCD_PerformSelfTest() {
|
|||||||
PCD_WriteRegister(CommandReg, PCD_CalcCRC);
|
PCD_WriteRegister(CommandReg, PCD_CalcCRC);
|
||||||
|
|
||||||
// 6. Wait for self-test to complete
|
// 6. Wait for self-test to complete
|
||||||
word i;
|
unsigned int i;
|
||||||
byte n;
|
uint8_t n;
|
||||||
for (i = 0; i < 0xFF; i++) {
|
for (i = 0; i < 0xFF; i++) {
|
||||||
n = PCD_ReadRegister(DivIrqReg); // DivIrqReg[7..0] bits are: Set2 reserved reserved MfinActIRq reserved CRCIRq reserved reserved
|
n = PCD_ReadRegister(DivIrqReg); // DivIrqReg[7..0] bits are: Set2 reserved reserved MfinActIRq reserved CRCIRq reserved reserved
|
||||||
if (n & 0x04) { // CRCIRq bit set - calculation done
|
if (n & 0x04) { // CRCIRq bit set - calculation done
|
||||||
@@ -302,7 +303,7 @@ bool MFRC522::PCD_PerformSelfTest() {
|
|||||||
PCD_WriteRegister(CommandReg, PCD_Idle); // Stop calculating CRC for new content in the FIFO.
|
PCD_WriteRegister(CommandReg, PCD_Idle); // Stop calculating CRC for new content in the FIFO.
|
||||||
|
|
||||||
// 7. Read out resulting 64 bytes from the FIFO buffer.
|
// 7. Read out resulting 64 bytes from the FIFO buffer.
|
||||||
byte result[64];
|
uint8_t result[64];
|
||||||
PCD_ReadRegister(FIFODataReg, 64, result, 0);
|
PCD_ReadRegister(FIFODataReg, 64, result, 0);
|
||||||
|
|
||||||
// Auto self-test done
|
// Auto self-test done
|
||||||
@@ -310,10 +311,10 @@ bool MFRC522::PCD_PerformSelfTest() {
|
|||||||
PCD_WriteRegister(AutoTestReg, 0x00);
|
PCD_WriteRegister(AutoTestReg, 0x00);
|
||||||
|
|
||||||
// Determine firmware version (see section 9.3.4.8 in spec)
|
// Determine firmware version (see section 9.3.4.8 in spec)
|
||||||
byte version = PCD_ReadRegister(VersionReg);
|
uint8_t version = PCD_ReadRegister(VersionReg);
|
||||||
|
|
||||||
// Pick the appropriate reference values
|
// Pick the appropriate reference values
|
||||||
const byte *reference;
|
const uint8_t *reference;
|
||||||
switch (version) {
|
switch (version) {
|
||||||
case 0x88: // Fudan Semiconductor FM17522 clone
|
case 0x88: // Fudan Semiconductor FM17522 clone
|
||||||
reference = FM17522_firmware_reference;
|
reference = FM17522_firmware_reference;
|
||||||
@@ -352,15 +353,15 @@ bool MFRC522::PCD_PerformSelfTest() {
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PCD_TransceiveData( byte *sendData, ///< Pointer to the data to transfer to the FIFO.
|
uint8_t MFRC522::PCD_TransceiveData( uint8_t *sendData, ///< Pointer to the data to transfer to the FIFO.
|
||||||
byte sendLen, ///< Number of bytes to transfer to the FIFO.
|
uint8_t sendLen, ///< Number of bytes to transfer to the FIFO.
|
||||||
byte *backData, ///< NULL or pointer to buffer if data should be read back after executing the command.
|
uint8_t *backData, ///< NULL or pointer to buffer if data should be read back after executing the command.
|
||||||
byte *backLen, ///< In: Max number of bytes to write to *backData. Out: The number of bytes returned.
|
uint8_t *backLen, ///< In: Max number of bytes to write to *backData. Out: The number of bytes returned.
|
||||||
byte *validBits, ///< In/Out: The number of valid bits in the last byte. 0 for 8 valid bits. Default NULL.
|
uint8_t *validBits, ///< In/Out: The number of valid bits in the last byte. 0 for 8 valid bits. Default NULL.
|
||||||
byte rxAlign, ///< In: Defines the bit position in backData[0] for the first bit received. Default 0.
|
uint8_t rxAlign, ///< In: Defines the bit position in backData[0] for the first bit received. Default 0.
|
||||||
bool checkCRC ///< In: True => The last two bytes of the response is assumed to be a CRC_A that must be validated.
|
bool checkCRC ///< In: True => The last two bytes of the response is assumed to be a CRC_A that must be validated.
|
||||||
) {
|
) {
|
||||||
byte waitIRq = 0x30; // RxIRq and IdleIRq
|
uint8_t waitIRq = 0x30; // RxIRq and IdleIRq
|
||||||
return PCD_CommunicateWithPICC(PCD_Transceive, waitIRq, sendData, sendLen, backData, backLen, validBits, rxAlign, checkCRC);
|
return PCD_CommunicateWithPICC(PCD_Transceive, waitIRq, sendData, sendLen, backData, backLen, validBits, rxAlign, checkCRC);
|
||||||
} // End PCD_TransceiveData()
|
} // End PCD_TransceiveData()
|
||||||
|
|
||||||
@@ -370,22 +371,22 @@ byte MFRC522::PCD_TransceiveData( byte *sendData, ///< Pointer to the data to t
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PCD_CommunicateWithPICC( byte command, ///< The command to execute. One of the PCD_Command enums.
|
uint8_t MFRC522::PCD_CommunicateWithPICC( uint8_t command, ///< The command to execute. One of the PCD_Command enums.
|
||||||
byte waitIRq, ///< The bits in the ComIrqReg register that signals successful completion of the command.
|
uint8_t waitIRq, ///< The bits in the ComIrqReg register that signals successful completion of the command.
|
||||||
byte *sendData, ///< Pointer to the data to transfer to the FIFO.
|
uint8_t *sendData, ///< Pointer to the data to transfer to the FIFO.
|
||||||
byte sendLen, ///< Number of bytes to transfer to the FIFO.
|
uint8_t sendLen, ///< Number of bytes to transfer to the FIFO.
|
||||||
byte *backData, ///< NULL or pointer to buffer if data should be read back after executing the command.
|
uint8_t *backData, ///< NULL or pointer to buffer if data should be read back after executing the command.
|
||||||
byte *backLen, ///< In: Max number of bytes to write to *backData. Out: The number of bytes returned.
|
uint8_t *backLen, ///< In: Max number of bytes to write to *backData. Out: The number of bytes returned.
|
||||||
byte *validBits, ///< In/Out: The number of valid bits in the last byte. 0 for 8 valid bits.
|
uint8_t *validBits, ///< In/Out: The number of valid bits in the last byte. 0 for 8 valid bits.
|
||||||
byte rxAlign, ///< In: Defines the bit position in backData[0] for the first bit received. Default 0.
|
uint8_t rxAlign, ///< In: Defines the bit position in backData[0] for the first bit received. Default 0.
|
||||||
bool checkCRC ///< In: True => The last two bytes of the response is assumed to be a CRC_A that must be validated.
|
bool checkCRC ///< In: True => The last two bytes of the response is assumed to be a CRC_A that must be validated.
|
||||||
) {
|
) {
|
||||||
byte n, _validBits;
|
uint8_t n, _validBits;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
// Prepare values for BitFramingReg
|
// Prepare values for BitFramingReg
|
||||||
byte txLastBits = validBits ? *validBits : 0;
|
uint8_t txLastBits = validBits ? *validBits : 0;
|
||||||
byte bitFraming = (rxAlign << 4) + txLastBits; // RxAlign = BitFramingReg[6..4]. TxLastBits = BitFramingReg[2..0]
|
uint8_t bitFraming = (rxAlign << 4) + txLastBits; // RxAlign = BitFramingReg[6..4]. TxLastBits = BitFramingReg[2..0]
|
||||||
|
|
||||||
PCD_WriteRegister(CommandReg, PCD_Idle); // Stop any active command.
|
PCD_WriteRegister(CommandReg, PCD_Idle); // Stop any active command.
|
||||||
PCD_WriteRegister(ComIrqReg, 0x7F); // Clear all seven interrupt request bits
|
PCD_WriteRegister(ComIrqReg, 0x7F); // Clear all seven interrupt request bits
|
||||||
@@ -415,7 +416,7 @@ byte MFRC522::PCD_CommunicateWithPICC( byte command, ///< The command to execut
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Stop now if any errors except collisions were detected.
|
// Stop now if any errors except collisions were detected.
|
||||||
byte errorRegValue = PCD_ReadRegister(ErrorReg); // ErrorReg[7..0] bits are: WrErr TempErr reserved BufferOvfl CollErr CRCErr ParityErr ProtocolErr
|
uint8_t errorRegValue = PCD_ReadRegister(ErrorReg); // ErrorReg[7..0] bits are: WrErr TempErr reserved BufferOvfl CollErr CRCErr ParityErr ProtocolErr
|
||||||
if (errorRegValue & 0x13) { // BufferOvfl ParityErr ProtocolErr
|
if (errorRegValue & 0x13) { // BufferOvfl ParityErr ProtocolErr
|
||||||
return STATUS_ERROR;
|
return STATUS_ERROR;
|
||||||
}
|
}
|
||||||
@@ -450,7 +451,7 @@ byte MFRC522::PCD_CommunicateWithPICC( byte command, ///< The command to execut
|
|||||||
return STATUS_CRC_WRONG;
|
return STATUS_CRC_WRONG;
|
||||||
}
|
}
|
||||||
// Verify CRC_A - do our own calculation and store the control in controlBuffer.
|
// Verify CRC_A - do our own calculation and store the control in controlBuffer.
|
||||||
byte controlBuffer[2];
|
uint8_t controlBuffer[2];
|
||||||
n = PCD_CalculateCRC(&backData[0], *backLen - 2, &controlBuffer[0]);
|
n = PCD_CalculateCRC(&backData[0], *backLen - 2, &controlBuffer[0]);
|
||||||
if (n != STATUS_OK) {
|
if (n != STATUS_OK) {
|
||||||
return n;
|
return n;
|
||||||
@@ -469,8 +470,8 @@ byte MFRC522::PCD_CommunicateWithPICC( byte command, ///< The command to execut
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PICC_RequestA(byte *bufferATQA, ///< The buffer to store the ATQA (Answer to request) in
|
uint8_t MFRC522::PICC_RequestA(uint8_t *bufferATQA, ///< The buffer to store the ATQA (Answer to request) in
|
||||||
byte *bufferSize ///< Buffer size, at least two bytes. Also number of bytes returned if STATUS_OK.
|
uint8_t *bufferSize ///< Buffer size, at least two bytes. Also number of bytes returned if STATUS_OK.
|
||||||
) {
|
) {
|
||||||
return PICC_REQA_or_WUPA(PICC_CMD_REQA, bufferATQA, bufferSize);
|
return PICC_REQA_or_WUPA(PICC_CMD_REQA, bufferATQA, bufferSize);
|
||||||
} // End PICC_RequestA()
|
} // End PICC_RequestA()
|
||||||
@@ -481,8 +482,8 @@ byte MFRC522::PICC_RequestA(byte *bufferATQA, ///< The buffer to store the ATQA
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PICC_WakeupA( byte *bufferATQA, ///< The buffer to store the ATQA (Answer to request) in
|
uint8_t MFRC522::PICC_WakeupA( uint8_t *bufferATQA, ///< The buffer to store the ATQA (Answer to request) in
|
||||||
byte *bufferSize ///< Buffer size, at least two bytes. Also number of bytes returned if STATUS_OK.
|
uint8_t *bufferSize ///< Buffer size, at least two bytes. Also number of bytes returned if STATUS_OK.
|
||||||
) {
|
) {
|
||||||
return PICC_REQA_or_WUPA(PICC_CMD_WUPA, bufferATQA, bufferSize);
|
return PICC_REQA_or_WUPA(PICC_CMD_WUPA, bufferATQA, bufferSize);
|
||||||
} // End PICC_WakeupA()
|
} // End PICC_WakeupA()
|
||||||
@@ -493,12 +494,12 @@ byte MFRC522::PICC_WakeupA( byte *bufferATQA, ///< The buffer to store the ATQA
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PICC_REQA_or_WUPA( byte command, ///< The command to send - PICC_CMD_REQA or PICC_CMD_WUPA
|
uint8_t MFRC522::PICC_REQA_or_WUPA( uint8_t command, ///< The command to send - PICC_CMD_REQA or PICC_CMD_WUPA
|
||||||
byte *bufferATQA, ///< The buffer to store the ATQA (Answer to request) in
|
uint8_t *bufferATQA, ///< The buffer to store the ATQA (Answer to request) in
|
||||||
byte *bufferSize ///< Buffer size, at least two bytes. Also number of bytes returned if STATUS_OK.
|
uint8_t *bufferSize ///< Buffer size, at least two bytes. Also number of bytes returned if STATUS_OK.
|
||||||
) {
|
) {
|
||||||
byte validBits;
|
uint8_t validBits;
|
||||||
byte status;
|
uint8_t status;
|
||||||
|
|
||||||
if (bufferATQA == NULL || *bufferSize < 2) { // The ATQA response is 2 bytes long.
|
if (bufferATQA == NULL || *bufferSize < 2) { // The ATQA response is 2 bytes long.
|
||||||
return STATUS_NO_ROOM;
|
return STATUS_NO_ROOM;
|
||||||
@@ -532,24 +533,24 @@ byte MFRC522::PICC_REQA_or_WUPA( byte command, ///< The command to send - PICC
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PICC_Select( Uid *uid, ///< Pointer to Uid struct. Normally output, but can also be used to supply a known UID.
|
uint8_t MFRC522::PICC_Select( Uid *uid, ///< Pointer to Uid struct. Normally output, but can also be used to supply a known UID.
|
||||||
byte validBits ///< The number of known UID bits supplied in *uid. Normally 0. If set you must also supply uid->size.
|
uint8_t validBits ///< The number of known UID bits supplied in *uid. Normally 0. If set you must also supply uid->size.
|
||||||
) {
|
) {
|
||||||
bool uidComplete;
|
bool uidComplete;
|
||||||
bool selectDone;
|
bool selectDone;
|
||||||
bool useCascadeTag;
|
bool useCascadeTag;
|
||||||
byte cascadeLevel = 1;
|
uint8_t cascadeLevel = 1;
|
||||||
byte result;
|
uint8_t result;
|
||||||
byte count;
|
uint8_t count;
|
||||||
byte index;
|
uint8_t index;
|
||||||
byte uidIndex; // The first index in uid->uidByte[] that is used in the current Cascade Level.
|
uint8_t uidIndex; // The first index in uid->uidByte[] that is used in the current Cascade Level.
|
||||||
int8_t currentLevelKnownBits; // The number of known UID bits in the current Cascade Level.
|
int8_t currentLevelKnownBits; // The number of known UID bits in the current Cascade Level.
|
||||||
byte buffer[9]; // The SELECT/ANTICOLLISION commands uses a 7 byte standard frame + 2 bytes CRC_A
|
uint8_t buffer[9]; // The SELECT/ANTICOLLISION commands uses a 7 byte standard frame + 2 bytes CRC_A
|
||||||
byte bufferUsed; // The number of bytes used in the buffer, ie the number of bytes to transfer to the FIFO.
|
uint8_t bufferUsed; // The number of bytes used in the buffer, ie the number of bytes to transfer to the FIFO.
|
||||||
byte rxAlign; // Used in BitFramingReg. Defines the bit position for the first bit received.
|
uint8_t rxAlign; // Used in BitFramingReg. Defines the bit position for the first bit received.
|
||||||
byte txLastBits; // Used in BitFramingReg. The number of valid bits in the last transmitted byte.
|
uint8_t txLastBits; // Used in BitFramingReg. The number of valid bits in the last transmitted byte.
|
||||||
byte *responseBuffer;
|
uint8_t *responseBuffer;
|
||||||
byte responseLength;
|
uint8_t responseLength;
|
||||||
|
|
||||||
// Description of buffer structure:
|
// Description of buffer structure:
|
||||||
// Byte 0: SEL Indicates the Cascade Level: PICC_CMD_SEL_CL1, PICC_CMD_SEL_CL2 or PICC_CMD_SEL_CL3
|
// Byte 0: SEL Indicates the Cascade Level: PICC_CMD_SEL_CL1, PICC_CMD_SEL_CL2 or PICC_CMD_SEL_CL3
|
||||||
@@ -619,9 +620,9 @@ byte MFRC522::PICC_Select( Uid *uid, ///< Pointer to Uid struct. Normally outp
|
|||||||
if (useCascadeTag) {
|
if (useCascadeTag) {
|
||||||
buffer[index++] = PICC_CMD_CT;
|
buffer[index++] = PICC_CMD_CT;
|
||||||
}
|
}
|
||||||
byte bytesToCopy = currentLevelKnownBits / 8 + (currentLevelKnownBits % 8 ? 1 : 0); // The number of bytes needed to represent the known bits for this level.
|
uint8_t bytesToCopy = currentLevelKnownBits / 8 + (currentLevelKnownBits % 8 ? 1 : 0); // The number of bytes needed to represent the known bits for this level.
|
||||||
if (bytesToCopy) {
|
if (bytesToCopy) {
|
||||||
byte maxBytes = useCascadeTag ? 3 : 4; // Max 4 bytes in each Cascade Level. Only 3 left if we use the Cascade Tag
|
uint8_t maxBytes = useCascadeTag ? 3 : 4; // Max 4 bytes in each Cascade Level. Only 3 left if we use the Cascade Tag
|
||||||
if (bytesToCopy > maxBytes) {
|
if (bytesToCopy > maxBytes) {
|
||||||
bytesToCopy = maxBytes;
|
bytesToCopy = maxBytes;
|
||||||
}
|
}
|
||||||
@@ -677,7 +678,7 @@ byte MFRC522::PICC_Select( Uid *uid, ///< Pointer to Uid struct. Normally outp
|
|||||||
if (result & 0x20) { // CollPosNotValid
|
if (result & 0x20) { // CollPosNotValid
|
||||||
return STATUS_COLLISION; // Without a valid collision position we cannot continue
|
return STATUS_COLLISION; // Without a valid collision position we cannot continue
|
||||||
}
|
}
|
||||||
byte collisionPos = result & 0x1F; // Values 0-31, 0 means bit 32.
|
uint8_t collisionPos = result & 0x1F; // Values 0-31, 0 means bit 32.
|
||||||
if (collisionPos == 0) {
|
if (collisionPos == 0) {
|
||||||
collisionPos = 32;
|
collisionPos = 32;
|
||||||
}
|
}
|
||||||
@@ -747,9 +748,9 @@ byte MFRC522::PICC_Select( Uid *uid, ///< Pointer to Uid struct. Normally outp
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PICC_HaltA() {
|
uint8_t MFRC522::PICC_HaltA() {
|
||||||
byte result;
|
uint8_t result;
|
||||||
byte buffer[4];
|
uint8_t buffer[4];
|
||||||
|
|
||||||
// Build command buffer
|
// Build command buffer
|
||||||
buffer[0] = PICC_CMD_HLTA;
|
buffer[0] = PICC_CMD_HLTA;
|
||||||
@@ -792,21 +793,21 @@ byte MFRC522::PICC_HaltA() {
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise. Probably STATUS_TIMEOUT if you supply the wrong key.
|
* @return STATUS_OK on success, STATUS_??? otherwise. Probably STATUS_TIMEOUT if you supply the wrong key.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PCD_Authenticate(byte command, ///< PICC_CMD_MF_AUTH_KEY_A or PICC_CMD_MF_AUTH_KEY_B
|
uint8_t MFRC522::PCD_Authenticate(uint8_t command, ///< PICC_CMD_MF_AUTH_KEY_A or PICC_CMD_MF_AUTH_KEY_B
|
||||||
byte blockAddr, ///< The block number. See numbering in the comments in the .h file.
|
uint8_t blockAddr, ///< The block number. See numbering in the comments in the .h file.
|
||||||
MIFARE_Key *key, ///< Pointer to the Crypteo1 key to use (6 bytes)
|
MIFARE_Key *key, ///< Pointer to the Crypteo1 key to use (6 bytes)
|
||||||
Uid *uid ///< Pointer to Uid struct. The first 4 bytes of the UID is used.
|
Uid *uid ///< Pointer to Uid struct. The first 4 bytes of the UID is used.
|
||||||
) {
|
) {
|
||||||
byte waitIRq = 0x10; // IdleIRq
|
uint8_t waitIRq = 0x10; // IdleIRq
|
||||||
|
|
||||||
// Build command buffer
|
// Build command buffer
|
||||||
byte sendData[12];
|
uint8_t sendData[12];
|
||||||
sendData[0] = command;
|
sendData[0] = command;
|
||||||
sendData[1] = blockAddr;
|
sendData[1] = blockAddr;
|
||||||
for (byte i = 0; i < MF_KEY_SIZE; i++) { // 6 key bytes
|
for (uint8_t i = 0; i < MF_KEY_SIZE; i++) { // 6 key bytes
|
||||||
sendData[2+i] = key->keyByte[i];
|
sendData[2+i] = key->keyByte[i];
|
||||||
}
|
}
|
||||||
for (byte i = 0; i < 4; i++) { // The first 4 bytes of the UID
|
for (uint8_t i = 0; i < 4; i++) { // The first 4 bytes of the UID
|
||||||
sendData[8+i] = uid->uidByte[i];
|
sendData[8+i] = uid->uidByte[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -839,11 +840,11 @@ void MFRC522::PCD_StopCrypto1() {
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::MIFARE_Read( byte blockAddr, ///< MIFARE Classic: The block (0-0xff) number. MIFARE Ultralight: The first page to return data from.
|
uint8_t MFRC522::MIFARE_Read( uint8_t blockAddr, ///< MIFARE Classic: The block (0-0xff) number. MIFARE Ultralight: The first page to return data from.
|
||||||
byte *buffer, ///< The buffer to store the data in
|
uint8_t *buffer, ///< The buffer to store the data in
|
||||||
byte *bufferSize ///< Buffer size, at least 18 bytes. Also number of bytes returned if STATUS_OK.
|
uint8_t *bufferSize ///< Buffer size, at least 18 bytes. Also number of bytes returned if STATUS_OK.
|
||||||
) {
|
) {
|
||||||
byte result;
|
uint8_t result;
|
||||||
|
|
||||||
// Sanity check
|
// Sanity check
|
||||||
if (buffer == NULL || *bufferSize < 18) {
|
if (buffer == NULL || *bufferSize < 18) {
|
||||||
@@ -874,11 +875,11 @@ byte MFRC522::MIFARE_Read( byte blockAddr, ///< MIFARE Classic: The block (0-0x
|
|||||||
* *
|
* *
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::MIFARE_Write( byte blockAddr, ///< MIFARE Classic: The block (0-0xff) number. MIFARE Ultralight: The page (2-15) to write to.
|
uint8_t MFRC522::MIFARE_Write( uint8_t blockAddr, ///< MIFARE Classic: The block (0-0xff) number. MIFARE Ultralight: The page (2-15) to write to.
|
||||||
byte *buffer, ///< The 16 bytes to write to the PICC
|
uint8_t *buffer, ///< The 16 bytes to write to the PICC
|
||||||
byte bufferSize ///< Buffer size, must be at least 16 bytes. Exactly 16 bytes are written.
|
uint8_t bufferSize ///< Buffer size, must be at least 16 bytes. Exactly 16 bytes are written.
|
||||||
) {
|
) {
|
||||||
byte result;
|
uint8_t result;
|
||||||
|
|
||||||
// Sanity check
|
// Sanity check
|
||||||
if (buffer == NULL || bufferSize < 16) {
|
if (buffer == NULL || bufferSize < 16) {
|
||||||
@@ -887,7 +888,7 @@ byte MFRC522::MIFARE_Write( byte blockAddr, ///< MIFARE Classic: The block (0-0x
|
|||||||
|
|
||||||
// Mifare Classic protocol requires two communications to perform a write.
|
// Mifare Classic protocol requires two communications to perform a write.
|
||||||
// Step 1: Tell the PICC we want to write to block blockAddr.
|
// Step 1: Tell the PICC we want to write to block blockAddr.
|
||||||
byte cmdBuffer[2];
|
uint8_t cmdBuffer[2];
|
||||||
cmdBuffer[0] = PICC_CMD_MF_WRITE;
|
cmdBuffer[0] = PICC_CMD_MF_WRITE;
|
||||||
cmdBuffer[1] = blockAddr;
|
cmdBuffer[1] = blockAddr;
|
||||||
result = PCD_MIFARE_Transceive(cmdBuffer, 2); // Adds CRC_A and checks that the response is MF_ACK.
|
result = PCD_MIFARE_Transceive(cmdBuffer, 2); // Adds CRC_A and checks that the response is MF_ACK.
|
||||||
@@ -909,11 +910,11 @@ byte MFRC522::MIFARE_Write( byte blockAddr, ///< MIFARE Classic: The block (0-0x
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::MIFARE_Ultralight_Write( byte page, ///< The page (2-15) to write to.
|
uint8_t MFRC522::MIFARE_Ultralight_Write( uint8_t page, ///< The page (2-15) to write to.
|
||||||
byte *buffer, ///< The 4 bytes to write to the PICC
|
uint8_t *buffer, ///< The 4 bytes to write to the PICC
|
||||||
byte bufferSize ///< Buffer size, must be at least 4 bytes. Exactly 4 bytes are written.
|
uint8_t bufferSize ///< Buffer size, must be at least 4 bytes. Exactly 4 bytes are written.
|
||||||
) {
|
) {
|
||||||
byte result;
|
uint8_t result;
|
||||||
|
|
||||||
// Sanity check
|
// Sanity check
|
||||||
if (buffer == NULL || bufferSize < 4) {
|
if (buffer == NULL || bufferSize < 4) {
|
||||||
@@ -921,7 +922,7 @@ byte MFRC522::MIFARE_Ultralight_Write( byte page, ///< The page (2-15) to writ
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Build commmand buffer
|
// Build commmand buffer
|
||||||
byte cmdBuffer[6];
|
uint8_t cmdBuffer[6];
|
||||||
cmdBuffer[0] = PICC_CMD_UL_WRITE;
|
cmdBuffer[0] = PICC_CMD_UL_WRITE;
|
||||||
cmdBuffer[1] = page;
|
cmdBuffer[1] = page;
|
||||||
memcpy(&cmdBuffer[2], buffer, 4);
|
memcpy(&cmdBuffer[2], buffer, 4);
|
||||||
@@ -942,7 +943,7 @@ byte MFRC522::MIFARE_Ultralight_Write( byte page, ///< The page (2-15) to writ
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::MIFARE_Decrement( byte blockAddr, ///< The block (0-0xff) number.
|
uint8_t MFRC522::MIFARE_Decrement( uint8_t blockAddr, ///< The block (0-0xff) number.
|
||||||
long delta ///< This number is subtracted from the value of block blockAddr.
|
long delta ///< This number is subtracted from the value of block blockAddr.
|
||||||
) {
|
) {
|
||||||
return MIFARE_TwoStepHelper(PICC_CMD_MF_DECREMENT, blockAddr, delta);
|
return MIFARE_TwoStepHelper(PICC_CMD_MF_DECREMENT, blockAddr, delta);
|
||||||
@@ -956,7 +957,7 @@ byte MFRC522::MIFARE_Decrement( byte blockAddr, ///< The block (0-0xff) number.
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::MIFARE_Increment( byte blockAddr, ///< The block (0-0xff) number.
|
uint8_t MFRC522::MIFARE_Increment( uint8_t blockAddr, ///< The block (0-0xff) number.
|
||||||
long delta ///< This number is added to the value of block blockAddr.
|
long delta ///< This number is added to the value of block blockAddr.
|
||||||
) {
|
) {
|
||||||
return MIFARE_TwoStepHelper(PICC_CMD_MF_INCREMENT, blockAddr, delta);
|
return MIFARE_TwoStepHelper(PICC_CMD_MF_INCREMENT, blockAddr, delta);
|
||||||
@@ -970,7 +971,7 @@ byte MFRC522::MIFARE_Increment( byte blockAddr, ///< The block (0-0xff) number.
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::MIFARE_Restore( byte blockAddr ///< The block (0-0xff) number.
|
uint8_t MFRC522::MIFARE_Restore( uint8_t blockAddr ///< The block (0-0xff) number.
|
||||||
) {
|
) {
|
||||||
// The datasheet describes Restore as a two step operation, but does not explain what data to transfer in step 2.
|
// The datasheet describes Restore as a two step operation, but does not explain what data to transfer in step 2.
|
||||||
// Doing only a single step does not work, so I chose to transfer 0L in step two.
|
// Doing only a single step does not work, so I chose to transfer 0L in step two.
|
||||||
@@ -982,12 +983,12 @@ byte MFRC522::MIFARE_Restore( byte blockAddr ///< The block (0-0xff) number.
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::MIFARE_TwoStepHelper( byte command, ///< The command to use
|
uint8_t MFRC522::MIFARE_TwoStepHelper( uint8_t command, ///< The command to use
|
||||||
byte blockAddr, ///< The block (0-0xff) number.
|
uint8_t blockAddr, ///< The block (0-0xff) number.
|
||||||
long data ///< The data to transfer in step 2
|
long data ///< The data to transfer in step 2
|
||||||
) {
|
) {
|
||||||
byte result;
|
uint8_t result;
|
||||||
byte cmdBuffer[2]; // We only need room for 2 bytes.
|
uint8_t cmdBuffer[2]; // We only need room for 2 bytes.
|
||||||
|
|
||||||
// Step 1: Tell the PICC the command and block address
|
// Step 1: Tell the PICC the command and block address
|
||||||
cmdBuffer[0] = command;
|
cmdBuffer[0] = command;
|
||||||
@@ -998,7 +999,7 @@ byte MFRC522::MIFARE_TwoStepHelper( byte command, ///< The command to use
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Step 2: Transfer the data
|
// Step 2: Transfer the data
|
||||||
result = PCD_MIFARE_Transceive( (byte *)&data, 4, true); // Adds CRC_A and accept timeout as success.
|
result = PCD_MIFARE_Transceive( (uint8_t *)&data, 4, true); // Adds CRC_A and accept timeout as success.
|
||||||
if (result != STATUS_OK) {
|
if (result != STATUS_OK) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -1013,10 +1014,10 @@ byte MFRC522::MIFARE_TwoStepHelper( byte command, ///< The command to use
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::MIFARE_Transfer( byte blockAddr ///< The block (0-0xff) number.
|
uint8_t MFRC522::MIFARE_Transfer( uint8_t blockAddr ///< The block (0-0xff) number.
|
||||||
) {
|
) {
|
||||||
byte result;
|
uint8_t result;
|
||||||
byte cmdBuffer[2]; // We only need room for 2 bytes.
|
uint8_t cmdBuffer[2]; // We only need room for 2 bytes.
|
||||||
|
|
||||||
// Tell the PICC we want to transfer the result into block blockAddr.
|
// Tell the PICC we want to transfer the result into block blockAddr.
|
||||||
cmdBuffer[0] = PICC_CMD_MF_TRANSFER;
|
cmdBuffer[0] = PICC_CMD_MF_TRANSFER;
|
||||||
@@ -1039,10 +1040,10 @@ byte MFRC522::MIFARE_Transfer( byte blockAddr ///< The block (0-0xff) number.
|
|||||||
* @param[out] value Current value of the Value Block.
|
* @param[out] value Current value of the Value Block.
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::MIFARE_GetValue(byte blockAddr, long *value) {
|
uint8_t MFRC522::MIFARE_GetValue(uint8_t blockAddr, long *value) {
|
||||||
byte status;
|
uint8_t status;
|
||||||
byte buffer[18];
|
uint8_t buffer[18];
|
||||||
byte size = sizeof(buffer);
|
uint8_t size = sizeof(buffer);
|
||||||
|
|
||||||
// Read the block
|
// Read the block
|
||||||
status = MIFARE_Read(blockAddr, buffer, &size);
|
status = MIFARE_Read(blockAddr, buffer, &size);
|
||||||
@@ -1064,8 +1065,8 @@ byte MFRC522::MIFARE_GetValue(byte blockAddr, long *value) {
|
|||||||
* @param[in] value New value of the Value Block.
|
* @param[in] value New value of the Value Block.
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::MIFARE_SetValue(byte blockAddr, long value) {
|
uint8_t MFRC522::MIFARE_SetValue(uint8_t blockAddr, long value) {
|
||||||
byte buffer[18];
|
uint8_t buffer[18];
|
||||||
|
|
||||||
// Translate the long into 4 bytes; repeated 2x in value block
|
// Translate the long into 4 bytes; repeated 2x in value block
|
||||||
buffer[0] = buffer[ 8] = (value & 0xFF);
|
buffer[0] = buffer[ 8] = (value & 0xFF);
|
||||||
@@ -1095,12 +1096,12 @@ byte MFRC522::MIFARE_SetValue(byte blockAddr, long value) {
|
|||||||
*
|
*
|
||||||
* @return STATUS_OK on success, STATUS_??? otherwise.
|
* @return STATUS_OK on success, STATUS_??? otherwise.
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PCD_MIFARE_Transceive( byte *sendData, ///< Pointer to the data to transfer to the FIFO. Do NOT include the CRC_A.
|
uint8_t MFRC522::PCD_MIFARE_Transceive( uint8_t *sendData, ///< Pointer to the data to transfer to the FIFO. Do NOT include the CRC_A.
|
||||||
byte sendLen, ///< Number of bytes in sendData.
|
uint8_t sendLen, ///< Number of bytes in sendData.
|
||||||
bool acceptTimeout ///< True => A timeout is also success
|
bool acceptTimeout ///< True => A timeout is also success
|
||||||
) {
|
) {
|
||||||
byte result;
|
uint8_t result;
|
||||||
byte cmdBuffer[18]; // We need room for 16 bytes data and 2 bytes CRC_A.
|
uint8_t cmdBuffer[18]; // We need room for 16 bytes data and 2 bytes CRC_A.
|
||||||
|
|
||||||
// Sanity check
|
// Sanity check
|
||||||
if (sendData == NULL || sendLen > 16) {
|
if (sendData == NULL || sendLen > 16) {
|
||||||
@@ -1116,9 +1117,9 @@ byte MFRC522::PCD_MIFARE_Transceive( byte *sendData, ///< Pointer to the data t
|
|||||||
sendLen += 2;
|
sendLen += 2;
|
||||||
|
|
||||||
// Transceive the data, store the reply in cmdBuffer[]
|
// Transceive the data, store the reply in cmdBuffer[]
|
||||||
byte waitIRq = 0x30; // RxIRq and IdleIRq
|
uint8_t waitIRq = 0x30; // RxIRq and IdleIRq
|
||||||
byte cmdBufferSize = sizeof(cmdBuffer);
|
uint8_t cmdBufferSize = sizeof(cmdBuffer);
|
||||||
byte validBits = 0;
|
uint8_t validBits = 0;
|
||||||
result = PCD_CommunicateWithPICC(PCD_Transceive, waitIRq, cmdBuffer, sendLen, cmdBuffer, &cmdBufferSize, &validBits);
|
result = PCD_CommunicateWithPICC(PCD_Transceive, waitIRq, cmdBuffer, sendLen, cmdBuffer, &cmdBufferSize, &validBits);
|
||||||
if (acceptTimeout && result == STATUS_TIMEOUT) {
|
if (acceptTimeout && result == STATUS_TIMEOUT) {
|
||||||
return STATUS_OK;
|
return STATUS_OK;
|
||||||
@@ -1141,7 +1142,7 @@ byte MFRC522::PCD_MIFARE_Transceive( byte *sendData, ///< Pointer to the data t
|
|||||||
*
|
*
|
||||||
* @return const __FlashStringHelper *
|
* @return const __FlashStringHelper *
|
||||||
*/
|
*/
|
||||||
const char *MFRC522::GetStatusCodeName(byte code ///< One of the StatusCode enums.
|
const char *MFRC522::GetStatusCodeName(uint8_t code ///< One of the StatusCode enums.
|
||||||
) {
|
) {
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case STATUS_OK: return "Success."; break;
|
case STATUS_OK: return "Success."; break;
|
||||||
@@ -1162,7 +1163,7 @@ const char *MFRC522::GetStatusCodeName(byte code ///< One of the StatusCode enum
|
|||||||
*
|
*
|
||||||
* @return PICC_Type
|
* @return PICC_Type
|
||||||
*/
|
*/
|
||||||
byte MFRC522::PICC_GetType(byte sak ///< The SAK byte returned from PICC_Select().
|
uint8_t MFRC522::PICC_GetType(uint8_t sak ///< The SAK byte returned from PICC_Select().
|
||||||
) {
|
) {
|
||||||
if (sak & 0x04) { // UID not complete
|
if (sak & 0x04) { // UID not complete
|
||||||
return PICC_TYPE_NOT_COMPLETE;
|
return PICC_TYPE_NOT_COMPLETE;
|
||||||
@@ -1195,7 +1196,7 @@ byte MFRC522::PICC_GetType(byte sak ///< The SAK byte returned from PICC_Select
|
|||||||
*
|
*
|
||||||
* @return const __FlashStringHelper *
|
* @return const __FlashStringHelper *
|
||||||
*/
|
*/
|
||||||
const char *MFRC522::PICC_GetTypeName(byte piccType ///< One of the PICC_Type enums.
|
const char *MFRC522::PICC_GetTypeName(uint8_t piccType ///< One of the PICC_Type enums.
|
||||||
) {
|
) {
|
||||||
switch (piccType) {
|
switch (piccType) {
|
||||||
case PICC_TYPE_ISO_14443_4: return "PICC compliant with ISO/IEC 14443-4"; break;
|
case PICC_TYPE_ISO_14443_4: return "PICC compliant with ISO/IEC 14443-4"; break;
|
||||||
@@ -1223,7 +1224,7 @@ void MFRC522::PICC_DumpToSerial(Uid *uid ///< Pointer to Uid struct returned fro
|
|||||||
|
|
||||||
// UID
|
// UID
|
||||||
Serial.print("Card UID:");
|
Serial.print("Card UID:");
|
||||||
for (byte i = 0; i < uid->size; i++) {
|
for (uint8_t i = 0; i < uid->size; i++) {
|
||||||
if(uid->uidByte[i] < 0x10)
|
if(uid->uidByte[i] < 0x10)
|
||||||
Serial.print(" 0");
|
Serial.print(" 0");
|
||||||
else
|
else
|
||||||
@@ -1233,7 +1234,7 @@ void MFRC522::PICC_DumpToSerial(Uid *uid ///< Pointer to Uid struct returned fro
|
|||||||
Serial.println();
|
Serial.println();
|
||||||
|
|
||||||
// PICC type
|
// PICC type
|
||||||
byte piccType = PICC_GetType(uid->sak);
|
uint8_t piccType = PICC_GetType(uid->sak);
|
||||||
Serial.print("PICC type: ");
|
Serial.print("PICC type: ");
|
||||||
Serial.println(PICC_GetTypeName(piccType));
|
Serial.println(PICC_GetTypeName(piccType));
|
||||||
|
|
||||||
@@ -1243,7 +1244,7 @@ void MFRC522::PICC_DumpToSerial(Uid *uid ///< Pointer to Uid struct returned fro
|
|||||||
case PICC_TYPE_MIFARE_1K:
|
case PICC_TYPE_MIFARE_1K:
|
||||||
case PICC_TYPE_MIFARE_4K:
|
case PICC_TYPE_MIFARE_4K:
|
||||||
// All keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
|
// All keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
|
||||||
for (byte i = 0; i < 6; i++) {
|
for (uint8_t i = 0; i < 6; i++) {
|
||||||
key.keyByte[i] = 0xFF;
|
key.keyByte[i] = 0xFF;
|
||||||
}
|
}
|
||||||
PICC_DumpMifareClassicToSerial(uid, piccType, &key);
|
PICC_DumpMifareClassicToSerial(uid, piccType, &key);
|
||||||
@@ -1275,10 +1276,10 @@ void MFRC522::PICC_DumpToSerial(Uid *uid ///< Pointer to Uid struct returned fro
|
|||||||
* On success the PICC is halted after dumping the data.
|
* On success the PICC is halted after dumping the data.
|
||||||
*/
|
*/
|
||||||
void MFRC522::PICC_DumpMifareClassicToSerial( Uid *uid, ///< Pointer to Uid struct returned from a successful PICC_Select().
|
void MFRC522::PICC_DumpMifareClassicToSerial( Uid *uid, ///< Pointer to Uid struct returned from a successful PICC_Select().
|
||||||
byte piccType, ///< One of the PICC_Type enums.
|
uint8_t piccType, ///< One of the PICC_Type enums.
|
||||||
MIFARE_Key *key ///< Key A used for all sectors.
|
MIFARE_Key *key ///< Key A used for all sectors.
|
||||||
) {
|
) {
|
||||||
byte no_of_sectors = 0;
|
uint8_t no_of_sectors = 0;
|
||||||
switch (piccType) {
|
switch (piccType) {
|
||||||
case PICC_TYPE_MIFARE_MINI:
|
case PICC_TYPE_MIFARE_MINI:
|
||||||
// Has 5 sectors * 4 blocks/sector * 16 bytes/block = 320 bytes.
|
// Has 5 sectors * 4 blocks/sector * 16 bytes/block = 320 bytes.
|
||||||
@@ -1317,11 +1318,11 @@ void MFRC522::PICC_DumpMifareClassicToSerial( Uid *uid, ///< Pointer to Uid str
|
|||||||
*/
|
*/
|
||||||
void MFRC522::PICC_DumpMifareClassicSectorToSerial(Uid *uid, ///< Pointer to Uid struct returned from a successful PICC_Select().
|
void MFRC522::PICC_DumpMifareClassicSectorToSerial(Uid *uid, ///< Pointer to Uid struct returned from a successful PICC_Select().
|
||||||
MIFARE_Key *key, ///< Key A for the sector.
|
MIFARE_Key *key, ///< Key A for the sector.
|
||||||
byte sector ///< The sector to dump, 0..39.
|
uint8_t sector ///< The sector to dump, 0..39.
|
||||||
) {
|
) {
|
||||||
byte status;
|
uint8_t status;
|
||||||
byte firstBlock; // Address of lowest address to dump actually last block dumped)
|
uint8_t firstBlock; // Address of lowest address to dump actually last block dumped)
|
||||||
byte no_of_blocks; // Number of blocks in sector
|
uint8_t no_of_blocks; // Number of blocks in sector
|
||||||
bool isSectorTrailer; // Set to true while handling the "last" (ie highest address) in the sector.
|
bool isSectorTrailer; // Set to true while handling the "last" (ie highest address) in the sector.
|
||||||
|
|
||||||
// The access bits are stored in a peculiar fashion.
|
// The access bits are stored in a peculiar fashion.
|
||||||
@@ -1332,11 +1333,11 @@ void MFRC522::PICC_DumpMifareClassicSectorToSerial(Uid *uid, ///< Pointer to U
|
|||||||
// g[0] Access bits for block 0 (for sectors 0-31) or blocks 0-4 (for sectors 32-39)
|
// g[0] Access bits for block 0 (for sectors 0-31) or blocks 0-4 (for sectors 32-39)
|
||||||
// Each group has access bits [C1 C2 C3]. In this code C1 is MSB and C3 is LSB.
|
// Each group has access bits [C1 C2 C3]. In this code C1 is MSB and C3 is LSB.
|
||||||
// The four CX bits are stored together in a nible cx and an inverted nible cx_.
|
// The four CX bits are stored together in a nible cx and an inverted nible cx_.
|
||||||
byte c1, c2, c3; // Nibbles
|
uint8_t c1, c2, c3; // Nibbles
|
||||||
byte c1_, c2_, c3_; // Inverted nibbles
|
uint8_t c1_, c2_, c3_; // Inverted nibbles
|
||||||
bool invertedError; // True if one of the inverted nibbles did not match
|
bool invertedError; // True if one of the inverted nibbles did not match
|
||||||
byte g[4]; // Access bits for each of the four groups.
|
uint8_t g[4]; // Access bits for each of the four groups.
|
||||||
byte group; // 0-3 - active group for access bits
|
uint8_t group; // 0-3 - active group for access bits
|
||||||
bool firstInGroup; // True for the first block dumped in the group
|
bool firstInGroup; // True for the first block dumped in the group
|
||||||
|
|
||||||
// Determine position and size of sector.
|
// Determine position and size of sector.
|
||||||
@@ -1353,9 +1354,9 @@ void MFRC522::PICC_DumpMifareClassicSectorToSerial(Uid *uid, ///< Pointer to U
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Dump blocks, highest address first.
|
// Dump blocks, highest address first.
|
||||||
byte byteCount;
|
uint8_t byteCount;
|
||||||
byte buffer[18];
|
uint8_t buffer[18];
|
||||||
byte blockAddr;
|
uint8_t blockAddr;
|
||||||
isSectorTrailer = true;
|
isSectorTrailer = true;
|
||||||
for (int8_t blockOffset = no_of_blocks - 1; blockOffset >= 0; blockOffset--) {
|
for (int8_t blockOffset = no_of_blocks - 1; blockOffset >= 0; blockOffset--) {
|
||||||
blockAddr = firstBlock + blockOffset;
|
blockAddr = firstBlock + blockOffset;
|
||||||
@@ -1400,7 +1401,7 @@ void MFRC522::PICC_DumpMifareClassicSectorToSerial(Uid *uid, ///< Pointer to U
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Dump data
|
// Dump data
|
||||||
for (byte index = 0; index < 16; index++) {
|
for (uint8_t index = 0; index < 16; index++) {
|
||||||
if(buffer[index] < 0x10)
|
if(buffer[index] < 0x10)
|
||||||
Serial.print(" 0");
|
Serial.print(" 0");
|
||||||
else
|
else
|
||||||
@@ -1463,14 +1464,14 @@ void MFRC522::PICC_DumpMifareClassicSectorToSerial(Uid *uid, ///< Pointer to U
|
|||||||
* Dumps memory contents of a MIFARE Ultralight PICC.
|
* Dumps memory contents of a MIFARE Ultralight PICC.
|
||||||
*/
|
*/
|
||||||
void MFRC522::PICC_DumpMifareUltralightToSerial() {
|
void MFRC522::PICC_DumpMifareUltralightToSerial() {
|
||||||
byte status;
|
uint8_t status;
|
||||||
byte byteCount;
|
uint8_t byteCount;
|
||||||
byte buffer[18];
|
uint8_t buffer[18];
|
||||||
byte i;
|
uint8_t i;
|
||||||
|
|
||||||
Serial.println("Page 0 1 2 3");
|
Serial.println("Page 0 1 2 3");
|
||||||
// Try the mpages of the original Ultralight. Ultralight C has more pages.
|
// Try the mpages of the original Ultralight. Ultralight C has more pages.
|
||||||
for (byte page = 0; page < 16; page +=4) { // Read returns data for 4 pages at a time.
|
for (uint8_t page = 0; page < 16; page +=4) { // Read returns data for 4 pages at a time.
|
||||||
// Read pages
|
// Read pages
|
||||||
byteCount = sizeof(buffer);
|
byteCount = sizeof(buffer);
|
||||||
status = MIFARE_Read(page, buffer, &byteCount);
|
status = MIFARE_Read(page, buffer, &byteCount);
|
||||||
@@ -1480,7 +1481,7 @@ void MFRC522::PICC_DumpMifareUltralightToSerial() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Dump data
|
// Dump data
|
||||||
for (byte offset = 0; offset < 4; offset++) {
|
for (uint8_t offset = 0; offset < 4; offset++) {
|
||||||
i = page + offset;
|
i = page + offset;
|
||||||
if(i < 10)
|
if(i < 10)
|
||||||
Serial.print(" "); // Pad with spaces
|
Serial.print(" "); // Pad with spaces
|
||||||
@@ -1488,7 +1489,7 @@ void MFRC522::PICC_DumpMifareUltralightToSerial() {
|
|||||||
Serial.print(" "); // Pad with spaces
|
Serial.print(" "); // Pad with spaces
|
||||||
Serial.print(i);
|
Serial.print(i);
|
||||||
Serial.print(" ");
|
Serial.print(" ");
|
||||||
for (byte index = 0; index < 4; index++) {
|
for (uint8_t index = 0; index < 4; index++) {
|
||||||
i = 4 * offset + index;
|
i = 4 * offset + index;
|
||||||
if(buffer[i] < 0x10)
|
if(buffer[i] < 0x10)
|
||||||
Serial.print(" 0");
|
Serial.print(" 0");
|
||||||
@@ -1504,15 +1505,15 @@ void MFRC522::PICC_DumpMifareUltralightToSerial() {
|
|||||||
/**
|
/**
|
||||||
* Calculates the bit pattern needed for the specified access bits. In the [C1 C2 C3] tupples C1 is MSB (=4) and C3 is LSB (=1).
|
* Calculates the bit pattern needed for the specified access bits. In the [C1 C2 C3] tupples C1 is MSB (=4) and C3 is LSB (=1).
|
||||||
*/
|
*/
|
||||||
void MFRC522::MIFARE_SetAccessBits( byte *accessBitBuffer, ///< Pointer to byte 6, 7 and 8 in the sector trailer. Bytes [0..2] will be set.
|
void MFRC522::MIFARE_SetAccessBits( uint8_t *accessBitBuffer, ///< Pointer to byte 6, 7 and 8 in the sector trailer. Bytes [0..2] will be set.
|
||||||
byte g0, ///< Access bits [C1 C2 C3] for block 0 (for sectors 0-31) or blocks 0-4 (for sectors 32-39)
|
uint8_t g0, ///< Access bits [C1 C2 C3] for block 0 (for sectors 0-31) or blocks 0-4 (for sectors 32-39)
|
||||||
byte g1, ///< Access bits C1 C2 C3] for block 1 (for sectors 0-31) or blocks 5-9 (for sectors 32-39)
|
uint8_t g1, ///< Access bits C1 C2 C3] for block 1 (for sectors 0-31) or blocks 5-9 (for sectors 32-39)
|
||||||
byte g2, ///< Access bits C1 C2 C3] for block 2 (for sectors 0-31) or blocks 10-14 (for sectors 32-39)
|
uint8_t g2, ///< Access bits C1 C2 C3] for block 2 (for sectors 0-31) or blocks 10-14 (for sectors 32-39)
|
||||||
byte g3 ///< Access bits C1 C2 C3] for the sector trailer, block 3 (for sectors 0-31) or block 15 (for sectors 32-39)
|
uint8_t g3 ///< Access bits C1 C2 C3] for the sector trailer, block 3 (for sectors 0-31) or block 15 (for sectors 32-39)
|
||||||
) {
|
) {
|
||||||
byte c1 = ((g3 & 4) << 1) | ((g2 & 4) << 0) | ((g1 & 4) >> 1) | ((g0 & 4) >> 2);
|
uint8_t c1 = ((g3 & 4) << 1) | ((g2 & 4) << 0) | ((g1 & 4) >> 1) | ((g0 & 4) >> 2);
|
||||||
byte c2 = ((g3 & 2) << 2) | ((g2 & 2) << 1) | ((g1 & 2) << 0) | ((g0 & 2) >> 1);
|
uint8_t c2 = ((g3 & 2) << 2) | ((g2 & 2) << 1) | ((g1 & 2) << 0) | ((g0 & 2) >> 1);
|
||||||
byte c3 = ((g3 & 1) << 3) | ((g2 & 1) << 2) | ((g1 & 1) << 1) | ((g0 & 1) << 0);
|
uint8_t c3 = ((g3 & 1) << 3) | ((g2 & 1) << 2) | ((g1 & 1) << 1) | ((g0 & 1) << 0);
|
||||||
|
|
||||||
accessBitBuffer[0] = (~c2 & 0xF) << 4 | (~c1 & 0xF);
|
accessBitBuffer[0] = (~c2 & 0xF) << 4 | (~c1 & 0xF);
|
||||||
accessBitBuffer[1] = c1 << 4 | (~c3 & 0xF);
|
accessBitBuffer[1] = c1 << 4 | (~c3 & 0xF);
|
||||||
@@ -1542,12 +1543,12 @@ bool MFRC522::MIFARE_OpenUidBackdoor(bool logErrors) {
|
|||||||
|
|
||||||
PICC_HaltA(); // 50 00 57 CD
|
PICC_HaltA(); // 50 00 57 CD
|
||||||
|
|
||||||
byte cmd = 0x40;
|
uint8_t cmd = 0x40;
|
||||||
byte validBits = 7; /* Our command is only 7 bits. After receiving card response,
|
uint8_t validBits = 7; /* Our command is only 7 bits. After receiving card response,
|
||||||
this will contain amount of valid response bits. */
|
this will contain amount of valid response bits. */
|
||||||
byte response[32]; // Card's response is written here
|
uint8_t response[32]; // Card's response is written here
|
||||||
byte received;
|
uint8_t received;
|
||||||
byte status = PCD_TransceiveData(&cmd, (byte)1, response, &received, &validBits, (byte)0, false); // 40
|
uint8_t status = PCD_TransceiveData(&cmd, (uint8_t)1, response, &received, &validBits, (uint8_t)0, false); // 40
|
||||||
if(status != STATUS_OK) {
|
if(status != STATUS_OK) {
|
||||||
if(logErrors) {
|
if(logErrors) {
|
||||||
Serial.println("Card did not respond to 0x40 after HALT command. Are you sure it is a UID changeable one?");
|
Serial.println("Card did not respond to 0x40 after HALT command. Are you sure it is a UID changeable one?");
|
||||||
@@ -1569,7 +1570,7 @@ bool MFRC522::MIFARE_OpenUidBackdoor(bool logErrors) {
|
|||||||
|
|
||||||
cmd = 0x43;
|
cmd = 0x43;
|
||||||
validBits = 8;
|
validBits = 8;
|
||||||
status = PCD_TransceiveData(&cmd, (byte)1, response, &received, &validBits, (byte)0, false); // 43
|
status = PCD_TransceiveData(&cmd, (uint8_t)1, response, &received, &validBits, (uint8_t)0, false); // 43
|
||||||
if(status != STATUS_OK) {
|
if(status != STATUS_OK) {
|
||||||
if(logErrors) {
|
if(logErrors) {
|
||||||
Serial.println("Error in communication at command 0x43, after successfully executing 0x40");
|
Serial.println("Error in communication at command 0x43, after successfully executing 0x40");
|
||||||
@@ -1601,7 +1602,7 @@ bool MFRC522::MIFARE_OpenUidBackdoor(bool logErrors) {
|
|||||||
* It assumes a default KEY A of 0xFFFFFFFFFFFF.
|
* It assumes a default KEY A of 0xFFFFFFFFFFFF.
|
||||||
* Make sure to have selected the card before this function is called.
|
* Make sure to have selected the card before this function is called.
|
||||||
*/
|
*/
|
||||||
bool MFRC522::MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors) {
|
bool MFRC522::MIFARE_SetUid(uint8_t *newUid, uint8_t uidSize, bool logErrors) {
|
||||||
|
|
||||||
// UID + BCC byte can not be larger than 16 together
|
// UID + BCC byte can not be larger than 16 together
|
||||||
if (!newUid || !uidSize || uidSize > 15) {
|
if (!newUid || !uidSize || uidSize > 15) {
|
||||||
@@ -1613,7 +1614,7 @@ bool MFRC522::MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors) {
|
|||||||
|
|
||||||
// Authenticate for reading
|
// Authenticate for reading
|
||||||
MIFARE_Key key = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
MIFARE_Key key = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
||||||
byte status = PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, (byte)1, &key, &uid);
|
uint8_t status = PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, (uint8_t)1, &key, &uid);
|
||||||
if (status != STATUS_OK) {
|
if (status != STATUS_OK) {
|
||||||
|
|
||||||
if (status == STATUS_TIMEOUT) {
|
if (status == STATUS_TIMEOUT) {
|
||||||
@@ -1629,7 +1630,7 @@ bool MFRC522::MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, (byte)1, &key, &uid);
|
status = PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, (uint8_t)1, &key, &uid);
|
||||||
if (status != STATUS_OK) {
|
if (status != STATUS_OK) {
|
||||||
// We tried, time to give up
|
// We tried, time to give up
|
||||||
if (logErrors) {
|
if (logErrors) {
|
||||||
@@ -1649,9 +1650,9 @@ bool MFRC522::MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read block 0
|
// Read block 0
|
||||||
byte block0_buffer[18];
|
uint8_t block0_buffer[18];
|
||||||
byte byteCount = sizeof(block0_buffer);
|
uint8_t byteCount = sizeof(block0_buffer);
|
||||||
status = MIFARE_Read((byte)0, block0_buffer, &byteCount);
|
status = MIFARE_Read((uint8_t)0, block0_buffer, &byteCount);
|
||||||
if (status != STATUS_OK) {
|
if (status != STATUS_OK) {
|
||||||
if (logErrors) {
|
if (logErrors) {
|
||||||
Serial.print("MIFARE_Read() failed: ");
|
Serial.print("MIFARE_Read() failed: ");
|
||||||
@@ -1662,7 +1663,7 @@ bool MFRC522::MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write new UID to the data we just read, and calculate BCC byte
|
// Write new UID to the data we just read, and calculate BCC byte
|
||||||
byte bcc = 0;
|
uint8_t bcc = 0;
|
||||||
for (int i = 0; i < uidSize; i++) {
|
for (int i = 0; i < uidSize; i++) {
|
||||||
block0_buffer[i] = newUid[i];
|
block0_buffer[i] = newUid[i];
|
||||||
bcc ^= newUid[i];
|
bcc ^= newUid[i];
|
||||||
@@ -1683,7 +1684,7 @@ bool MFRC522::MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write modified block 0 back to card
|
// Write modified block 0 back to card
|
||||||
status = MIFARE_Write((byte)0, block0_buffer, (byte)16);
|
status = MIFARE_Write((uint8_t)0, block0_buffer, (uint8_t)16);
|
||||||
if (status != STATUS_OK) {
|
if (status != STATUS_OK) {
|
||||||
if (logErrors) {
|
if (logErrors) {
|
||||||
Serial.print("MIFARE_Write() failed: ");
|
Serial.print("MIFARE_Write() failed: ");
|
||||||
@@ -1693,8 +1694,8 @@ bool MFRC522::MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Wake the card up again
|
// Wake the card up again
|
||||||
byte atqa_answer[2];
|
uint8_t atqa_answer[2];
|
||||||
byte atqa_size = 2;
|
uint8_t atqa_size = 2;
|
||||||
PICC_WakeupA(atqa_answer, &atqa_size);
|
PICC_WakeupA(atqa_answer, &atqa_size);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -1706,10 +1707,10 @@ bool MFRC522::MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors) {
|
|||||||
bool MFRC522::MIFARE_UnbrickUidSector(bool logErrors) {
|
bool MFRC522::MIFARE_UnbrickUidSector(bool logErrors) {
|
||||||
MIFARE_OpenUidBackdoor(logErrors);
|
MIFARE_OpenUidBackdoor(logErrors);
|
||||||
|
|
||||||
byte block0_buffer[] = {0x01, 0x02, 0x03, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
uint8_t block0_buffer[] = {0x01, 0x02, 0x03, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
|
|
||||||
// Write modified block 0 back to card
|
// Write modified block 0 back to card
|
||||||
byte status = MIFARE_Write((byte)0, block0_buffer, (byte)16);
|
uint8_t status = MIFARE_Write((uint8_t)0, block0_buffer, (uint8_t)16);
|
||||||
if (status != STATUS_OK) {
|
if (status != STATUS_OK) {
|
||||||
if (logErrors) {
|
if (logErrors) {
|
||||||
Serial.print("MIFARE_Write() failed: ");
|
Serial.print("MIFARE_Write() failed: ");
|
||||||
@@ -1731,9 +1732,9 @@ bool MFRC522::MIFARE_UnbrickUidSector(bool logErrors) {
|
|||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
bool MFRC522::PICC_IsNewCardPresent() {
|
bool MFRC522::PICC_IsNewCardPresent() {
|
||||||
byte bufferATQA[2];
|
uint8_t bufferATQA[2];
|
||||||
byte bufferSize = sizeof(bufferATQA);
|
uint8_t bufferSize = sizeof(bufferATQA);
|
||||||
byte result = PICC_RequestA(bufferATQA, &bufferSize);
|
uint8_t result = PICC_RequestA(bufferATQA, &bufferSize);
|
||||||
return (result == STATUS_OK || result == STATUS_COLLISION);
|
return (result == STATUS_OK || result == STATUS_COLLISION);
|
||||||
} // End PICC_IsNewCardPresent()
|
} // End PICC_IsNewCardPresent()
|
||||||
|
|
||||||
@@ -1746,6 +1747,6 @@ bool MFRC522::PICC_IsNewCardPresent() {
|
|||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
bool MFRC522::PICC_ReadCardSerial() {
|
bool MFRC522::PICC_ReadCardSerial() {
|
||||||
byte result = PICC_Select(&uid);
|
uint8_t result = PICC_Select(&uid);
|
||||||
return (result == STATUS_OK);
|
return (result == STATUS_OK);
|
||||||
} // End PICC_ReadCardSerial()
|
} // End PICC_ReadCardSerial()
|
||||||
|
@@ -78,7 +78,8 @@
|
|||||||
#ifndef MFRC522_h
|
#ifndef MFRC522_h
|
||||||
#define MFRC522_h
|
#define MFRC522_h
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <cstdint>
|
||||||
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
// Firmware data for self-test
|
// Firmware data for self-test
|
||||||
@@ -87,7 +88,7 @@
|
|||||||
//
|
//
|
||||||
// Version 0.0 (0x90)
|
// Version 0.0 (0x90)
|
||||||
// Philips Semiconductors; Preliminary Specification Revision 2.0 - 01 August 2005; 16.1 Sefttest
|
// Philips Semiconductors; Preliminary Specification Revision 2.0 - 01 August 2005; 16.1 Sefttest
|
||||||
const byte MFRC522_firmware_referenceV0_0[] = {
|
const uint8_t MFRC522_firmware_referenceV0_0[] = {
|
||||||
0x00, 0x87, 0x98, 0x0f, 0x49, 0xFF, 0x07, 0x19,
|
0x00, 0x87, 0x98, 0x0f, 0x49, 0xFF, 0x07, 0x19,
|
||||||
0xBF, 0x22, 0x30, 0x49, 0x59, 0x63, 0xAD, 0xCA,
|
0xBF, 0x22, 0x30, 0x49, 0x59, 0x63, 0xAD, 0xCA,
|
||||||
0x7F, 0xE3, 0x4E, 0x03, 0x5C, 0x4E, 0x49, 0x50,
|
0x7F, 0xE3, 0x4E, 0x03, 0x5C, 0x4E, 0x49, 0x50,
|
||||||
@@ -99,7 +100,7 @@ const byte MFRC522_firmware_referenceV0_0[] = {
|
|||||||
};
|
};
|
||||||
// Version 1.0 (0x91)
|
// Version 1.0 (0x91)
|
||||||
// NXP Semiconductors; Rev. 3.8 - 17 September 2014; 16.1.1 Self test
|
// NXP Semiconductors; Rev. 3.8 - 17 September 2014; 16.1.1 Self test
|
||||||
const byte MFRC522_firmware_referenceV1_0[] = {
|
const uint8_t MFRC522_firmware_referenceV1_0[] = {
|
||||||
0x00, 0xC6, 0x37, 0xD5, 0x32, 0xB7, 0x57, 0x5C,
|
0x00, 0xC6, 0x37, 0xD5, 0x32, 0xB7, 0x57, 0x5C,
|
||||||
0xC2, 0xD8, 0x7C, 0x4D, 0xD9, 0x70, 0xC7, 0x73,
|
0xC2, 0xD8, 0x7C, 0x4D, 0xD9, 0x70, 0xC7, 0x73,
|
||||||
0x10, 0xE6, 0xD2, 0xAA, 0x5E, 0xA1, 0x3E, 0x5A,
|
0x10, 0xE6, 0xD2, 0xAA, 0x5E, 0xA1, 0x3E, 0x5A,
|
||||||
@@ -111,7 +112,7 @@ const byte MFRC522_firmware_referenceV1_0[] = {
|
|||||||
};
|
};
|
||||||
// Version 2.0 (0x92)
|
// Version 2.0 (0x92)
|
||||||
// NXP Semiconductors; Rev. 3.8 - 17 September 2014; 16.1.1 Self test
|
// NXP Semiconductors; Rev. 3.8 - 17 September 2014; 16.1.1 Self test
|
||||||
const byte MFRC522_firmware_referenceV2_0[] = {
|
const uint8_t MFRC522_firmware_referenceV2_0[] = {
|
||||||
0x00, 0xEB, 0x66, 0xBA, 0x57, 0xBF, 0x23, 0x95,
|
0x00, 0xEB, 0x66, 0xBA, 0x57, 0xBF, 0x23, 0x95,
|
||||||
0xD0, 0xE3, 0x0D, 0x3D, 0x27, 0x89, 0x5C, 0xDE,
|
0xD0, 0xE3, 0x0D, 0x3D, 0x27, 0x89, 0x5C, 0xDE,
|
||||||
0x9D, 0x3B, 0xA7, 0x00, 0x21, 0x5B, 0x89, 0x82,
|
0x9D, 0x3B, 0xA7, 0x00, 0x21, 0x5B, 0x89, 0x82,
|
||||||
@@ -123,7 +124,7 @@ const byte MFRC522_firmware_referenceV2_0[] = {
|
|||||||
};
|
};
|
||||||
// Clone
|
// Clone
|
||||||
// Fudan Semiconductor FM17522 (0x88)
|
// Fudan Semiconductor FM17522 (0x88)
|
||||||
const byte FM17522_firmware_reference[] = {
|
const uint8_t FM17522_firmware_reference[] = {
|
||||||
0x00, 0xD6, 0x78, 0x8C, 0xE2, 0xAA, 0x0C, 0x18,
|
0x00, 0xD6, 0x78, 0x8C, 0xE2, 0xAA, 0x0C, 0x18,
|
||||||
0x2A, 0xB8, 0x7A, 0x7F, 0xD3, 0x6A, 0xCF, 0x0B,
|
0x2A, 0xB8, 0x7A, 0x7F, 0xD3, 0x6A, 0xCF, 0x0B,
|
||||||
0xB1, 0x37, 0x63, 0x4B, 0x69, 0xAE, 0x91, 0xC7,
|
0xB1, 0x37, 0x63, 0x4B, 0x69, 0xAE, 0x91, 0xC7,
|
||||||
@@ -302,38 +303,38 @@ public:
|
|||||||
|
|
||||||
// A struct used for passing the UID of a PICC.
|
// A struct used for passing the UID of a PICC.
|
||||||
typedef struct {
|
typedef struct {
|
||||||
byte size; // Number of bytes in the UID. 4, 7 or 10.
|
uint8_t size; // Number of bytes in the UID. 4, 7 or 10.
|
||||||
byte uidByte[10];
|
uint8_t uidByte[10];
|
||||||
byte sak; // The SAK (Select acknowledge) byte returned from the PICC after successful selection.
|
uint8_t sak; // The SAK (Select acknowledge) byte returned from the PICC after successful selection.
|
||||||
} Uid;
|
} Uid;
|
||||||
|
|
||||||
// A struct used for passing a MIFARE Crypto1 key
|
// A struct used for passing a MIFARE Crypto1 key
|
||||||
typedef struct {
|
typedef struct {
|
||||||
byte keyByte[MF_KEY_SIZE];
|
uint8_t keyByte[MF_KEY_SIZE];
|
||||||
} MIFARE_Key;
|
} MIFARE_Key;
|
||||||
|
|
||||||
// Member variables
|
// Member variables
|
||||||
Uid uid; // Used by PICC_ReadCardSerial().
|
Uid uid; // Used by PICC_ReadCardSerial().
|
||||||
|
|
||||||
// Size of the MFRC522 FIFO
|
// Size of the MFRC522 FIFO
|
||||||
static const byte FIFO_SIZE = 64; // The FIFO is 64 bytes.
|
static const uint8_t FIFO_SIZE = 64; // The FIFO is 64 bytes.
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Functions for setting up the Arduino
|
// Functions for setting up the Arduino
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
MFRC522(byte chipAddress, byte resetPowerDownPin);
|
MFRC522(uint8_t chipAddress, uint8_t resetPowerDownPin);
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Basic interface functions for communicating with the MFRC522
|
// Basic interface functions for communicating with the MFRC522
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
void PCD_WriteRegister(byte reg, byte value);
|
void PCD_WriteRegister(uint8_t reg, uint8_t value);
|
||||||
void PCD_WriteRegister(byte reg, byte count, byte *values);
|
void PCD_WriteRegister(uint8_t reg, uint8_t count, uint8_t *values);
|
||||||
byte PCD_ReadRegister(byte reg);
|
uint8_t PCD_ReadRegister(uint8_t reg);
|
||||||
void PCD_ReadRegister(byte reg, byte count, byte *values, byte rxAlign = 0);
|
void PCD_ReadRegister(uint8_t reg, uint8_t count, uint8_t *values, uint8_t rxAlign = 0);
|
||||||
void setBitMask(unsigned char reg, unsigned char mask);
|
void setBitMask(unsigned char reg, unsigned char mask);
|
||||||
void PCD_SetRegisterBitMask(byte reg, byte mask);
|
void PCD_SetRegisterBitMask(uint8_t reg, uint8_t mask);
|
||||||
void PCD_ClearRegisterBitMask(byte reg, byte mask);
|
void PCD_ClearRegisterBitMask(uint8_t reg, uint8_t mask);
|
||||||
byte PCD_CalculateCRC(byte *data, byte length, byte *result);
|
uint8_t PCD_CalculateCRC(uint8_t *data, uint8_t length, uint8_t *result);
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Functions for manipulating the MFRC522
|
// Functions for manipulating the MFRC522
|
||||||
@@ -342,54 +343,54 @@ public:
|
|||||||
void PCD_Reset();
|
void PCD_Reset();
|
||||||
void PCD_AntennaOn();
|
void PCD_AntennaOn();
|
||||||
void PCD_AntennaOff();
|
void PCD_AntennaOff();
|
||||||
byte PCD_GetAntennaGain();
|
uint8_t PCD_GetAntennaGain();
|
||||||
void PCD_SetAntennaGain(byte mask);
|
void PCD_SetAntennaGain(uint8_t mask);
|
||||||
bool PCD_PerformSelfTest();
|
bool PCD_PerformSelfTest();
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Functions for communicating with PICCs
|
// Functions for communicating with PICCs
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
byte PCD_TransceiveData(byte *sendData, byte sendLen, byte *backData, byte *backLen, byte *validBits = NULL, byte rxAlign = 0, bool checkCRC = false);
|
uint8_t PCD_TransceiveData(uint8_t *sendData, uint8_t sendLen, uint8_t *backData, uint8_t *backLen, uint8_t *validBits = NULL, uint8_t rxAlign = 0, bool checkCRC = false);
|
||||||
byte PCD_CommunicateWithPICC(byte command, byte waitIRq, byte *sendData, byte sendLen, byte *backData = NULL, byte *backLen = NULL, byte *validBits = NULL, byte rxAlign = 0, bool checkCRC = false);
|
uint8_t PCD_CommunicateWithPICC(uint8_t command, uint8_t waitIRq, uint8_t *sendData, uint8_t sendLen, uint8_t *backData = NULL, uint8_t *backLen = NULL, uint8_t *validBits = NULL, uint8_t rxAlign = 0, bool checkCRC = false);
|
||||||
byte PICC_RequestA(byte *bufferATQA, byte *bufferSize);
|
uint8_t PICC_RequestA(uint8_t *bufferATQA, uint8_t *bufferSize);
|
||||||
byte PICC_WakeupA(byte *bufferATQA, byte *bufferSize);
|
uint8_t PICC_WakeupA(uint8_t *bufferATQA, uint8_t *bufferSize);
|
||||||
byte PICC_REQA_or_WUPA(byte command, byte *bufferATQA, byte *bufferSize);
|
uint8_t PICC_REQA_or_WUPA(uint8_t command, uint8_t *bufferATQA, uint8_t *bufferSize);
|
||||||
byte PICC_Select(Uid *uid, byte validBits = 0);
|
uint8_t PICC_Select(Uid *uid, uint8_t validBits = 0);
|
||||||
byte PICC_HaltA();
|
uint8_t PICC_HaltA();
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Functions for communicating with MIFARE PICCs
|
// Functions for communicating with MIFARE PICCs
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
byte PCD_Authenticate(byte command, byte blockAddr, MIFARE_Key *key, Uid *uid);
|
uint8_t PCD_Authenticate(uint8_t command, uint8_t blockAddr, MIFARE_Key *key, Uid *uid);
|
||||||
void PCD_StopCrypto1();
|
void PCD_StopCrypto1();
|
||||||
byte MIFARE_Read(byte blockAddr, byte *buffer, byte *bufferSize);
|
uint8_t MIFARE_Read(uint8_t blockAddr, uint8_t *buffer, uint8_t *bufferSize);
|
||||||
byte MIFARE_Write(byte blockAddr, byte *buffer, byte bufferSize);
|
uint8_t MIFARE_Write(uint8_t blockAddr, uint8_t *buffer, uint8_t bufferSize);
|
||||||
byte MIFARE_Decrement(byte blockAddr, long delta);
|
uint8_t MIFARE_Decrement(uint8_t blockAddr, long delta);
|
||||||
byte MIFARE_Increment(byte blockAddr, long delta);
|
uint8_t MIFARE_Increment(uint8_t blockAddr, long delta);
|
||||||
byte MIFARE_Restore(byte blockAddr);
|
uint8_t MIFARE_Restore(uint8_t blockAddr);
|
||||||
byte MIFARE_Transfer(byte blockAddr);
|
uint8_t MIFARE_Transfer(uint8_t blockAddr);
|
||||||
byte MIFARE_Ultralight_Write(byte page, byte *buffer, byte bufferSize);
|
uint8_t MIFARE_Ultralight_Write(uint8_t page, uint8_t *buffer, uint8_t bufferSize);
|
||||||
byte MIFARE_GetValue(byte blockAddr, long *value);
|
uint8_t MIFARE_GetValue(uint8_t blockAddr, long *value);
|
||||||
byte MIFARE_SetValue(byte blockAddr, long value);
|
uint8_t MIFARE_SetValue(uint8_t blockAddr, long value);
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Support functions
|
// Support functions
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
byte PCD_MIFARE_Transceive(byte *sendData, byte sendLen, bool acceptTimeout = false);
|
uint8_t PCD_MIFARE_Transceive(uint8_t *sendData, uint8_t sendLen, bool acceptTimeout = false);
|
||||||
// old function used too much memory, now name moved to flash; if you need char, copy from flash to memory
|
// old function used too much memory, now name moved to flash; if you need char, copy from flash to memory
|
||||||
//const char *GetStatusCodeName(byte code);
|
//const char *GetStatusCodeName(byte code);
|
||||||
const char *GetStatusCodeName(byte code);
|
const char *GetStatusCodeName(uint8_t code);
|
||||||
byte PICC_GetType(byte sak);
|
uint8_t PICC_GetType(uint8_t sak);
|
||||||
// old function used too much memory, now name moved to flash; if you need char, copy from flash to memory
|
// old function used too much memory, now name moved to flash; if you need char, copy from flash to memory
|
||||||
//const char *PICC_GetTypeName(byte type);
|
//const char *PICC_GetTypeName(byte type);
|
||||||
const char *PICC_GetTypeName(byte type);
|
const char *PICC_GetTypeName(uint8_t type);
|
||||||
void PICC_DumpToSerial(Uid *uid);
|
void PICC_DumpToSerial(Uid *uid);
|
||||||
void PICC_DumpMifareClassicToSerial(Uid *uid, byte piccType, MIFARE_Key *key);
|
void PICC_DumpMifareClassicToSerial(Uid *uid, uint8_t piccType, MIFARE_Key *key);
|
||||||
void PICC_DumpMifareClassicSectorToSerial(Uid *uid, MIFARE_Key *key, byte sector);
|
void PICC_DumpMifareClassicSectorToSerial(Uid *uid, MIFARE_Key *key, uint8_t sector);
|
||||||
void PICC_DumpMifareUltralightToSerial();
|
void PICC_DumpMifareUltralightToSerial();
|
||||||
void MIFARE_SetAccessBits(byte *accessBitBuffer, byte g0, byte g1, byte g2, byte g3);
|
void MIFARE_SetAccessBits(uint8_t *accessBitBuffer, uint8_t g0, uint8_t g1, uint8_t g2, uint8_t g3);
|
||||||
bool MIFARE_OpenUidBackdoor(bool logErrors);
|
bool MIFARE_OpenUidBackdoor(bool logErrors);
|
||||||
bool MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors);
|
bool MIFARE_SetUid(uint8_t *newUid, uint8_t uidSize, bool logErrors);
|
||||||
bool MIFARE_UnbrickUidSector(bool logErrors);
|
bool MIFARE_UnbrickUidSector(bool logErrors);
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -399,9 +400,9 @@ public:
|
|||||||
bool PICC_ReadCardSerial();
|
bool PICC_ReadCardSerial();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
byte _chipAddress;
|
uint8_t _chipAddress;
|
||||||
byte _resetPowerDownPin; // Arduino pin connected to MFRC522's reset and power down input (Pin 6, NRSTPD, active low)
|
uint8_t _resetPowerDownPin; // Arduino pin connected to MFRC522's reset and power down input (Pin 6, NRSTPD, active low)
|
||||||
byte MIFARE_TwoStepHelper(byte command, byte blockAddr, long data);
|
uint8_t MIFARE_TwoStepHelper(uint8_t command, uint8_t blockAddr, long data);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user