90 const byte MFRC522_firmware_referenceV0_0[] = {
91 0x00, 0x87, 0x98, 0x0f, 0x49, 0xFF, 0x07, 0x19,
92 0xBF, 0x22, 0x30, 0x49, 0x59, 0x63, 0xAD, 0xCA,
93 0x7F, 0xE3, 0x4E, 0x03, 0x5C, 0x4E, 0x49, 0x50,
94 0x47, 0x9A, 0x37, 0x61, 0xE7, 0xE2, 0xC6, 0x2E,
95 0x75, 0x5A, 0xED, 0x04, 0x3D, 0x02, 0x4B, 0x78,
96 0x32, 0xFF, 0x58, 0x3B, 0x7C, 0xE9, 0x00, 0x94,
97 0xB4, 0x4A, 0x59, 0x5B, 0xFD, 0xC9, 0x29, 0xDF,
98 0x35, 0x96, 0x98, 0x9E, 0x4F, 0x30, 0x32, 0x8D
102 const byte MFRC522_firmware_referenceV1_0[] = {
103 0x00, 0xC6, 0x37, 0xD5, 0x32, 0xB7, 0x57, 0x5C,
104 0xC2, 0xD8, 0x7C, 0x4D, 0xD9, 0x70, 0xC7, 0x73,
105 0x10, 0xE6, 0xD2, 0xAA, 0x5E, 0xA1, 0x3E, 0x5A,
106 0x14, 0xAF, 0x30, 0x61, 0xC9, 0x70, 0xDB, 0x2E,
107 0x64, 0x22, 0x72, 0xB5, 0xBD, 0x65, 0xF4, 0xEC,
108 0x22, 0xBC, 0xD3, 0x72, 0x35, 0xCD, 0xAA, 0x41,
109 0x1F, 0xA7, 0xF3, 0x53, 0x14, 0xDE, 0x7E, 0x02,
110 0xD9, 0x0F, 0xB5, 0x5E, 0x25, 0x1D, 0x29, 0x79
114 const byte MFRC522_firmware_referenceV2_0[] = {
115 0x00, 0xEB, 0x66, 0xBA, 0x57, 0xBF, 0x23, 0x95,
116 0xD0, 0xE3, 0x0D, 0x3D, 0x27, 0x89, 0x5C, 0xDE,
117 0x9D, 0x3B, 0xA7, 0x00, 0x21, 0x5B, 0x89, 0x82,
118 0x51, 0x3A, 0xEB, 0x02, 0x0C, 0xA5, 0x00, 0x49,
119 0x7C, 0x84, 0x4D, 0xB3, 0xCC, 0xD2, 0x1B, 0x81,
120 0x5D, 0x48, 0x76, 0xD5, 0x71, 0x61, 0x21, 0xA9,
121 0x86, 0x96, 0x83, 0x38, 0xCF, 0x9D, 0x5B, 0x6D,
122 0xDC, 0x15, 0xBA, 0x3E, 0x7D, 0x95, 0x3B, 0x2F
126 const byte FM17522_firmware_reference[] = {
127 0x00, 0xD6, 0x78, 0x8C, 0xE2, 0xAA, 0x0C, 0x18,
128 0x2A, 0xB8, 0x7A, 0x7F, 0xD3, 0x6A, 0xCF, 0x0B,
129 0xB1, 0x37, 0x63, 0x4B, 0x69, 0xAE, 0x91, 0xC7,
130 0xC3, 0x97, 0xAE, 0x77, 0xF4, 0x37, 0xD7, 0x9B,
131 0x7C, 0xF5, 0x3C, 0x11, 0x8F, 0x15, 0xC3, 0xD7,
132 0xC1, 0x5B, 0x00, 0x2A, 0xD0, 0x75, 0xDE, 0x9E,
133 0x51, 0x64, 0xAB, 0x3E, 0xE9, 0x15, 0xB5, 0xAB,
134 0x56, 0x9A, 0x98, 0x82, 0x26, 0xEA, 0x2A, 0x62
140 static constexpr byte FIFO_SIZE = 64;
142 static constexpr uint8_t UNUSED_PIN = UINT8_MAX;
146 enum PCD_Register : byte {
149 CommandReg = 0x01 << 1,
150 ComIEnReg = 0x02 << 1,
151 DivIEnReg = 0x03 << 1,
152 ComIrqReg = 0x04 << 1,
153 DivIrqReg = 0x05 << 1,
154 ErrorReg = 0x06 << 1,
155 Status1Reg = 0x07 << 1,
156 Status2Reg = 0x08 << 1,
157 FIFODataReg = 0x09 << 1,
158 FIFOLevelReg = 0x0A << 1,
159 WaterLevelReg = 0x0B << 1,
160 ControlReg = 0x0C << 1,
161 BitFramingReg = 0x0D << 1,
168 TxModeReg = 0x12 << 1,
169 RxModeReg = 0x13 << 1,
170 TxControlReg = 0x14 << 1,
171 TxASKReg = 0x15 << 1,
172 TxSelReg = 0x16 << 1,
173 RxSelReg = 0x17 << 1,
174 RxThresholdReg = 0x18 << 1,
175 DemodReg = 0x19 << 1,
181 SerialSpeedReg = 0x1F << 1,
185 CRCResultRegH = 0x21 << 1,
186 CRCResultRegL = 0x22 << 1,
188 ModWidthReg = 0x24 << 1,
190 RFCfgReg = 0x26 << 1,
192 CWGsPReg = 0x28 << 1,
193 ModGsPReg = 0x29 << 1,
194 TModeReg = 0x2A << 1,
195 TPrescalerReg = 0x2B << 1,
196 TReloadRegH = 0x2C << 1,
197 TReloadRegL = 0x2D << 1,
198 TCounterValueRegH = 0x2E << 1,
199 TCounterValueRegL = 0x2F << 1,
203 TestSel1Reg = 0x31 << 1,
204 TestSel2Reg = 0x32 << 1,
205 TestPinEnReg = 0x33 << 1,
206 TestPinValueReg = 0x34 << 1,
207 TestBusReg = 0x35 << 1,
208 AutoTestReg = 0x36 << 1,
209 VersionReg = 0x37 << 1,
210 AnalogTestReg = 0x38 << 1,
211 TestDAC1Reg = 0x39 << 1,
212 TestDAC2Reg = 0x3A << 1,
213 TestADCReg = 0x3B << 1
221 enum PCD_Command : byte {
224 PCD_GenerateRandomID = 0x02,
227 PCD_NoCmdChange = 0x07,
229 PCD_Transceive = 0x0C,
230 PCD_MFAuthent = 0x0E,
236 enum PCD_RxGain : byte {
237 RxGain_18dB = 0x00 << 4,
238 RxGain_23dB = 0x01 << 4,
239 RxGain_18dB_2 = 0x02 << 4,
240 RxGain_23dB_2 = 0x03 << 4,
241 RxGain_33dB = 0x04 << 4,
242 RxGain_38dB = 0x05 << 4,
243 RxGain_43dB = 0x06 << 4,
244 RxGain_48dB = 0x07 << 4,
245 RxGain_min = 0x00 << 4,
246 RxGain_avg = 0x04 << 4,
247 RxGain_max = 0x07 << 4
251 enum PICC_Command : byte {
253 PICC_CMD_REQA = 0x26,
254 PICC_CMD_WUPA = 0x52,
256 PICC_CMD_SEL_CL1 = 0x93,
257 PICC_CMD_SEL_CL2 = 0x95,
258 PICC_CMD_SEL_CL3 = 0x97,
259 PICC_CMD_HLTA = 0x50,
263 PICC_CMD_MF_AUTH_KEY_A = 0x60,
264 PICC_CMD_MF_AUTH_KEY_B = 0x61,
265 PICC_CMD_MF_READ = 0x30,
266 PICC_CMD_MF_WRITE = 0xA0,
267 PICC_CMD_MF_DECREMENT = 0xC0,
268 PICC_CMD_MF_INCREMENT = 0xC1,
269 PICC_CMD_MF_RESTORE = 0xC2,
270 PICC_CMD_MF_TRANSFER = 0xB0,
273 PICC_CMD_UL_WRITE = 0xA2
284 enum PICC_Type : byte {
286 PICC_TYPE_ISO_14443_4 ,
287 PICC_TYPE_ISO_18092 ,
288 PICC_TYPE_MIFARE_MINI ,
289 PICC_TYPE_MIFARE_1K ,
290 PICC_TYPE_MIFARE_4K ,
291 PICC_TYPE_MIFARE_UL ,
292 PICC_TYPE_MIFARE_PLUS ,
293 PICC_TYPE_MIFARE_DESFIRE,
295 PICC_TYPE_NOT_COMPLETE = 0xff
300 enum StatusCode : byte {
306 STATUS_INTERNAL_ERROR ,
309 STATUS_MIFARE_NACK = 0xff
321 byte keyByte[MF_KEY_SIZE];
340 void PCD_ReadRegister(PCD_Register reg, byte count, byte* values, byte rxAlign = 0);
349 void PCD_Init(byte chipSelectPin, byte resetPowerDownPin);
360 StatusCode
PCD_TransceiveData(byte* sendData, byte sendLen, byte* backData, byte* backLen, byte* validBits =
nullptr, byte rxAlign = 0,
bool checkCRC =
false);
361 StatusCode
PCD_CommunicateWithPICC(byte command, byte waitIRq, byte* sendData, byte sendLen, byte* backData =
nullptr, byte* backLen =
nullptr, byte* validBits =
nullptr, byte rxAlign = 0,
bool checkCRC =
false);
362 StatusCode
PICC_RequestA(byte* bufferATQA, byte* bufferSize);
363 StatusCode
PICC_WakeupA(byte* bufferATQA, byte* bufferSize);
373 StatusCode
MIFARE_Read(byte blockAddr, byte* buffer, byte* bufferSize);
374 StatusCode
MIFARE_Write(byte blockAddr, byte* buffer, byte bufferSize);
410 byte _resetPowerDownPin;
StatusCode MIFARE_Transfer(byte blockAddr)
Definition: MFRC522.cpp:1039
void PCD_WriteRegister(PCD_Register reg, byte value)
Definition: MFRC522.cpp:47
StatusCode MIFARE_Decrement(byte blockAddr, int32_t delta)
Definition: MFRC522.cpp:969
StatusCode PCD_CommunicateWithPICC(byte command, byte waitIRq, byte *sendData, byte sendLen, byte *backData=nullptr, byte *backLen=nullptr, byte *validBits=nullptr, byte rxAlign=0, bool checkCRC=false)
Definition: MFRC522.cpp:443
bool PCD_PerformSelfTest()
Definition: MFRC522.cpp:330
StatusCode PCD_MIFARE_Transceive(byte *sendData, byte sendLen, bool acceptTimeout=false)
Definition: MFRC522.cpp:1167
virtual bool PICC_IsNewCardPresent()
Definition: MFRC522.cpp:1582
Handle SPI protocol.
Definition: SPI.h:15
StatusCode MIFARE_TwoStepHelper(byte command, byte blockAddr, int32_t data)
Definition: MFRC522.cpp:1013
void PCD_SetRegisterBitMask(PCD_Register reg, byte mask)
Definition: MFRC522.cpp:138
Definition: MFRC522.h:313
virtual StatusCode PICC_Select(Uid *uid, byte validBits=0)
Definition: MFRC522.cpp:586
void PCD_ClearRegisterBitMask(PCD_Register reg, byte mask)
Definition: MFRC522.cpp:150
void PCD_StopCrypto1()
Definition: MFRC522.cpp:854
void PCD_Init()
Definition: MFRC522.cpp:197
void PICC_DumpDetailsToSerial(Uid *uid)
Definition: MFRC522.cpp:1304
void PICC_DumpMifareClassicToSerial(Uid *uid, PICC_Type piccType, MIFARE_Key *key)
Definition: MFRC522.cpp:1336
void PCD_Reset()
Definition: MFRC522.cpp:266
void MIFARE_SetAccessBits(byte *accessBitBuffer, byte g0, byte g1, byte g2, byte g3)
Definition: MFRC522.cpp:1561
void PCD_AntennaOff()
Definition: MFRC522.cpp:294
StatusCode PICC_WakeupA(byte *bufferATQA, byte *bufferSize)
Definition: MFRC522.cpp:540
Definition: MFRC522.h:320
StatusCode MIFARE_Write(byte blockAddr, byte *buffer, byte bufferSize)
Definition: MFRC522.cpp:910
StatusCode PICC_REQA_or_WUPA(byte command, byte *bufferATQA, byte *bufferSize)
Definition: MFRC522.cpp:554
StatusCode PCD_TransceiveData(byte *sendData, byte sendLen, byte *backData, byte *backLen, byte *validBits=nullptr, byte rxAlign=0, bool checkCRC=false)
Definition: MFRC522.cpp:422
void PCD_SetAntennaGain(byte mask)
Definition: MFRC522.cpp:316
StatusCode PCD_CalculateCRC(byte *data, byte length, byte *result)
Definition: MFRC522.cpp:164
StatusCode MIFARE_Restore(byte blockAddr)
Definition: MFRC522.cpp:998
StatusCode MIFARE_Increment(byte blockAddr, int32_t delta)
Definition: MFRC522.cpp:984
StatusCode MIFARE_SetValue(byte blockAddr, int32_t value)
Definition: MFRC522.cpp:1089
void PICC_DumpMifareUltralightToSerial()
Definition: MFRC522.cpp:1517
StatusCode MIFARE_Ultralight_Write(byte page, byte *buffer, byte bufferSize)
Definition: MFRC522.cpp:939
void PCD_AntennaOn()
Definition: MFRC522.cpp:283
byte PCD_GetAntennaGain()
Definition: MFRC522.cpp:306
void PICC_DumpMifareClassicSectorToSerial(Uid *uid, MIFARE_Key *key, byte sector)
Definition: MFRC522.cpp:1376
StatusCode MIFARE_Read(byte blockAddr, byte *buffer, byte *bufferSize)
Definition: MFRC522.cpp:879
Definition: MFRC522.h:137
static PICC_Type PICC_GetType(byte sak)
Definition: MFRC522.cpp:1200
StatusCode PCD_Authenticate(byte command, byte blockAddr, MIFARE_Key *key, Uid *uid)
Definition: MFRC522.cpp:827
void PCD_DumpVersionToSerial()
Definition: MFRC522.cpp:1226
StatusCode PCD_NTAG216_AUTH(byte *passWord, byte pACK[])
Definition: MFRC522.cpp:1120
void PICC_DumpToSerial(Uid *uid)
Definition: MFRC522.cpp:1257
byte PCD_ReadRegister(PCD_Register reg)
Definition: MFRC522.cpp:84
StatusCode PICC_RequestA(byte *bufferATQA, byte *bufferSize)
Definition: MFRC522.cpp:527
StatusCode MIFARE_GetValue(byte blockAddr, int32_t *value)
Definition: MFRC522.cpp:1063
virtual bool PICC_ReadCardSerial()
Definition: MFRC522.cpp:1605
StatusCode PICC_HaltA()
Definition: MFRC522.cpp:782