xref: /nrf52832-nimble/nordic/nrfx/drivers/include/nrfx_nfct.h (revision 150812a83cab50279bd772ef6db1bfaf255f2c5b)
1*150812a8SEvalZero /*
2*150812a8SEvalZero  * Copyright (c) 2018, Nordic Semiconductor ASA
3*150812a8SEvalZero  * All rights reserved.
4*150812a8SEvalZero  *
5*150812a8SEvalZero  * Redistribution and use in source and binary forms, with or without
6*150812a8SEvalZero  * modification, are permitted provided that the following conditions are met:
7*150812a8SEvalZero  *
8*150812a8SEvalZero  * 1. Redistributions of source code must retain the above copyright notice, this
9*150812a8SEvalZero  *    list of conditions and the following disclaimer.
10*150812a8SEvalZero  *
11*150812a8SEvalZero  * 2. Redistributions in binary form must reproduce the above copyright
12*150812a8SEvalZero  *    notice, this list of conditions and the following disclaimer in the
13*150812a8SEvalZero  *    documentation and/or other materials provided with the distribution.
14*150812a8SEvalZero  *
15*150812a8SEvalZero  * 3. Neither the name of the copyright holder nor the names of its
16*150812a8SEvalZero  *    contributors may be used to endorse or promote products derived from this
17*150812a8SEvalZero  *    software without specific prior written permission.
18*150812a8SEvalZero  *
19*150812a8SEvalZero  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*150812a8SEvalZero  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*150812a8SEvalZero  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*150812a8SEvalZero  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23*150812a8SEvalZero  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*150812a8SEvalZero  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*150812a8SEvalZero  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*150812a8SEvalZero  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*150812a8SEvalZero  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*150812a8SEvalZero  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*150812a8SEvalZero  * POSSIBILITY OF SUCH DAMAGE.
30*150812a8SEvalZero  */
31*150812a8SEvalZero 
32*150812a8SEvalZero #ifndef NRFX_NFCT_H__
33*150812a8SEvalZero #define NRFX_NFCT_H__
34*150812a8SEvalZero 
35*150812a8SEvalZero #include <nrfx.h>
36*150812a8SEvalZero #include <hal/nrf_nfct.h>
37*150812a8SEvalZero 
38*150812a8SEvalZero #ifdef __cplusplus
39*150812a8SEvalZero extern "C" {
40*150812a8SEvalZero #endif
41*150812a8SEvalZero 
42*150812a8SEvalZero /**
43*150812a8SEvalZero  * @defgroup nrfx_nfct NFCT driver
44*150812a8SEvalZero  * @{
45*150812a8SEvalZero  * @ingroup nrf_nfct
46*150812a8SEvalZero  * @brief   Near Field Communication Tag (NFCT) peripheral driver.
47*150812a8SEvalZero  */
48*150812a8SEvalZero 
49*150812a8SEvalZero #define NRFX_NFCT_NFCID1_SINGLE_SIZE 4u  ///< Length of single-size NFCID1.
50*150812a8SEvalZero #define NRFX_NFCT_NFCID1_DOUBLE_SIZE 7u  ///< Length of double-size NFCID1.
51*150812a8SEvalZero #define NRFX_NFCT_NFCID1_TRIPLE_SIZE 10u ///< Length of triple-size NFCID1.
52*150812a8SEvalZero 
53*150812a8SEvalZero #define NRFX_NFCT_NFCID1_DEFAULT_LEN NRFX_NFCT_NFCID1_DOUBLE_SIZE ///< Default length of NFC ID. */
54*150812a8SEvalZero 
55*150812a8SEvalZero /**
56*150812a8SEvalZero  * @brief NFCT hardware states.
57*150812a8SEvalZero  */
58*150812a8SEvalZero typedef enum
59*150812a8SEvalZero {
60*150812a8SEvalZero     NRFX_NFCT_STATE_DISABLED  = NRF_NFCT_TASK_DISABLE,  ///< NFC Tag is disabled (no sensing of an external NFC field).
61*150812a8SEvalZero     NRFX_NFCT_STATE_SENSING   = NRF_NFCT_TASK_SENSE,    ///< NFC Tag is sensing whether there is an external NFC field.
62*150812a8SEvalZero     NRFX_NFCT_STATE_ACTIVATED = NRF_NFCT_TASK_ACTIVATE, ///< NFC Tag is powered-up (see @ref nrfx_nfct_active_state_t for possible substates).
63*150812a8SEvalZero } nrfx_nfct_state_t;
64*150812a8SEvalZero 
65*150812a8SEvalZero /**
66*150812a8SEvalZero  * @brief NFC tag states, when NFCT hardware is activated.
67*150812a8SEvalZero  *
68*150812a8SEvalZero  * @details These states are substates of the @ref NRFX_NFCT_STATE_ACTIVATED state.
69*150812a8SEvalZero  */
70*150812a8SEvalZero typedef enum
71*150812a8SEvalZero {
72*150812a8SEvalZero     NRFX_NFCT_ACTIVE_STATE_IDLE  = NRF_NFCT_TASK_GOIDLE,  ///< NFC Tag is activated and idle (not selected by a reader).
73*150812a8SEvalZero     NRFX_NFCT_ACTIVE_STATE_SLEEP = NRF_NFCT_TASK_GOSLEEP, ///< NFC Tag is sleeping.
74*150812a8SEvalZero     NRFX_NFCT_ACTIVE_STATE_DEFAULT,                       ///< NFC Tag is either sleeping or idle, depending on the previous state before being selected by a poller.
75*150812a8SEvalZero } nrfx_nfct_active_state_t;
76*150812a8SEvalZero 
77*150812a8SEvalZero /**
78*150812a8SEvalZero  * @brief NFCT driver event types, passed to the upper-layer callback function
79*150812a8SEvalZero  *        provided during the initialization.
80*150812a8SEvalZero  */
81*150812a8SEvalZero typedef enum
82*150812a8SEvalZero {
83*150812a8SEvalZero     NRFX_NFCT_EVT_FIELD_DETECTED = NRF_NFCT_INT_FIELDDETECTED_MASK, ///< External NFC field is detected.
84*150812a8SEvalZero     NRFX_NFCT_EVT_FIELD_LOST     = NRF_NFCT_INT_FIELDLOST_MASK,     ///< External NFC Field is lost.
85*150812a8SEvalZero     NRFX_NFCT_EVT_SELECTED       = NRF_NFCT_INT_SELECTED_MASK,      ///< Tag was selected by the poller.
86*150812a8SEvalZero     NRFX_NFCT_EVT_RX_FRAMESTART  = NRF_NFCT_INT_RXFRAMESTART_MASK,  ///< Data frame reception started.
87*150812a8SEvalZero     NRFX_NFCT_EVT_RX_FRAMEEND    = NRF_NFCT_INT_RXFRAMEEND_MASK,    ///< Data frame is received.
88*150812a8SEvalZero     NRFX_NFCT_EVT_TX_FRAMESTART  = NRF_NFCT_INT_TXFRAMESTART_MASK,  ///< Data frame transmission started.
89*150812a8SEvalZero     NRFX_NFCT_EVT_TX_FRAMEEND    = NRF_NFCT_INT_TXFRAMEEND_MASK,    ///< Data frame is transmitted.
90*150812a8SEvalZero     NRFX_NFCT_EVT_ERROR          = NRF_NFCT_INT_ERROR_MASK,         ///< Error occurred in an NFC communication.
91*150812a8SEvalZero } nrfx_nfct_evt_id_t;
92*150812a8SEvalZero 
93*150812a8SEvalZero /**
94*150812a8SEvalZero  * @brief NFCT timing-related error types.
95*150812a8SEvalZero  */
96*150812a8SEvalZero typedef enum
97*150812a8SEvalZero {
98*150812a8SEvalZero     NRFX_NFCT_ERROR_FRAMEDELAYTIMEOUT, ///< No response frame was transmitted to the poller in the transmit window.
99*150812a8SEvalZero     NRFX_NFCT_ERROR_NUM,               ///< Total number of possible errors.
100*150812a8SEvalZero } nrfx_nfct_error_t;
101*150812a8SEvalZero 
102*150812a8SEvalZero /**
103*150812a8SEvalZero  * @brief NFCT driver parameter types.
104*150812a8SEvalZero  */
105*150812a8SEvalZero typedef enum
106*150812a8SEvalZero {
107*150812a8SEvalZero     NRFX_NFCT_PARAM_ID_FDT,     ///< NFC-A Frame Delay Time parameter.
108*150812a8SEvalZero     NRFX_NFCT_PARAM_ID_SEL_RES, ///< Value of the 'Protocol' field in the NFC-A SEL_RES frame.
109*150812a8SEvalZero     NRFX_NFCT_PARAM_ID_NFCID1,  ///< NFC-A NFCID1 setting (NFC tag identifier).
110*150812a8SEvalZero } nrfx_nfct_param_id_t;
111*150812a8SEvalZero 
112*150812a8SEvalZero /**
113*150812a8SEvalZero  * @brief NFCID1 descriptor.
114*150812a8SEvalZero  */
115*150812a8SEvalZero typedef struct
116*150812a8SEvalZero {
117*150812a8SEvalZero     uint8_t const * p_id;    ///< NFCID1 data.
118*150812a8SEvalZero     uint8_t         id_size; ///< NFCID1 size.
119*150812a8SEvalZero } nrfx_nfct_nfcid1_t;
120*150812a8SEvalZero 
121*150812a8SEvalZero /**
122*150812a8SEvalZero  * @brief NFCT driver parameter descriptor.
123*150812a8SEvalZero  */
124*150812a8SEvalZero typedef struct
125*150812a8SEvalZero {
126*150812a8SEvalZero     nrfx_nfct_param_id_t   id;               ///< Type of parameter.
127*150812a8SEvalZero     union
128*150812a8SEvalZero     {
129*150812a8SEvalZero         uint32_t           fdt;              ///< NFC-A Frame Delay Time. Filled when nrfx_nfct_param_t::id is @ref NRFX_NFCT_PARAM_ID_FDT.
130*150812a8SEvalZero         uint8_t            sel_res_protocol; ///< NFC-A value of the 'Protocol' field in the SEL_RES frame. Filled when nrfx_nfct_param_t::id is @ref NRFX_NFCT_PARAM_ID_SEL_RES.
131*150812a8SEvalZero         nrfx_nfct_nfcid1_t nfcid1;           ///< NFC-A NFCID1 value (tag identifier). Filled when nrfx_nfct_param_t::id is @ref NRFX_NFCT_PARAM_ID_NFCID1.
132*150812a8SEvalZero     } data;
133*150812a8SEvalZero } nrfx_nfct_param_t;
134*150812a8SEvalZero 
135*150812a8SEvalZero /**
136*150812a8SEvalZero  * @brief NFCT driver RX/TX buffer descriptor.
137*150812a8SEvalZero  */
138*150812a8SEvalZero typedef struct
139*150812a8SEvalZero {
140*150812a8SEvalZero     uint32_t        data_size; ///< RX/TX buffer size.
141*150812a8SEvalZero     uint8_t const * p_data;    ///< RX/TX buffer.
142*150812a8SEvalZero } nrfx_nfct_data_desc_t;
143*150812a8SEvalZero 
144*150812a8SEvalZero /**
145*150812a8SEvalZero  * @brief Structure used to describe the @ref NRFX_NFCT_EVT_RX_FRAMEEND event type.
146*150812a8SEvalZero  */
147*150812a8SEvalZero typedef struct
148*150812a8SEvalZero {
149*150812a8SEvalZero     uint32_t              rx_status; ///< RX error status.
150*150812a8SEvalZero     nrfx_nfct_data_desc_t rx_data;   ///< RX buffer.
151*150812a8SEvalZero } nrfx_nfct_evt_rx_frameend_t;
152*150812a8SEvalZero 
153*150812a8SEvalZero /**
154*150812a8SEvalZero  * @brief Structure used to describe the @ref NRFX_NFCT_EVT_TX_FRAMESTART event type.
155*150812a8SEvalZero  */
156*150812a8SEvalZero typedef struct
157*150812a8SEvalZero {
158*150812a8SEvalZero     nrfx_nfct_data_desc_t tx_data; ///< TX buffer.
159*150812a8SEvalZero } nrfx_nfct_evt_tx_framestart_t;
160*150812a8SEvalZero 
161*150812a8SEvalZero /**
162*150812a8SEvalZero  * @brief Structure used to describe the @ref NRFX_NFCT_EVT_ERROR event type.
163*150812a8SEvalZero  */
164*150812a8SEvalZero typedef struct
165*150812a8SEvalZero {
166*150812a8SEvalZero     nrfx_nfct_error_t reason; ///< Reason for error.
167*150812a8SEvalZero } nrfx_nfct_evt_error_t;
168*150812a8SEvalZero 
169*150812a8SEvalZero /**
170*150812a8SEvalZero  * @brief NFCT driver event.
171*150812a8SEvalZero  */
172*150812a8SEvalZero typedef struct
173*150812a8SEvalZero {
174*150812a8SEvalZero     nrfx_nfct_evt_id_t evt_id;                       ///< Type of event.
175*150812a8SEvalZero     union
176*150812a8SEvalZero     {
177*150812a8SEvalZero         nrfx_nfct_evt_rx_frameend_t   rx_frameend;   ///< End of the RX frame data. Filled when nrfx_nfct_evt_t::evt_id is @ref NRFX_NFCT_EVT_RX_FRAMEEND.
178*150812a8SEvalZero         nrfx_nfct_evt_tx_framestart_t tx_framestart; ///< Start of the TX frame data. Filled when nrfx_nfct_evt_t::evt_id is @ref NRFX_NFCT_EVT_TX_FRAMESTART.
179*150812a8SEvalZero         nrfx_nfct_evt_error_t         error;         ///< Error data. Filled when nrfx_nfct_evt_t::evt_id is @ref NRFX_NFCT_EVT_ERROR.
180*150812a8SEvalZero     } params;
181*150812a8SEvalZero } nrfx_nfct_evt_t;
182*150812a8SEvalZero 
183*150812a8SEvalZero /**
184*150812a8SEvalZero  * @brief Callback descriptor to pass events from the NFCT driver to the upper layer.
185*150812a8SEvalZero  *
186*150812a8SEvalZero  * @param[in] p_event Pointer to the event descriptor.
187*150812a8SEvalZero  */
188*150812a8SEvalZero typedef void (*nrfx_nfct_handler_t)(nrfx_nfct_evt_t const * p_event);
189*150812a8SEvalZero 
190*150812a8SEvalZero /**
191*150812a8SEvalZero  * @brief NFCT driver configuration structure.
192*150812a8SEvalZero  */
193*150812a8SEvalZero typedef struct
194*150812a8SEvalZero {
195*150812a8SEvalZero     uint32_t            rxtx_int_mask; ///< Mask for enabling RX/TX events. Indicate which events must be forwarded to the upper layer by using @ref nrfx_nfct_evt_id_t. By default, no events are enabled. */
196*150812a8SEvalZero     nrfx_nfct_handler_t cb;            ///< Callback.
197*150812a8SEvalZero } nrfx_nfct_config_t;
198*150812a8SEvalZero 
199*150812a8SEvalZero /**
200*150812a8SEvalZero  * @brief Function for initializing the NFCT driver.
201*150812a8SEvalZero  *
202*150812a8SEvalZero  * @param[in] p_config  Pointer to the NFCT driver configuration structure.
203*150812a8SEvalZero  *
204*150812a8SEvalZero  * @retval NRFX_SUCCESS             If the NFCT driver was initialized successfully.
205*150812a8SEvalZero  * @retval NRFX_ERROR_INVALID_STATE If the NFCT driver is already initialized.
206*150812a8SEvalZero  */
207*150812a8SEvalZero nrfx_err_t nrfx_nfct_init(nrfx_nfct_config_t const * p_config);
208*150812a8SEvalZero 
209*150812a8SEvalZero /**
210*150812a8SEvalZero  * @brief Function for uninitializing the NFCT driver.
211*150812a8SEvalZero  *
212*150812a8SEvalZero  * After uninitialization, the instance is in disabled state.
213*150812a8SEvalZero  */
214*150812a8SEvalZero void nrfx_nfct_uninit(void);
215*150812a8SEvalZero 
216*150812a8SEvalZero /**
217*150812a8SEvalZero  * @brief Function for starting the NFC subsystem.
218*150812a8SEvalZero  *
219*150812a8SEvalZero  * After this function completes, NFC readers are able to detect the tag.
220*150812a8SEvalZero  */
221*150812a8SEvalZero void nrfx_nfct_enable(void);
222*150812a8SEvalZero 
223*150812a8SEvalZero /**
224*150812a8SEvalZero  * @brief Function for disabling the NFCT driver.
225*150812a8SEvalZero  *
226*150812a8SEvalZero  * After this function returns, NFC readers are no longer able to connect
227*150812a8SEvalZero  * to the tag.
228*150812a8SEvalZero  */
229*150812a8SEvalZero void nrfx_nfct_disable(void);
230*150812a8SEvalZero 
231*150812a8SEvalZero /**
232*150812a8SEvalZero  * @brief Function for checking whether the external NFC field is present in the range of the tag.
233*150812a8SEvalZero  *
234*150812a8SEvalZero  * @retval true  If the NFC field is present.
235*150812a8SEvalZero  * @retval false If no NFC field is present.
236*150812a8SEvalZero  */
237*150812a8SEvalZero bool nrfx_nfct_field_check(void);
238*150812a8SEvalZero 
239*150812a8SEvalZero /**
240*150812a8SEvalZero  * @brief Function for preparing the NFCT driver for receiving an NFC frame.
241*150812a8SEvalZero  *
242*150812a8SEvalZero  * @param[in] p_rx_data  Pointer to the RX buffer.
243*150812a8SEvalZero  */
244*150812a8SEvalZero void nrfx_nfct_rx(nrfx_nfct_data_desc_t const * p_rx_data);
245*150812a8SEvalZero 
246*150812a8SEvalZero /**
247*150812a8SEvalZero  * @brief Function for transmitting an NFC frame.
248*150812a8SEvalZero  *
249*150812a8SEvalZero  * @param[in] p_tx_data   Pointer to the TX buffer.
250*150812a8SEvalZero  * @param[in] delay_mode  Delay mode of the NFCT frame timer.
251*150812a8SEvalZero  *
252*150812a8SEvalZero  * @retval NRFX_SUCCESS              If the operation was successful.
253*150812a8SEvalZero  * @retval NRFX_ERROR_INVALID_LENGTH If the TX buffer size is invalid.
254*150812a8SEvalZero  */
255*150812a8SEvalZero nrfx_err_t nrfx_nfct_tx(nrfx_nfct_data_desc_t const * p_tx_data,
256*150812a8SEvalZero                         nrf_nfct_frame_delay_mode_t   delay_mode);
257*150812a8SEvalZero 
258*150812a8SEvalZero /**
259*150812a8SEvalZero  * @brief Function for moving the NFCT to a new state.
260*150812a8SEvalZero  *
261*150812a8SEvalZero  * @note  The HFCLK must be running before activating the NFCT with
262*150812a8SEvalZero  *        @ref NRFX_NFCT_STATE_ACTIVATED.
263*150812a8SEvalZero  *
264*150812a8SEvalZero  * @param[in] state  The required state.
265*150812a8SEvalZero  */
266*150812a8SEvalZero void nrfx_nfct_state_force(nrfx_nfct_state_t state);
267*150812a8SEvalZero 
268*150812a8SEvalZero /**
269*150812a8SEvalZero  * @brief Function for moving the NFCT to a new initial substate within @ref NRFX_NFCT_STATE_ACTIVATED.
270*150812a8SEvalZero  *
271*150812a8SEvalZero  * @param[in] sub_state  The required substate.
272*150812a8SEvalZero  */
273*150812a8SEvalZero void nrfx_nfct_init_substate_force(nrfx_nfct_active_state_t sub_state);
274*150812a8SEvalZero 
275*150812a8SEvalZero /**
276*150812a8SEvalZero  * @brief Function for setting the NFC communication parameter.
277*150812a8SEvalZero  *
278*150812a8SEvalZero  * @note Parameter validation for length and acceptable values.
279*150812a8SEvalZero  *
280*150812a8SEvalZero  * @param[in] p_param  Pointer to parameter descriptor.
281*150812a8SEvalZero  *
282*150812a8SEvalZero  * @retval NRFX_SUCCESS             If the operation was successful.
283*150812a8SEvalZero  * @retval NRFX_ERROR_INVALID_PARAM If the parameter data is invalid.
284*150812a8SEvalZero  */
285*150812a8SEvalZero nrfx_err_t nrfx_nfct_parameter_set(nrfx_nfct_param_t const * p_param);
286*150812a8SEvalZero 
287*150812a8SEvalZero /**
288*150812a8SEvalZero  * @brief Function for getting default bytes for NFCID1.
289*150812a8SEvalZero  *
290*150812a8SEvalZero  * @param[in,out] p_nfcid1_buff    In:  empty buffer for data;
291*150812a8SEvalZero  *                                 Out: buffer with the NFCID1 default data. These values
292*150812a8SEvalZero  *                                      can be used to fill the Type 2 Tag Internal Bytes.
293*150812a8SEvalZero  * @param[in]     nfcid1_buff_len  Length of the NFCID1 buffer.
294*150812a8SEvalZero  *
295*150812a8SEvalZero  * @retval NRFX_SUCCESS              If the operation was successful.
296*150812a8SEvalZero  * @retval NRFX_ERROR_INVALID_LENGTH If length of the NFCID buffer is different than
297*150812a8SEvalZero  *                                   @ref NRFX_NFCT_NFCID1_SINGLE_SIZE,
298*150812a8SEvalZero  *                                   @ref NRFX_NFCT_NFCID1_DOUBLE_SIZE, or
299*150812a8SEvalZero  *                                   @ref NRFX_NFCT_NFCID1_TRIPLE_SIZE.
300*150812a8SEvalZero  */
301*150812a8SEvalZero nrfx_err_t nrfx_nfct_nfcid1_default_bytes_get(uint8_t * const p_nfcid1_buff,
302*150812a8SEvalZero                                               uint32_t        nfcid1_buff_len);
303*150812a8SEvalZero 
304*150812a8SEvalZero /**
305*150812a8SEvalZero  * @brief Function for enabling the automatic collision resolution.
306*150812a8SEvalZero  *
307*150812a8SEvalZero  * @details As defined by the NFC Forum Digital Protocol Technical Specification (and ISO 14443-3),
308*150812a8SEvalZero  *          the automatic collision resolution is implemented in the NFCT hardware.
309*150812a8SEvalZero  *          This function allows enabling and disabling this feature.
310*150812a8SEvalZero  */
311*150812a8SEvalZero void nrfx_nfct_autocolres_enable(void);
312*150812a8SEvalZero 
313*150812a8SEvalZero /**
314*150812a8SEvalZero  * @brief Function for disabling the automatic collision resolution.
315*150812a8SEvalZero  *
316*150812a8SEvalZero  * @details See also details in @ref nrfx_nfct_autocolres_enable.
317*150812a8SEvalZero  */
318*150812a8SEvalZero void nrfx_nfct_autocolres_disable(void);
319*150812a8SEvalZero 
320*150812a8SEvalZero 
321*150812a8SEvalZero void nrfx_nfct_irq_handler(void);
322*150812a8SEvalZero 
323*150812a8SEvalZero 
324*150812a8SEvalZero /** @} */
325*150812a8SEvalZero 
326*150812a8SEvalZero #ifdef __cplusplus
327*150812a8SEvalZero }
328*150812a8SEvalZero #endif
329*150812a8SEvalZero 
330*150812a8SEvalZero 
331*150812a8SEvalZero /**
332*150812a8SEvalZero  * @defgroup nrfx_nfct_fixes NFCT driver fixes and workarounds
333*150812a8SEvalZero  * @{
334*150812a8SEvalZero  * @ingroup nrf_nfct
335*150812a8SEvalZero  * @brief Fixes for hardware-related anomalies.
336*150812a8SEvalZero  *
337*150812a8SEvalZero  * If you are using the nRF52832 chip, the workarounds for the following anomalies are applied:
338*150812a8SEvalZero  * - 79. NFCT: A false EVENTS_FIELDDETECTED event occurs after the field is lost.
339*150812a8SEvalZero  * - 116. NFCT does not release HFCLK when switching from ACTIVATED to SENSE mode.
340*150812a8SEvalZero  * To implement the first workaround, an instance of NRF_TIMER is used. After the NFC field is detected,
341*150812a8SEvalZero  * the timing module periodically polls its state to determine when the field is turned off.
342*150812a8SEvalZero  * To implement the second workaround, power reset is used to release the clock acquired by NFCT
343*150812a8SEvalZero  * after the field is turned off. Note that the NFCT register configuration is restored to defaults.
344*150812a8SEvalZero  *
345*150812a8SEvalZero  * If you are using the nRF52840 chip, rev. Engineering A, the workarounds for the following anomalies
346*150812a8SEvalZero  * are applied:
347*150812a8SEvalZero  * - 98. NFCT: The NFCT is not able to communicate with the peer.
348*150812a8SEvalZero  * - 116. NFCT does not release HFCLK when switching from ACTIVATED to SENSE mode.
349*150812a8SEvalZero  * - 144. NFCT: Not optimal NFC performance
350*150812a8SEvalZero  *
351*150812a8SEvalZero  * If you are using the nRF52840 chip, rev. 1, or rev. Engineering B or C, the workarounds for the following
352*150812a8SEvalZero  * anomalies are applied:
353*150812a8SEvalZero  * - 190. NFCT: Event FIELDDETECTED can be generated too early.
354*150812a8SEvalZero  * To implement this workaround, an instance of NRF_TIMER is used. After the NFC field is detected,
355*150812a8SEvalZero  * the timing module measures the necessary waiting period after which NFCT can be activated.
356*150812a8SEvalZero  * This debouncing technique is used to filter possible field instabilities.
357*150812a8SEvalZero  *
358*150812a8SEvalZero  * The application of the implemented workarounds for the nRF52840 chip is determined at runtime and depends
359*150812a8SEvalZero  * on the chip variant.
360*150812a8SEvalZero  *
361*150812a8SEvalZero  * The current code contains a patch for the anomaly 25 (NFCT: Reset value of
362*150812a8SEvalZero  * SENSRES register is incorrect), so that the module now works on Windows Phone.
363*150812a8SEvalZero  * @}
364*150812a8SEvalZero  */
365*150812a8SEvalZero 
366*150812a8SEvalZero #endif // NRFX_NFCT_H__
367