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

nRF51822 QFAA H30 fails production test

Hi,

We have used nRF51822 QFAA H10 in our product for a long time but the latest order was fulfilled with H30-devices and now our production test fails.

The test step is verifying a speaker by producing a tone with PWM (Timer with CC, GPIOTE and PPI) and the new H30 devices don't sound correct (haven't received any faulty units yet). We have a workaround in code for PAN73:

static __INLINE void pan73_workaround_activate(uint8_t timer)
{
    // nRF51822 rev3 silicon (H0) needs workaround when using PPI with GPIOTE
    
    uint8_t rev = (NRF_FICR->CONFIGID & 0xF0) >> 4;
    if (rev == 7 || rev == 8 || rev == 9) {
        if (timer == 0) {
            *(uint32_t *)0x40008C0C = 1;
        } else if (timer == 1) {
            *(uint32_t *)0x40009C0C = 1;
        } else if (timer == 2) {
            *(uint32_t *)0x4000AC0C = 1;
        }
    }
}

Are there any changes in H30 compared to H10 that could cause issues? This is a legacy code base with SDK 4.4.2 and S110 5.2.1.

Parents Reply
  • The latest SDK 12.3.0 for the nRF51 has a file called nrf_ic_info.c that is supposed to be the official way to identify a chip revision

    That is correct. But you are not using that function. In nrf_ic_info_get(), the ic_data is read like this,

    uint32_t ic_data    = ((*((uint32_t volatile *)0xF0000FE8)) & 0x000000F0) >> 4;

    But you are using the CONFIGID in FICR instead, looking at the HWID, that is not the same thing as ic_data in nrf_ic_info_get().

    How can we be proactive in the future? What should I do when H40 shows up?

    Use nrf_ic_info_get(), and the implementation it uses to find the IC revision. Don't use the HWID.

    You write that you think that the new HWID is 0x0138. Can you verify this so I can make a new firmware for the factory?

    I doubled checked our internal systems, and H30 is listed with HWID 0x0138. But again, use the original nrf_ic_info_get() function instead.

Children
No Data
Related