Weird LFCLK Behavior With nRF Connect SDK v2.6.1 On nRF52805 Without External LFCLK Oscillator

I ran across this issue while troubleshooting a separate issue, in which I have an nRF52810-based board with no external LFCLK oscillator that is rock-solid with nRF5 SDK but is behaving weirdly with nRF Connect SDK, and I suspected this was due to having misconfigured the SDK to specify the use of the external LFCLK oscillator . While looking at this, I tried the same code and configuration on an nRF52805-based board which works fine with the nRF Connect SDK, but which I think also lacks an external LFCLK oscillator (for reasons surpassing understanding, I haven't been given a schematic for this nRF52805-based board).

Here's what's weird: with the nRF Connect SDK LFCLK configuration like this:

CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_50PPM=y

I see the following on the nRF52805 LFCLK regs when I check them at the top of main():

LFCLKSRC 0x00000001 LFCLKSTAT 0x00010001 LFCLKRUN 0x00000001 CTIV 0x00000000

I understand why LFCLKSRC is 1, but if there's no external LFCLK oscillator on this nRF52805 board, how on Earth is LFCLKSTAT is 0x00010001? It seems like that should only be possible of there is an external LFCLK oscillator, right?

But the problem is that, if I check this with nRF5 SDK firmware on the same board, it consistently shows there is is no external LFCLK oscillator. For instance, if I configure the nRF5 SDK using:

#define NRF_SDH_CLOCK_LF_SRC 0

then everything works fine (SoftDevice initializes without problem, etc). But if I configure the nRF5 SDK using:

#define NRF_SDH_CLOCK_LF_SRC 1

I get an error 7 (NRF_ERROR_INVALID_PARAM) returned from nrf_sdh_enable_request(). And if, before I make that call, I manually configure and enable the LFCLK on the nRF52805 using this code from Errata 3.2 [20], it never exits the loop checking EVENTS_LFCLKSTARTED:

static void lfclock_init(void)
{

NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
NRF_CLOCK->LFCLKSRC = 1;
NRF_CLOCK->TASKS_LFCLKSTART = 1;

while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0)
{
}

NRF_RTC0->TASKS_STOP = 0;
NRF_RTC1->TASKS_STOP = 0;

}

Finally, if I replace the wait loop in lfclock_init() above with an nrf_delay_us(500000),and then check the LFCLK registers, they are set exactly like you'd expect if there was no external LFCLK oscillator (they show the LFCLK is running, but not from the external oscillator):

LFCLKSRC 0x00000001 LFCLKSTAT 0x00010000 LFCLKRUN 0x00000001 CTIV 0x00000000

So that's my question. Why does nRF5 SDK and the LFCLK registers themselves tell me it is impossible to configure an external LFCLK oscillator on this nRF52805-based board, but when I run nRF Connect SDK firmware configured for external LFCLK oscillator on the same board, LFCLKSTAT is 0x00010001, which clearly indicates that it is running on an external LFCLK oscillator?

What am I missing here?

Thank you!

Parents
  • Yes, you are right, LFCLKSTAT register should not be giving 0x00010001 if there is not external crystal. If you are absolutely sure that there is no XTAL, then I can try to replicate this with minimalistic code in nrf connect sdk. Can you please give me the laser marking on your chip so that I get the build code for it and understand which batch of production those are? I can then try to do a test on something with the batch close to that.

  • Susheel, unfortunately this particular board is based on the Fanstel BC805M-V1 module, so I can't actually see the nRF52805 (the module PCB is covered in a metal enclosure with only the antenna sticking out), and so I can't read the laser marking on the MCU. There's no obvious serial number on the module so I'm doubting Fanstel would be able to provide that information.  is there any other way we can get this information, without destructively tearing apart the module? 

    Regarding the presence of the XTAL, the Fanstel BC805M-V1 does not include a 32KHz oscillator, but it does bring out P0.00 and P0.01, so as I mentioned, I don't have a schematic for the carrier board, so I can't explicitly rule out the present of an XTAL on that board. But if the XTAL was included, lfclock_init() above shouldn't be hanging when attempting to start LFCLK with XTAL, and nrf_sdh_enable_request() shouldn't be returning NRF_ERROR_INVALID_PARAM) when NRF_SDH_CLOCK_LF_SRC is defined as 1., which is what I'm seeing.

Reply
  • Susheel, unfortunately this particular board is based on the Fanstel BC805M-V1 module, so I can't actually see the nRF52805 (the module PCB is covered in a metal enclosure with only the antenna sticking out), and so I can't read the laser marking on the MCU. There's no obvious serial number on the module so I'm doubting Fanstel would be able to provide that information.  is there any other way we can get this information, without destructively tearing apart the module? 

    Regarding the presence of the XTAL, the Fanstel BC805M-V1 does not include a 32KHz oscillator, but it does bring out P0.00 and P0.01, so as I mentioned, I don't have a schematic for the carrier board, so I can't explicitly rule out the present of an XTAL on that board. But if the XTAL was included, lfclock_init() above shouldn't be hanging when attempting to start LFCLK with XTAL, and nrf_sdh_enable_request() shouldn't be returning NRF_ERROR_INVALID_PARAM) when NRF_SDH_CLOCK_LF_SRC is defined as 1., which is what I'm seeing.

Children
No Data
Related