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