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

nrf51822 s130 bluetooth sample not work

#problem Not work ble sample code with s130 softdevice on nrf51822 module.

I just want to advertise by sample code.LED test with s130 is work well.

#Environment

  • target:nrf51822_CEAA(in BVMCN5112-CEAA module)
  • SDK:nRF5SDK_12.3.0_d7731ad
  • DebugAdapter:ST-Link-v2(SWD)
  • Debugger:Open-OCD 0.10.0 BTreceive
  • software :nRFconnnect(ASUS_Z00AD android5.0)
  • base src:ble_app_template
  • Tool chain: GNU tools ARM Embedded 5.4 2016q3
  • GNU_VERSION := 5.4.2
  • GNU_PREFIX := arm-none-eabi

LED test work good and loop endless.

"main() at main.c"

#include "nrf_delay.h"
#define OUTPIN PIN02
int main(void)
{
  //must be input_mode some pin in this BVMCN5112 module.
  int list_must_be_set_input[] = LIST_INPUT_MODE;//#Defined in "my_custom_board.h"
  for (int i = 0;i<NUM_INPUT_MODE;i++){
    nrf_gpio_cfg_input(list_must_be_set_input[i],NRF_GPIO_PIN_NOPULL);
  }
  nrf_gpio_cfg_output(OUTPIN);
  nrf_gpio_pin_clear(OUTPIN);

//LED test. this test is work well.
/*for(int cnt = 0;cnt<10;cnt++)
{
    nrf_gpio_pin_write(OUTPIN,1);
    //nrf_gpio_pin_toggle(PIN01);
    nrf_delay_ms(250*cnt);
    nrf_gpio_pin_write(OUTPIN,0);
    nrf_delay_ms(250*cnt);
}*/

    uint32_t err_code;
    bool     erase_bonds;

    // Initialize.
    err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    timers_init();
    buttons_leds_init(&erase_bonds);
    ble_stack_init();
    peer_manager_init(erase_bonds);
    if (erase_bonds == true)
    {
        NRF_LOG_INFO("Bonds erased!\r\n");
    }
    gap_params_init();
    advertising_init();
    services_init();
    conn_params_init();

    // Start execution.
    NRF_LOG_INFO("Template started\r\n");
    application_timers_start();
    err_code = ble_advertising_start(BLE_ADV_MODE_FAST);

   ////// To check error by LED. Runnning always ON (= NOT NRF_SUCCESS). 
    if(err_code != NRF_SUCCESS){
    nrf_gpio_pin_write(OUTPIN,1);
    }**

    APP_ERROR_CHECK(err_code);

    // Enter main loop.
    for (;;)
    {
        if (NRF_LOG_PROCESS() == false)
        {
            power_manage();
        }
    }
}

Of cource I wrote S130 softdevice to flash. In debugger console I do this.

>telnet localhost 4444
>reset halt
> flash write_image s130.hex
> flash write_image nrf51822_xxaa.hex
using fast async flash loader. This is currently supported
…
xPSR: 0x61000000 pc: 0x2000001e msp: 0x000007c0
wrote 43676 bytes from file nrf51822_xxaa.hex in 2.203775s (19.354 KiB/s)

> halt
target halted due to debug-request, current mode: Handler SVCall
xPSR: 0x6100000b pc: 0x00009f40 msp: 0x20003f10

when LED testing, in halting handler is "Thread"."SVCall" tell me some wrong work?

I think linker file is wrong, I try some RAM address but not work well. this is address setting I tried.

/*MEMORY
{
FLASH (rx) : ORIGIN = 0x0001b000, LENGTH = 0x40000
RAM (rwx) :  ORIGIN = 0x20002000, LENGTH = 0x01000
}*/

/*MEMORY
{
FLASH (rx) : ORIGIN = 0x1b000, LENGTH = 0x25000
RAM (rwx) :  ORIGIN = 0x20001fe8, LENGTH = 0x2000
}*/

/*copy from nrf51_xxaa.ld */
MEMORY
/*{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000
RAM (rwx) :  ORIGIN = 0x20000000, LENGTH = 0x4000
}*/

How do I decide APP_RAM_BASE address and RAM size? In S130 SDS(infocenter.nordicsemi.com/.../S130_SDS_v2.0.pdf),

APP_RAM_BASE address = 0x20000000+SoftDevice RAM consumption

but I dont know how calc RAM consumption, so I wrote linker file lazy.

Please give me some help. Why dont work only bluetooth? Please some Idea to solve this... Thanks reading.

#2017-07-10 SOLVED I got advise from professional of nrf device, as a result, I added under code on top of main loop, then it works well !

NRF_CLOCK->XTALFREQ = CLOCK_XTALFREQ_XTALFREQ_32MHz;

and this is clock settings in "[board].h".

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

I missunderstood High Freq. source of my device. The device has external 32MHz crystal, sorry.

Thanks all.

Parents
  • Thanks Jørgen very much.

    I learned about MEMORY setting from your answer and rewrite ld(linker script) file as same as your advise like this.

        MEMORY
    {
      FLASH (rx) : ORIGIN = 0x1b000, LENGTH = 0x25000
      RAM (rwx) :  ORIGIN = 0x20001fe8, LENGTH = 0x2018
    }
    

    I rebuild and write,but not work. In Open OCD with STLink I did this,

    reset halt
    nrf51 mass_erase
    flash write_image s130.hex
    flash write_image program.hex
    reset
    

    Now I have another doubt point about "SOFTDEVICE_HANDLER_INIT" function. I did "LED test" by under code, then I found not work function "SOFTDEVICE_HANDLER_INIT"(defined in "softdevice_handler.h") included "ble_stack_init()"(defined in "main.c"). Now I can't get why "SOFTDEVICE_HANDLER_INIT" not work.

    //<<LED test work well this place. LED flash 5times>>
    for(int cnt = 0;cnt<5;cnt++)
    {
    nrf_gpio_pin_write(OUTPIN,1);
    //nrf_gpio_pin_toggle(PIN01);
    nrf_delay_ms(250);
    nrf_gpio_pin_write(OUTPIN,0);
    nrf_delay_ms(250);
    
    }
    ble_stack_init();
    //<<LED test NG this place.Always LED on.>>
    

    I guess maybe problem is exist in clock setting. My device has no external clock crystal, So I wrote under code in board setting("nsm5112dev01.h").

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

    Run program, I saw flash LED 5times.(upper LED test code before ble_stack_init() function.)

    On the other hand, I saw flash LED endless with under setting. I know this setting is wrong for my device that has no Xtal.()

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

    What should I do next ? Please give me hint or any advise please. Thanks your reading.

    main.c

    Makefile

    ble_app_alert_notification_gcc_nrf51.ld

    nsm5112dev01.h

    softdevice_handler.h

  • I tried your code on a similar device (nRF51822 CEAA, no LF crystal) and it seems to work fine. There are no LEDs blinking, but the device is advertising. Are you sure it is not working? The reason why it's constantly blinking with wrong settings is that the default behavior when an error is reported, is to restart the device.

Reply Children
No Data
Related