ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
st25r.h
Go to the documentation of this file.
1#pragma once
2
4#include "esphome/core/hal.h"
8#include <memory>
9#include <string>
10
11namespace esphome::st25r {
12
13// Space B registers have bit 0x40 set; the transport sends the 0xFB prefix before their address
54
66
67class ST25R : public PollingComponent, public nfc::Nfcc {
68 public:
75
76 void setup() override;
77 void dump_config() override;
78 void update() override;
79 void loop() override;
80
81 void set_reset_pin(GPIOPin *reset_pin) { this->reset_pin_ = reset_pin; }
82 void set_irq_pin(InternalGPIOPin *irq_pin) { this->irq_pin_ = irq_pin; }
83 void set_rf_power(uint8_t power) { this->rf_power_ = power; }
84
85 template<typename F> void add_on_tag_callback(F &&callback) { this->on_tag_callback_.add(std::forward<F>(callback)); }
86 template<typename F> void add_on_tag_removed_callback(F &&callback) {
87 this->on_tag_removed_callback_.add(std::forward<F>(callback));
88 }
89
90 protected:
91 virtual uint8_t read_register(uint8_t reg) = 0;
92 virtual void write_register(uint8_t reg, uint8_t value) = 0;
93 virtual void write_command(uint8_t command) = 0;
94 virtual void write_fifo(const uint8_t *data, size_t len) = 0;
95 virtual void read_fifo(uint8_t *data, size_t len) = 0;
96
97 bool reset_chip_();
98 void pulse_reset_();
99 void clear_irqs_();
100 void write_register_table_(const uint8_t (*table)[2], size_t count);
101 void field_on_();
102 void send_anticol_frame_();
103 bool transceive_ex_(const uint8_t *data, size_t len, uint8_t *resp, uint8_t resp_cap, uint8_t &resp_len,
104 uint32_t timeout_ms);
105 void process_state_();
106 void finish_scan_();
107 void finalize_scan_();
108 void remove_tag_();
109 static void isr(ST25R *arg);
110
113
114 // Consecutive empty polls before a tag counts as removed
115 static constexpr uint8_t MISS_THRESHOLD = 3;
116 static constexpr uint32_t FIELD_GUARD_MS = 10;
117
118 // IRQ_MAIN bit definitions
119 static constexpr uint8_t IRQ_RXE = 0x10;
120 static constexpr uint8_t IRQ_TXE = 0x08;
121 static constexpr uint8_t IRQ_COL = 0x04;
122
123 std::unique_ptr<nfc::NfcTag> current_tag_;
127 uint8_t rf_power_{15};
128 uint8_t miss_count_{0};
129 uint8_t irq_status_{0};
130 uint8_t cascade_level_{0};
132 volatile bool irq_fired_{false};
133
134 LazyCallbackManager<void(const std::string &, const nfc::NfcTag &)> on_tag_callback_;
135 LazyCallbackManager<void(const std::string &, const nfc::NfcTag &)> on_tag_removed_callback_;
136};
137
138} // namespace esphome::st25r
This class simplifies creating components that periodically check a state.
Definition component.h:519
uint32_t last_state_change_
Definition st25r.h:125
void write_register_table_(const uint8_t(*table)[2], size_t count)
Definition st25r.cpp:107
virtual void read_fifo(uint8_t *data, size_t len)=0
bool tag_found_this_scan_
Definition st25r.h:131
static constexpr uint8_t IRQ_COL
Definition st25r.h:121
static constexpr uint8_t IRQ_RXE
Definition st25r.h:119
static constexpr uint8_t MISS_THRESHOLD
Definition st25r.h:115
void set_reset_pin(GPIOPin *reset_pin)
Definition st25r.h:81
static constexpr uint8_t IRQ_TXE
Definition st25r.h:120
virtual void write_command(uint8_t command)=0
uint8_t miss_count_
Definition st25r.h:128
LazyCallbackManager< void(const std::string &, const nfc::NfcTag &)> on_tag_callback_
Definition st25r.h:134
void add_on_tag_callback(F &&callback)
Definition st25r.h:85
void set_rf_power(uint8_t power)
Definition st25r.h:83
bool transceive_ex_(const uint8_t *data, size_t len, uint8_t *resp, uint8_t resp_cap, uint8_t &resp_len, uint32_t timeout_ms)
Definition st25r.cpp:112
uint8_t cascade_level_
Definition st25r.h:130
void update() override
Definition st25r.cpp:61
void loop() override
Definition st25r.cpp:74
void send_anticol_frame_()
Definition st25r.cpp:362
volatile bool irq_fired_
Definition st25r.h:132
virtual void write_register(uint8_t reg, uint8_t value)=0
static constexpr uint32_t FIELD_GUARD_MS
Definition st25r.h:116
virtual void write_fifo(const uint8_t *data, size_t len)=0
LazyCallbackManager< void(const std::string &, const nfc::NfcTag &)> on_tag_removed_callback_
Definition st25r.h:135
void dump_config() override
Definition st25r.cpp:382
virtual uint8_t read_register(uint8_t reg)=0
InternalGPIOPin * irq_pin_
Definition st25r.h:112
void add_on_tag_removed_callback(F &&callback)
Definition st25r.h:86
static void isr(ST25R *arg)
Definition st25r.cpp:41
void set_irq_pin(InternalGPIOPin *irq_pin)
Definition st25r.h:82
GPIOPin * reset_pin_
Definition st25r.h:111
nfc::NfcTagUid scan_uid_
Definition st25r.h:124
std::unique_ptr< nfc::NfcTag > current_tag_
Definition st25r.h:123
uint8_t irq_status_
Definition st25r.h:129
void setup() override
Definition st25r.cpp:46
unsigned count
Definition gif.cpp:51
@ ST25R_REG_OP_CONTROL
Definition st25r.h:17
@ ST25R_REG_FIFO_STATUS1
Definition st25r.h:32
@ ST25R_REG_BIT_RATE
Definition st25r.h:19
@ ST25R_REG_UNDERSHOOT_CONF2
Definition st25r.h:52
@ ST25R_REG_FIELD_THRESHOLD_DEACTV
Definition st25r.h:41
@ ST25R_REG_RX_CONF2
Definition st25r.h:24
@ ST25R_REG_IRQ_ERROR
Definition st25r.h:31
@ ST25R_REG_NUM_TX_BYTES2
Definition st25r.h:34
@ ST25R_REG_UNDERSHOOT_CONF1
Definition st25r.h:51
@ ST25R_REG_AUX_MOD
Definition st25r.h:47
@ ST25R_REG_RX_CONF1
Definition st25r.h:23
@ ST25R_REG_PASSIVE_TARGET
Definition st25r.h:21
@ ST25R_REG_MASK_MAIN
Definition st25r.h:27
@ ST25R_REG_OVERSHOOT_CONF1
Definition st25r.h:49
@ ST25R_REG_TX_DRIVER_CONF
Definition st25r.h:38
@ ST25R_REG_RX_CONF4
Definition st25r.h:26
@ ST25R_REG_OVERSHOOT_CONF2
Definition st25r.h:50
@ ST25R_REG_PT_MOD
Definition st25r.h:39
@ ST25R_REG_EMD_SUP_CONF
Definition st25r.h:44
@ ST25R_REG_IC_IDENTITY
Definition st25r.h:43
@ ST25R_REG_IRQ_TIMER
Definition st25r.h:30
@ ST25R_REG_REGULATOR_CONTROL
Definition st25r.h:42
@ ST25R_REG_NUM_TX_BYTES1
Definition st25r.h:33
@ ST25R_REG_AUX
Definition st25r.h:22
@ ST25R_REG_IO_CONF1
Definition st25r.h:15
@ ST25R_REG_IRQ_MAIN
Definition st25r.h:29
@ ST25R_REG_RES_AM_MOD
Definition st25r.h:48
@ ST25R_REG_AD_CONV_RESULT
Definition st25r.h:35
@ ST25R_REG_FIELD_THRESHOLD_ACTV
Definition st25r.h:40
@ ST25R_REG_CORR_CONF2
Definition st25r.h:46
@ ST25R_REG_ANT_TUNE_B
Definition st25r.h:37
@ ST25R_REG_ANT_TUNE_A
Definition st25r.h:36
@ ST25R_REG_RX_CONF3
Definition st25r.h:25
@ ST25R_REG_ISO14443A_CONF
Definition st25r.h:20
@ ST25R_REG_MODE
Definition st25r.h:18
@ ST25R_REG_MASK_TIMER
Definition st25r.h:28
@ ST25R_REG_CORR_CONF1
Definition st25r.h:45
@ ST25R_REG_IO_CONF2
Definition st25r.h:16
@ ST25R_CMD_FIELD_ON
Definition st25r.h:61
@ ST25R_CMD_TRANSMIT_WUPA
Definition st25r.h:60
@ ST25R_CMD_TRANSMIT_WITHOUT_CRC
Definition st25r.h:59
@ ST25R_CMD_TRANSMIT_WITH_CRC
Definition st25r.h:58
@ ST25R_CMD_SET_DEFAULT
Definition st25r.h:56
@ ST25R_CMD_CLEAR_FIFO
Definition st25r.h:57
@ ST25R_CMD_ADJUST_REGULATORS
Definition st25r.h:63
@ ST25R_CMD_MEASURE_VDD
Definition st25r.h:64
@ ST25R_CMD_RESET_RX_GAIN
Definition st25r.h:62
const void size_t len
Definition hal.h:68
static void uint32_t