Files
MTGcompanion/components/rc522/internal/rc522_pcd_internal.h

449 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "rc522_types_internal.h"
#include "rc522_pcd.h"
#ifdef __cplusplus
extern "C" {
#endif
#define RC522_PCD_MOD_WIDTH_REG_RESET_VALUE (38)
#define RC522_PCD_TX_MODE_REG_RESET_VALUE (0x00)
#define RC522_PCD_RX_MODE_REG_RESET_VALUE (0x00)
typedef enum
{
// Starts and stops command execution
RC522_PCD_COMMAND_REG = 0x01,
// Communication Interrupt Enable Register.
// Control bits to enable and disable the passing of interrupt requests
RC522_PCD_COM_INT_EN_REG = 0x02,
// Diverted Interrupt Enable Register.
// Control bits to enable and disable the passing of interrupt requests
RC522_PCD_DIV_INT_EN_REG = 0x03,
// Communication Interrupt request bits
RC522_PCD_COM_INT_REQ_REG = 0x04,
// Diverted Interrupt request bits
RC522_PCD_DIV_INT_REQ_REG = 0x05,
// Error bits showing the error status of the last command executed
RC522_PCD_ERROR_REG = 0x06,
// Contains status bits of the receiver, transmitter and data mode detector
RC522_PCD_STATUS_2_REG = 0x08,
// Input and output of 64 byte FIFO buffer
RC522_PCD_FIFO_DATA_REG = 0x09,
// Number of bytes stored in the FIFO buffer
RC522_PCD_FIFO_LEVEL_REG = 0x0A,
// Shows the MFRC522 software version
RC522_PCD_VERSION_REG = 0x37,
// Controls the logical behavior of the antenna driver pins TX1 and TX2
RC522_PCD_TX_CONTROL_REG = 0x14,
// Configures the receiver gain
RC522_PCD_RF_CFG_REG = 0x26,
// Miscellaneous control register
RC522_PCD_CONTROL_REG = 0x0C,
// Adjustments for bit-oriented frames
RC522_PCD_BIT_FRAMING_REG = 0x0D,
// Defines the first bit-collision detected on the RF interface
RC522_PCD_COLL_REG = 0x0E,
// MSB (higher bits) values of the CRC calculation
RC522_PCD_CRC_RESULT_MSB_REG = 0x21,
// LSB (lower bits) values of the CRC calculation
RC522_PCD_CRC_RESULT_LSB_REG = 0x22,
// Sets the modulation width
RC522_PCD_MOD_WIDTH_REG = 0x24,
// Defines the mode of the timer
RC522_PCD_TIMER_MODE_REG = 0x2A,
// Defines the timer prescaler settings
RC522_PCD_TIMER_PRESCALER_REG = 0x2B,
// MSB (higher bits) value of 16-bit timer reload value
RC522_PCD_TIMER_RELOAD_MSB_REG = 0x2C,
// LSB (lower bits) value of 16-bit timer reload value
RC522_PCD_TIMER_RELOAD_LSB_REG = 0x2D,
// Defines general modes for transmitting and receiving
RC522_PCD_MODE_REG = 0x11,
// Controls the setting of the transmission modulation
RC522_PCD_TX_ASK_REG = 0x15,
// Defines the data rate during transmission
RC522_PCD_TX_MODE_REG = 0x12,
// Defines the data rate during reception
RC522_PCD_RX_MODE_REG = 0x13,
} rc522_pcd_register_t;
enum // RC522_PCD_COLL_REG
{
/**
* all received bits will be cleared after a collision
* only used during bitwise anticollision at 106 kBd,
* otherwise it is set to logic 1
*/
RC522_PCD_VALUES_AFTER_COLL_BIT = BIT7,
/**
* no collision detected or the position of the collision is
* out of the range of CollPos[4:0]
*/
RC522_PCD_COLL_POS_NOT_VALID_BIT = BIT5,
};
enum // RC522_PCD_ERROR_REG
{
/**
* data is written into the FIFO buffer by the host during the MFAuthent
* command or if data is written into the FIFO buffer by the host during the
* time between sending the last bit on the RF interface and receiving the
* last bit on the RF interface
*/
RC522_PCD_WR_ERR_BIT = BIT6,
/**
* internal temperature sensor detects overheating, in which case the
* antenna drivers are automatically switched off
*/
RC522_PCD_TEMP_ERR_BIT = BIT5,
/**
* the host or a MFRC522’s internal state machine (e.g. receiver) tries to
* write data to the FIFO buffer even though it is already full
*/
RC522_PCD_BUFFER_OVFL_BIT = BIT4,
/**
* a bit-collision is detected
* cleared automatically at receiver start-up phase
* only valid during the bitwise anticollision at 106 kBd
* always set to logic 0 during communication protocols at 212 kBd,
* 424 kBd and 848 kBd
*/
RC522_PCD_COLL_ERR_BIT = BIT3,
/**
* the RxModeReg register’s RxCRCEn bit is set and the CRC calculation fails
* automatically cleared to logic 0 during receiver start-up phase
*/
RC522_PCD_CRC_ERR_BIT = BIT2,
/**
* parity check failed
* automatically cleared during receiver start-up phase
* only valid for ISO/IEC 14443 A/MIFARE communication at 106 kBd
*/
RC522_PCD_PARITY_ERR_BIT = BIT1,
/**
* set to logic 1 if the SOF is incorrect
* automatically cleared during receiver start-up phase
* bit is only valid for 106 kBd
* during the MFAuthent command, the ProtocolErr bit is set to logic 1 if the
* number of bytes received in one data stream is incorrect
*/
RC522_PCD_PROTOCOL_ERR_BIT = BIT0,
};
enum // RC522_PCD_COM_INT_REQ_REG
{
/**
* 1 - indicates that the marked bits in the ComIrqReg register are set
* 0 - indicates that the marked bits in the ComIrqReg register are cleared
*/
RC522_PCD_SET_1_BIT = BIT7,
/**
* set immediately after the last bit of the transmitted data was sent out
*/
RC522_PCD_TX_IRQ_BIT = BIT6,
/**
* receiver has detected the end of a valid data stream
* if the RxModeReg register’s RxNoErr bit is set to logic 1, the RxIRq bit is
* only set to logic 1 when data bytes are available in the FIFO
*/
RC522_PCD_RX_IRQ_BIT = BIT5,
/**
* If a command terminates, for example, when the CommandReg changes
* its value from any command to the Idle command (see Table 149 on page 70)
* if an unknown command is started, the CommandReg register
* Command[3:0] value changes to the idle state and the IdleIRq bit is set
* The microcontroller starting the Idle command does not set the IdleIRq bit
*/
RC522_PCD_IDLE_IRQ_BIT = BIT4,
/**
* the Status1Reg register’s HiAlert bit is set
* in opposition to the HiAlert bit, the HiAlertIRq bit stores this event and
* can only be reset as indicated by the Set1 bit in this register
*/
RC522_PCD_HI_ALERT_IRQ_BIT = BIT3,
/**
* Status1Reg register’s LoAlert bit is set
* in opposition to the LoAlert bit, the LoAlertIRq bit stores this event and
* can only be reset as indicated by the Set1 bit in this register
*/
RC522_PCD_LO_ALERT_IRQ_BIT = BIT2,
/**
* any error bit in the ErrorReg register is set
*/
RC522_PCD_ERR_IRQ_BIT = BIT1,
/**
* the timer decrements the timer value in register TCounterValReg to zero
*/
RC522_PCD_TIMER_IRQ_BIT = BIT0,
};
enum // RC522_PCD_COMMAND_REG
{
// Soft power-down mode entered
RC522_PCD_POWER_DOWN_BIT = BIT4,
};
enum // RC522_PCD_TX_CONTROL_REG
{
// Output signal on pin TX2 delivers the 13.56 MHz energy carrier modulated by the transmission data
RC522_PCD_TX2_RF_EN_BIT = BIT1,
// Output signal on pin TX1 delivers the 13.56 MHz energy carrier modulated by the transmission data
RC522_PCD_TX1_RF_EN_BIT = BIT0,
};
typedef enum
{
/**
* Places the MFRC522 in Idle mode. The Idle command also terminates itself.
*/
RC522_PCD_IDLE_CMD = 0b0000,
/**
* The FIFO buffer content is transferred to the CRC coprocessor and the CRC calculation is
* started. The calculation result is stored in the CRCResultReg register. The CRC
* calculation is not limited to a dedicated number of bytes. The calculation is not stopped
* when the FIFO buffer is empty during the data stream. The next byte written to the FIFO
* buffer is added to the calculation.
*
* The CRC preset value is controlled by the ModeReg register’s CRCPreset[1:0] bits. The
* value is loaded in to the CRC coprocessor when the command starts.
*
* This command must be terminated by writing a command to the CommandReg register,
* such as, the Idle command.
*
* If the AutoTestReg register’s SelfTest[3:0] bits are set correctly, the MFRC522 enters Self
* Test mode. Starting the CalcCRC command initiates a digital self test. The result of the
* self test is written to the FIFO buffer.
*/
RC522_PCD_CALC_CRC_CMD = 0b0011,
/**
* This command continuously repeats the transmission of data from the FIFO buffer and the
* reception of data from the RF field. The first action is transmit and after transmission the
* command is changed to receive a data stream.
*
* Each transmit process must be started by setting the BitFramingReg register’s StartSend
* bit to logic 1. This command must be cleared by writing any command to the
* CommandReg register
*/
RC522_PCD_TRANSCEIVE_CMD = 0b1100,
/**
* This command manages MIFARE authentication to enable a secure communication to
* any MIFARE Mini, MIFARE 1K and MIFARE 4K card
*/
RC522_PCD_MF_AUTH_CMD = 0b1110,
/**
* This command performs a reset of the device. The configuration data of the internal buffer
* remains unchanged. All registers are set to the reset values. This command automatically
* terminates when finished.
*/
RC522_PCD_SOFT_RESET_CMD = 0b1111,
} rc522_pcd_command_t;
enum // RC522_PCD_TIMER_MODE_REG
{
/**
* When 1:
* - Timer starts automatically at the end of the transmission in
* all communication modes at all speeds
* - If the RxModeReg register’s RxMultiple bit is not set, the
* timer stops immediately after receiving the 5th bit (1 start bit,
* 4 data bits)
* - If the RxMultiple bit is set to logic 1 the timer never stops, in
* which case the timer can be stopped by setting the
* ControlReg register’s TStopNow bit to logic 1
*
* When 0:
* - Indicates that the timer is not influenced by the protocol
*/
RC522_PCD_T_AUTO_BIT = BIT7,
};
enum // RC522_PCD_TX_ASK_REG
{
/**
* Forces a 100 % ASK modulation independent of the ModGsPReg register setting
*/
RC522_PCD_FORCE_100_ASK_BIT = BIT6,
};
enum // RC522_PCD_MODE_REG
{
// Transmitter can only be started if an RF field is generated
RC522_PCD_TX_WAIT_RF_BIT = BIT5,
/**
* Defines the polarity of pin MFIN
*
* 1 - Polarity of pin MFIN is active HIGH
* 0 - Polarity of pin MFIN is active LOW
*/
RC522_PCD_POL_MFIN_BIT = BIT3,
RC522_PCD_CRC_PRESET_1_BIT = BIT1,
RC522_PCD_CRC_PRESET_0_BIT = BIT0,
};
typedef enum
{
RC522_PCD_CRC_PRESET_0000H = (0x00), /* 0000h */
RC522_PCD_CRC_PRESET_6363H = (RC522_PCD_CRC_PRESET_0_BIT), /* 6363h */
RC522_PCD_CRC_PRESET_A671H = (RC522_PCD_CRC_PRESET_1_BIT), /* A671h */
RC522_PCD_CRC_PRESET_FFFFH = (RC522_PCD_CRC_PRESET_1_BIT | RC522_PCD_CRC_PRESET_0_BIT), /* FFFFh */
} rc522_pcd_crc_preset_value_t;
enum // RC522_PCD_DIV_INT_REQ_REG
{
// The CalcCRC command is active and all data is processed (CRC calculation is done)
RC522_PCD_CRC_IRQ_BIT = BIT2,
};
enum // RC522_PCD_FIFO_LEVEL_REG
{
/**
* Immediately clears the internal FIFO buffer’s read and write pointer
* and ErrorReg register’s BufferOvfl bit
*
* Reading this bit always returns 0
*/
RC522_PCD_FLUSH_BUFFER_BIT = BIT7,
};
enum // RC522_PCD_BIT_FRAMING_REG
{
/**
* Starts the transmission of data
* Only valid in combination with the Transceive command
*/
RC522_PCD_START_SEND_BIT = BIT7,
};
enum // RC522_PCD_STATUS_2_REG
{
/**
* Indicates that the MIFARE Crypto1 unit is switched on and
* therefore all data communication with the card is encrypted
* can only be set to logic 1 by a successful execution of the
* MFAuthent command.
* Only valid in Read/Write mode for MIFARE standard cards.
* This bit is cleared by software.
*/
RC522_PCD_MF_CRYPTO1_ON_BIT = BIT3,
};
enum // RC522_PCD_RX_MODE_REG
{
/**
* An invalid received data stream (less than 4 bits received) will
* be ignored and the receiver remains active
*/
RC522_PCD_RX_NO_ERR_BIT = BIT3,
};
typedef enum
{
RC522_PCD_FIRMWARE_CLONE = 0x88, // clone
RC522_PCD_FIRMWARE_00 = 0x90, // v0.0
RC522_PCD_FIRMWARE_10 = 0x91, // v1.0
RC522_PCD_FIRMWARE_20 = 0x92, // v2.0
RC522_PCD_FIRMWARE_COUNTERFEIT = 0x12, // counterfeit chip
} rc522_pcd_firmware_t;
typedef union
{
uint16_t value;
struct
{
uint8_t lsb;
uint8_t msb;
};
} rc522_pcd_crc_t;
esp_err_t rc522_pcd_reset(const rc522_handle_t rc522, uint32_t timeout_ms);
esp_err_t rc522_pcd_calculate_crc(const rc522_handle_t rc522, const rc522_bytes_t *bytes, rc522_pcd_crc_t *result);
esp_err_t rc522_pcd_init(const rc522_handle_t rc522);
esp_err_t rc522_pcd_firmware(const rc522_handle_t rc522, rc522_pcd_firmware_t *result);
char *rc522_pcd_firmware_name(rc522_pcd_firmware_t firmware);
esp_err_t rc522_pcd_stop_active_command(const rc522_handle_t rc522);
esp_err_t rc522_pcd_clear_all_com_interrupts(const rc522_handle_t rc522);
esp_err_t rc522_pcd_fifo_write(const rc522_handle_t rc522, const rc522_bytes_t *bytes);
esp_err_t rc522_pcd_fifo_read(const rc522_handle_t rc522, rc522_bytes_t *bytes);
esp_err_t rc522_pcd_fifo_flush(const rc522_handle_t rc522);
esp_err_t rc522_pcd_start_data_transmission(const rc522_handle_t rc522);
esp_err_t rc522_pcd_stop_data_transmission(const rc522_handle_t rc522);
esp_err_t rc522_pcd_stop_crypto1(const rc522_handle_t rc522);
esp_err_t rc522_pcd_rw_test(const rc522_handle_t rc522);
esp_err_t rc522_pcd_write_n(const rc522_handle_t rc522, rc522_pcd_register_t addr, const rc522_bytes_t *bytes);
esp_err_t rc522_pcd_write(const rc522_handle_t rc522, rc522_pcd_register_t addr, uint8_t val);
esp_err_t rc522_pcd_read_n(const rc522_handle_t rc522, rc522_pcd_register_t addr, rc522_bytes_t *bytes);
esp_err_t rc522_pcd_read(const rc522_handle_t rc522, rc522_pcd_register_t addr, uint8_t *value_ref);
esp_err_t rc522_pcd_set_bits(const rc522_handle_t rc522, rc522_pcd_register_t addr, uint8_t bits);
esp_err_t rc522_pcd_clear_bits(const rc522_handle_t rc522, rc522_pcd_register_t addr, uint8_t bits);
#ifdef __cplusplus
}
#endif