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

Problem with crystal and custom board

Hi, i build my own custom board with a NRF52832, i'm having problem with the softdevice (i think so)... my code is base on BLE s132 central and peripheral...

I developed the code and test on a NRF52 DK and it worked all right, everything was ok..

I test a simple code (toggle Leds) in my custom board and it worked ok (No softdevice)

I load the softdevice s130 and the code (central device) and my custom board get reset and start again.. I can see when the scanning led turn on and inmediatily restart and start again..

I'm going to paste my init code. Hope you can help me.

MAIN:

    int main(void)
    {
    
    	  entrada3=1;
    	  entrada4= 1;
    
        ret_code_t err_code;
  
        leds_init();
    	         
   
    		ble_stack_init();
    	 
        setear_direccion_central();
   
        db_discovery_init();
   	
    	  nus_c_init();
    		
   // Start scanning for peripherals and initiate connection to devices which
       scan_start();
     	for (;;)
    	{
    		// Wait for BLE events.
    			power_manage();
    				 }			 
    	
        }

BLE_STACK_INIT()

static void ble_stack_init(void)
{
   ret_code_t err_code;

    nrf_clock_lf_cfg_t clock_lf_cfg = NRF_CLOCK_LFCLKSRC;
    // Initialize the SoftDevice handler module.
	
	// THE CODE STOPS WHEN THE LINE DOWN is EXCECUTED.

    SOFTDEVICE_HANDLER_INIT(&clock_lf_cfg, NULL);

    ble_enable_params_t ble_enable_params;
    err_code = softdevice_enable_get_default_config(CENTRAL_LINK_COUNT,
                                                    PERIPHERAL_LINK_COUNT,
                                                    &ble_enable_params);
    APP_ERROR_CHECK(err_code);

    //Check the ram settings against the used number of links
    CHECK_RAM_START_ADDR(CENTRAL_LINK_COUNT,PERIPHERAL_LINK_COUNT);

    // Enable BLE stack.
    err_code = softdevice_enable(&ble_enable_params);
	    APP_ERROR_CHECK(err_code);

    // Register with the SoftDevice handler module for BLE events.
    err_code = softdevice_ble_evt_handler_set(ble_evt_dispatch);
	    APP_ERROR_CHECK(err_code);
}

NRF_CLOCK_LFCLKSRC:

#define NRF_CLOCK_LFCLKSRC      {.source        = NRF_CLOCK_LF_SRC_XTAL ,            \
                                 .rc_ctiv       = 0,                                \
                                 .rc_temp_ctiv  = 0,                                \
                                 .xtal_accuracy = NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM}

SCAN_START()

static void scan_start(void)
{
	  scantime++;
	  
    ret_code_t err_code;
    int8_t tx_power =-40;
    err_code =	sd_ble_gap_scan_stop();
		
    // It is okay to ignore this error since we are stopping the scan anyway.
    if (err_code != NRF_ERROR_INVALID_STATE)
    {
        APP_ERROR_CHECK(err_code);
    }
    sd_ble_gap_tx_power_set(tx_power);
		
    err_code = sd_ble_gap_scan_start(&m_scan_param);
		APP_ERROR_CHECK(err_code);
			
		led_scanning();

}

image description

  • Have you measure the parasitic capacitance on the PCB? This can potentially have an effect on the loading capacitance seen by the crystal. Generally you have to tune the loading capacitor values to hit the sweet spot of that particular crystal. This also assume that the crystal you choose meet all the required spec's of the Nordic chip.

  • ok, i'm going to use RC oscillator can you explain me what do i have to change..

    LF_CLOCK_LFSOURCE... ok i found this in pca10040.h

    // Low frequency clock source to be used by the SoftDevice
    #define NRF_CLOCK_LFCLKSRC      {.source        = NRF_CLOCK_LF_SRC_XTAL ,            \
                                     .rc_ctiv       = 0,                                \
                                     .rc_temp_ctiv  = 0,                                \
                                     .xtal_accuracy = NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM}
    

    i was reading, i have to change the source to NRF_CLOCK_LF_SRC_RC, and the xtal_ accuracy but i only have this accuracy defines in nrf_sdm.h:

    #define NRF_CLOCK_LF_XTAL_ACCURACY_250_PPM (0) /* Default */
    #define NRF_CLOCK_LF_XTAL_ACCURACY_500_PPM (1)
    #define NRF_CLOCK_LF_XTAL_ACCURACY_150_PPM (2)
    #define NRF_CLOCK_LF_XTAL_ACCURACY_100_PPM (3)
    #define NRF_CLOCK_LF_XTAL_ACCURACY_75_PPM  (4)
    #define NRF_CLOCK_LF_XTAL_ACCURACY_50_PPM  (5)
    #define NRF_CLOCK_LF_XTAL_ACCURACY_30_PPM  (6)
    #define NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM  (7)
    

    What else i have to do ???

  • Use this config:

    #define NRF_CLOCK_LFCLKSRC      {.source        = NRF_CLOCK_LF_SRC_RC ,            \
                                     .rc_ctiv       = 16,                                \
                                     .rc_temp_ctiv  = 2,                                \
                                     .xtal_accuracy = 0}
    

    Ref nrf_clock_lf_cfg_t

    However I do not think that the problem is with the LF crystal, then the code should have stopped in SOFTDEVICE_HANDLER_INIT(&clock_lf_cfg, NULL).

    If the load capacitance of the crystal is 8pF, then 12 pF is the correct value for the capacitor for each leg ((12pF+4pF)/2 = 8pF, 4pF is the pin capacitance).

Related