[17] NFCT: The EVENTS_FIELDLOST is not generated

This anomaly applies to IC Rev. Engineering A, build codes QFAA-AA0, QFAA-AC0, CGAA-AA0.

Symptoms

The EVENTS_FIELDLOST event is not generated. The SENSE task is not triggered if the shorts FIELDLOST_SENSE is used.

Conditions

Always.

Consequences

FIELDLOST event cannot be used reliably. The NFCT shortcut FIELDLOST_SENSE cannot be used reliably. Higher current consumption, since the NFCT cannot go into SENSE mode quickly and the device cannot go into sleep mode quickly based on FIELDLOST event.

Workaround

Do not use NFCT shortcut FIELDLOST_SENSE and FIELDLOST event.

Due to the software based work-around to handle the NFCT FIELDLOST event scenario, the NFCT shortcut FIELDDETECTED_ACTIVATE cannot be used either.

The FIELDLOST event is achieved using the following code in a busy loop.

            NRF_NFCT->AUTOCOLRESSTATUS = 0; /* Work-around for Errata 24. dummy write - no effect. */
            NRF_NFCT->AUTOCOLRESSTATUS = 0; /* Work-around for Errata 24. dummy write - no effect. */
            if  ((NRF_NFCT->FIELDPRESENT & 
                  (NFCT_FIELDPRESENT_LOCKDETECT_Msk | NFCT_FIELDPRESENT_FIELDPRESENT_Msk)) == 
                 ((NFCT_FIELDPRESENT_FIELDPRESENT_NoField << NFCT_FIELDPRESENT_FIELDPRESENT_Pos) |
                  (NFCT_FIELDPRESENT_LOCKDETECT_NotLocked << NFCT_FIELDPRESENT_LOCKDETECT_Pos)))
            {
                /* Field is lost, handle the field lost event actions. */
            }
The FIELDDETECTED event is achieved using the following code in a busy loop.

            NRF_NFCT->AUTOCOLRESSTATUS = 0; /* Work-around for Errata 24. dummy write - no effect. */
            NRF_NFCT->AUTOCOLRESSTATUS = 0; /* Work-around for Errata 24. dummy write - no effect. */
            if  ((NRF_NFCT->FIELDPRESENT & 
                  NFCT_FIELDPRESENT_FIELDPRESENT_Msk) != 
                 ((NFCT_FIELDPRESENT_FIELDPRESENT_NoField << NFCT_FIELDPRESENT_FIELDPRESENT_Pos)))
            {
                /* Field is detected, handle the field detected event actions. */
            }
Example: Typical use case, go to SENSE mode when the field is lost and ACTIVATE when field is detected.

while (true)
{
    /* Wait for the field detection to happen */
    do
    {
        NRF_NFCT->AUTOCOLRESSTATUS = 0; /* dummy write - no effect. */
        NRF_NFCT->AUTOCOLRESSTATUS = 0; /* dummy write - no effect. */
    }while((NRF_NFCT->FIELDPRESENT &
    (NFCT_FIELDPRESENT_FIELDPRESENT_Msk)) ==
    (NFCT_FIELDPRESENT_FIELDPRESENT_NoField << NFCT_FIELDPRESENT_FIELDPRESENT_Pos));

    NRF_NFCT->TASKS_ACTIVATE = 1;

    /* Wait for the field lost to happen */
    do
    {
        NRF_NFCT->AUTOCOLRESSTATUS = 0; /* dummy write - no effect. */
        NRF_NFCT->AUTOCOLRESSTATUS = 0; /* dummy write - no effect. */
    }while ((NRF_NFCT->FIELDPRESENT & 
          (NFCT_FIELDPRESENT_LOCKDETECT_Msk | NFCT_FIELDPRESENT_FIELDPRESENT_Msk)) != 
         ((NFCT_FIELDPRESENT_FIELDPRESENT_NoField << NFCT_FIELDPRESENT_FIELDPRESENT_Pos) |
          (NFCT_FIELDPRESENT_LOCKDETECT_NotLocked << NFCT_FIELDPRESENT_LOCKDETECT_Pos)));

    NRF_NFCT->TASKS_SENSE = 1;

    /* Depending on the user application, the device can be put into system off here to save power while waiting for field. */
}