10#ifndef M5_UNIT_RFID_UNIT_MFRC522_HPP
11#define M5_UNIT_RFID_UNIT_MFRC522_HPP
13#include <M5UnitComponent.hpp>
16#include <nfc/a/nfca.hpp>
99 m5::nfc::NFC
mode{m5::nfc::NFC::A};
114 explicit UnitMFRC522(
const uint8_t addr = DEFAULT_ADDRESS) : Component(addr)
116 auto ccfg = component_config();
117 ccfg.clock = 400 * 1000U;
118 component_config(ccfg);
131 virtual bool begin()
override;
137 virtual void update(
const bool force =
false)
override;
165 return m5::nfc::NFC::A;
176 return mode == m5::nfc::NFC::A;
184 bool softReset(
const bool blocking =
true);
193 bool ret = self_test();
194 return ret &&
begin();
314 bool calculateCRC(uint16_t& result,
const uint8_t* buf,
const uint8_t len);
336 bool nfcaTransceive(uint8_t* rx, uint16_t& rx_len,
const uint8_t* tx,
const uint16_t tx_len,
337 const uint32_t timeout_ms);
346 return request_wakeup(atqa,
true);
355 return request_wakeup(atqa,
false);
371 bool select(
const m5::nfc::a::PICC& picc);
379 bool readBlock(uint8_t rx[16],
const uint8_t block);
386 bool writeBlock(
const uint8_t block,
const uint8_t tx[16]);
404 const m5::nfc::a::PICC& picc,
const uint8_t block,
405 const m5::nfc::a::mifare::classic::Key& key = m5::nfc::a::mifare::classic::DEFAULT_KEY)
407 return mifare_classic_authenticate(m5::nfc::a::Command::AUTH_WITH_KEY_A, picc, block, key);
417 const m5::nfc::a::PICC& picc,
const uint8_t block,
418 const m5::nfc::a::mifare::classic::Key& key = m5::nfc::a::mifare::classic::DEFAULT_KEY)
420 return mifare_classic_authenticate(m5::nfc::a::Command::AUTH_WITH_KEY_B, picc, block, key);
441 bool modify_bit_register8(
const uint8_t reg,
const uint8_t set_mask,
const uint8_t clear_mask);
442 bool set_bit_register8(
const uint8_t reg,
const uint8_t bits);
443 bool clear_bit_register8(
const uint8_t reg,
const uint8_t bits);
444 inline bool change_bit_register8(
const uint8_t reg,
const uint8_t bits,
const uint8_t mask)
446 return modify_bit_register8(reg, mask & bits, mask);
448 bool read_register_with_align(
const uint8_t reg, uint8_t* buf,
const uint8_t len,
const uint8_t align);
449 bool write_pcd_command(
const mfrc522::Command cmd);
451 bool reset_baud_rates();
452 bool flush_fifo_buffer();
453 bool wait_comm_irq(
const uint8_t irq,
const uint32_t duration);
454 bool wait_div_irq(
const uint8_t irq,
const uint32_t duration);
457 bool transmit_command(
const mfrc522::Command cmd,
const uint8_t* buf,
const uint8_t len,
const uint8_t txLast = 0,
458 const uint8_t rxAlign = 0);
459 bool transceive(uint8_t* rbuf, uint16_t& rlen,
const uint8_t* buf,
const uint16_t len,
const uint32_t timeout_ms,
460 uint8_t& validBits,
const uint8_t rxAlign = 0,
const bool crc =
false, uint8_t* err =
nullptr);
465 bool read_block(uint8_t* rbuf, uint8_t& rlen,
const uint8_t addr);
466 bool write_block(
const uint8_t block,
const uint8_t* buf,
const uint8_t len);
467 bool write_page(
const uint8_t page,
const uint8_t* buf,
const uint8_t len);
470 bool request_wakeup(uint16_t& atqa,
const bool request);
471 bool anti_collision(
const uint8_t cascadeLevel, uint8_t* buf);
474 bool mifare_classic_authenticate(
const m5::nfc::a::Command cmd,
const m5::nfc::a::PICC& picc,
const uint8_t block,
475 const m5::nfc::a::mifare::classic::Key& key);
476 bool mifare_classic_transceive(
const m5::nfc::a::Command cmd,
const uint8_t block,
const uint32_t timeout_ms);
477 bool mifare_classic_transceive(
const uint8_t* buf,
const uint8_t len,
const uint32_t timeout_ms,
478 const bool usingtimeout =
false);
481 inline bool calculate_crc(uint16_t& result,
const uint8_t* buf,
const uint8_t len)
487 virtual bool self_test();
491 uint16_t _tprescaler{};
498constexpr uint8_t COMMAND_REG{0x01};
499constexpr uint8_t COM_IEN_REG{0x02};
500constexpr uint8_t DIV_IEN_REG{0x03};
501constexpr uint8_t COM_IRQ_REG{0x04};
502constexpr uint8_t DIV_IRQ_REG{0x05};
503constexpr uint8_t ERROR_REG{0x06};
504constexpr uint8_t STATUS2_REG{0x08};
505constexpr uint8_t FIFO_DATA_REG{0x09};
506constexpr uint8_t FIFO_LEVEL_REG{0x0A};
507constexpr uint8_t WATER_LEVEL_REG{0x0B};
508constexpr uint8_t CONTROL_REG{0x0C};
509constexpr uint8_t BIT_FRAMING_REG{0x0D};
510constexpr uint8_t COLL_REG{0x0E};
513constexpr uint8_t MODE_REG{0x11};
514constexpr uint8_t TX_MODE_REG{0x12};
515constexpr uint8_t RX_MODE_REG{0x13};
516constexpr uint8_t TX_CONTROL_REG{0x14};
517constexpr uint8_t TX_ASK_REG{0x15};
518constexpr uint8_t TX_SEL_REG{0x16};
519constexpr uint8_t RX_SEL_REG{0x17};
520constexpr uint8_t RX_THRESHOLD_REG{0x18};
521constexpr uint8_t DEMOD_REG{0x19};
522constexpr uint8_t MF_TX_REG{0x1C};
523constexpr uint8_t MF_RX_REG{0x1D};
526constexpr uint8_t CRC_RESULT_REGH{0x21};
527constexpr uint8_t CRC_RESULT_REGL{0x22};
528constexpr uint8_t MOD_WIDTH_REG{0x24};
529constexpr uint8_t RFC_FG_REG{0x26};
530constexpr uint8_t GSN_REG{0x27};
531constexpr uint8_t CW_GSP_REG{0x28};
532constexpr uint8_t MOD_GSP_REG{0x29};
533constexpr uint8_t TMODE_REG{0x2A};
534constexpr uint8_t TPRESCALER_REG_L{0x2B};
535constexpr uint8_t TRELOAD_REG_H{0x2C};
536constexpr uint8_t TRELOAD_REG_L{0x2D};
539constexpr uint8_t AUTO_TEST_REG{0x36};
540constexpr uint8_t VERSION_REG{0x37};
Radio frequency identification unit.
Definition unit_MFRC522.hpp:89
config_t config()
Gets the configuration.
Definition unit_MFRC522.hpp:145
bool readAntennaStatus(bool &status)
Read the antenna status.
Definition unit_MFRC522.cpp:269
bool mifareClassicAuthenticateA(const m5::nfc::a::PICC &picc, const uint8_t block, const m5::nfc::a::mifare::classic::Key &key=m5::nfc::a::mifare::classic::DEFAULT_KEY)
Authentication using keyA of the specified block.
Definition unit_MFRC522.hpp:403
bool selectWithAnticollision(bool &completed, m5::nfc::a::PICC &picc, const uint8_t lv)
Select PICC with anti-collision.
Definition unit_MFRC522.cpp:516
bool turnOnAntenna()
Turn on the antenna.
Definition unit_MFRC522.cpp:280
virtual ~UnitMFRC522()
Destructor.
Definition unit_MFRC522.hpp:123
bool writeTPrescaler(const uint16_t tprescale)
Write the TPrescaler.
Definition unit_MFRC522.cpp:252
bool readReceiverGain(mfrc522::ReceiverGain &gain)
Gets the receiver gain.
Definition unit_MFRC522.cpp:306
virtual bool configureNFCMode(const m5::nfc::NFC mode)
Configure NFC mode.
Definition unit_MFRC522.hpp:173
bool writeModGsP(const uint8_t value)
Write the ModGsP register.
Definition unit_MFRC522.cpp:355
bool select(const m5::nfc::a::PICC &picc)
Select specific PICC.
Definition unit_MFRC522.cpp:588
bool readBlock(uint8_t rx[16], const uint8_t block)
Read the 1 block / 4 page (16 bytes)
Definition unit_MFRC522.cpp:628
bool writeCWGsP(const uint8_t value)
Write the CWGsP register.
Definition unit_MFRC522.cpp:341
bool readRxThreshold(uint8_t &value)
Read the RxThreshold register.
Definition unit_MFRC522.cpp:364
bool readGsN(uint8_t &value)
Read the GsN register (N-driver conductance: CWGsN[7:4] / ModGsN[3:0])
Definition unit_MFRC522.cpp:326
bool mifareClassicAuthenticateB(const m5::nfc::a::PICC &picc, const uint8_t block, const m5::nfc::a::mifare::classic::Key &key=m5::nfc::a::mifare::classic::DEFAULT_KEY)
Authentication using keyB of the specified block.
Definition unit_MFRC522.hpp:416
UnitMFRC522(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_MFRC522.hpp:114
void config(const config_t &cfg)
Set the configuration.
Definition unit_MFRC522.hpp:153
bool nfcaTransceive(uint8_t *rx, uint16_t &rx_len, const uint8_t *tx, const uint16_t tx_len, const uint32_t timeout_ms)
Transceive.
Definition unit_MFRC522.cpp:184
bool selfTest()
Self test.
Definition unit_MFRC522.hpp:191
bool writeReceiverGain(const mfrc522::ReceiverGain gain)
Write the receiver gain.
Definition unit_MFRC522.cpp:316
bool writeGsN(const uint8_t value)
Write the GsN register.
Definition unit_MFRC522.cpp:331
bool calculateSoftwareCRC(uint16_t &result, const uint8_t *buf, const uint8_t len)
Calculate CRC by software.
Definition unit_MFRC522.cpp:415
bool writeRxThreshold(const uint8_t value)
Write the RxThreshold register.
Definition unit_MFRC522.cpp:369
bool calculateCRC(uint16_t &result, const uint8_t *buf, const uint8_t len)
Calculate CRC by hardware.
Definition unit_MFRC522.cpp:378
bool request(uint16_t &atqa)
Request for idle PICC.
Definition unit_MFRC522.hpp:344
bool readTPrescaler(uint16_t &tprescale)
Read the TPrescaler.
Definition unit_MFRC522.cpp:242
bool mifareClassicValueBlock(const m5::nfc::a::Command cmd, const uint8_t block, const uint32_t arg=0)
Operation for the value block.
Definition unit_MFRC522.cpp:683
bool turnOffAntenna()
Turn off the antenna.
Definition unit_MFRC522.cpp:293
virtual void update(const bool force=false) override
Update internal state.
Definition unit_MFRC522.cpp:179
bool writeBlock(const uint8_t block, const uint8_t tx[16])
Write the 1 block.
Definition unit_MFRC522.cpp:653
virtual m5::nfc::NFC NFCMode() const
Gets the current operating mode.
Definition unit_MFRC522.hpp:163
bool hlt()
Hlt for PICC.
Definition unit_MFRC522.cpp:662
bool wakeup(uint16_t &atqa)
Wakeup for idle/halt PICC.
Definition unit_MFRC522.hpp:353
virtual bool begin() override
Begin the unit.
Definition unit_MFRC522.cpp:139
bool softReset(const bool blocking=true)
Software reset.
Definition unit_MFRC522.cpp:220
bool readModGsP(uint8_t &value)
Read the ModGsP register (P-driver conductance during modulation)
Definition unit_MFRC522.cpp:350
bool mifareClassicStopCrypto1()
Exit from authenticated state for MIFARE classic.
Definition unit_MFRC522.cpp:678
bool readCWGsP(uint8_t &value)
Read the CWGsP register (P-driver conductance during no modulation)
Definition unit_MFRC522.cpp:336
Top level namespace of M5Stack.
Settings for begin.
Definition unit_MFRC522.hpp:97
bool enable_antenna
Enable antenna on begin if true.
Definition unit_MFRC522.hpp:103
uint8_t mode_reg
mode reg value. See also 9.3.2.2 ModeReg register
Definition unit_MFRC522.hpp:101
m5::nfc::NFC mode
Initial NFC mode applied at begin()
Definition unit_MFRC522.hpp:99
mfrc522::ReceiverGain receiver_gain
The receiver’s signal voltage gain factor.
Definition unit_MFRC522.hpp:105
bool software_crc
Using software CRC.
Definition unit_MFRC522.hpp:107
ReceiverGain
The receiver’s signal voltage gain factor.
Definition unit_MFRC522.hpp:51
Error
API error code.
Definition unit_MFRC522.hpp:66
@ TIMEOUT
Timeout occurs (0x83)
@ INTERNAL
Internal error.
@ CANNOT_RESOLVE_COLLISION
Collision resolution failed (0x87)
@ COMMUNICATION
Error in communication (0x81)
@ UID_NOT_COMPLETED
UID is not yet complete.
@ OCCUR_COLLISION
Collision occurs.
@ MIFARE_NACK
MIFARE NACK detection (0x84)
@ ARGUMENT
Error caused by arguments (0x80)
@ REGISTER
Error by error register value (0x82)
@ AUTH
Authentication error(0x86)
constexpr uint16_t MAX_FIFO_DEPTH
Maximum FIFO depth.
Definition unit_MFRC522.hpp:27
Command
PCD command.
Definition unit_MFRC522.hpp:33
@ SoftReset
Resets the MFRC522.
@ CalcCRC
Activates the CRC coprocessor or performs a self test.
@ NoCmdChange
No command change.
@ Receive
Activates the receiver circuits.
@ GenerateRandomID
Generates a 10-byte random ID number.
@ Transmit
Transmits data from the FIFO buffer.
@ MFAuthent
Performs the MIFARE standard authentication as a reader.
@ Mem
Stores 25 bytes into the internal buffer.
@ Idle
No action, cancels current command execution.