This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

How to disable workaround for NRF52 errata 102 and 106?

I am using a nRF52 to communicate using both BLE and proprietary protocols. When using BLE, I apply the workarounnd for errata 102 and 106. However, when I switch to my proprietary protocol, how do I disable the workaround, so I don't lose the 3 dB in sensitivity?

I am using SoftDevice v3.0.1 and SDK v12.1.0, so I need to apply the workaround myself. Upgrading to SoftDevice v4.0.2 and SDK v14 is not an option due to schedule.

A quick response would be appreciated! Thanks!

Parents
  • To apply the workaround:

    if ((NRF_FICR->INFO.VARIANT & 0x0000FF00u) < (((uint32_t) 'E') << 8))
    {
        *((volatile uint32_t*) 0x40001774u) = (*((volatile uint32_t*) 0x40001774u) & 0xFFFFFFFEu) | 0x01000000u;
    } 
    

    To reverse the workaround:

    if ((NRF_FICR->INFO.VARIANT & 0x0000FF00u) < (((uint32_t) 'E') << 8))
    {
        *((volatile uint32_t*) 0x40001774u) = (*((volatile uint32_t*) 0x40001774u) & 0xFEFFFFFFu) | 0x00000001u;
    }
    

    The fix required for PAN182 will only be applied to Rev 2 silicon and only needs to be done every time the radio power is enabled.

    if ((*((uint32_t*) 0x10000130ul) == 0x6ul) && (*((uint32_t*) 0x10000134ul) == 0x6ul))
    {
        *(volatile uint32_t *) 0x4000173C |= (1u << 10);
    }
    
Reply
  • To apply the workaround:

    if ((NRF_FICR->INFO.VARIANT & 0x0000FF00u) < (((uint32_t) 'E') << 8))
    {
        *((volatile uint32_t*) 0x40001774u) = (*((volatile uint32_t*) 0x40001774u) & 0xFFFFFFFEu) | 0x01000000u;
    } 
    

    To reverse the workaround:

    if ((NRF_FICR->INFO.VARIANT & 0x0000FF00u) < (((uint32_t) 'E') << 8))
    {
        *((volatile uint32_t*) 0x40001774u) = (*((volatile uint32_t*) 0x40001774u) & 0xFEFFFFFFu) | 0x00000001u;
    }
    

    The fix required for PAN182 will only be applied to Rev 2 silicon and only needs to be done every time the radio power is enabled.

    if ((*((uint32_t*) 0x10000130ul) == 0x6ul) && (*((uint32_t*) 0x10000134ul) == 0x6ul))
    {
        *(volatile uint32_t *) 0x4000173C |= (1u << 10);
    }
    
Children
Related