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

Issue with Softdevice S140 on Arduino Nano BLE 33 board (nRF52840)

Hi Folks,

I am getting in trouble with SoftDevice activation. Indeed, my application did not return from the "nrf_sdh_enable_request()" call, more precisely it hangs into the "sd_softdevice_enable".

I want to mention that I compile the S140 file within my application so I did not flash independently the Softdevice hex previously into my target. Maybe my linker script file is not OK or my sdk_config.h file

My questions are: Is it possible to flash in one shot softdevice + application ?if yes, how must be configured the linker script file?

I have also noticed that the "sd_softdevice_enable" function refers to a sd_softdevice_enable to a SVCALL so I suppose S140 must be flashed first in that configuration so my Arduino board must be in a hard fault reset state. Am I right?

Another file contains a pure C definition , it is located in the named "ser_softdevice_handler.c". Can it serve to implement Softdevice without in a single application file?

I know I ask a lot so I thank u a lot as well.

The best.

Seb

  • Sebastien DRI said:
    You are right, I must buy a J-link to perform those operations.

     You can use a nRF51, NRF52 , nRF52840 and nRF52833 DK as a Jlink Porgrammer/Debugger for development purposes(not production programming). So if this is only for development, then a Nordic DK is more afordable than a Jlink probe. 

    Sebastien DRI said:

    Bossac executable only understands *.bin files so that's why I convert the generated hex files.

    This is the end when flashing mbr + sofdevice on the arduino board using bossac software:

     Ok, Is this the complete log? The MBR and SD should be flashed from 0x0000 and upwards to 0x26000. 

     

    Sebastien DRI said:

    Then, I flash the firmware application starting at 0x26000.

    Here is a snapshot of my linker script file:

    So I have started flashing from 0x26000 which is next sector.

    I am a bit unsure if its OK to place the RAM_NVIC and RAM_CRASH_DATA sections  before the the RAM section. Have you checked which ram start value that sd_ble_enable() function returns?

     

    Sebastien DRI said:

    Another point is that the arduino Board only work when application is located at offset 0x10000 so maybe Bootloader reset handler is configured to jump at that address.

    I found very strange that Arduino has set up such king of default configuration since 0x10000 does not allow a Softdevice normal use.

    Maybe I miss something.

    Is there a way to modify this offset address in the bootloader in order to jump to the right offset?

     When you refer to the bootloader you are talking about the Arduino bootloader right? Yes, I agree that it sounds weird that the application must be placed at 0x10000 if the Nano 33 BLE board supports BLE using the SD. 

    The Nordic Bootloader will jump to 0x1000, which is the reset handler of the SoftDevice, which will do som initialization before jumping to 0x26000 where the application is located.  I do not know how to modify the Arduino bootloader.  

     

    Sebastien DRI said:

    I also noticed that an application without softdevice flashed , so running from 0x10000 offset adress, shall have the RAM_NVIC configured so that it can work properly. It's different compared to other examples which use ISR vector table but  I think it's different things appart from my initial problem.

    In fact, I do not master how works the initilal sequence from hard reset to application start and what is involving this fixed offset address in flash memory.

    To me, in a normal sequence with softdevice (after single press on hard reset) we shall have MBR->Softdevice-> Firmware application

    and on a double tap reset (MBR-> Bootloader)

     Again I can only provide insight on the Nordic Bootloader. The MBR will branch to a bootloader if its address is stored in UICR(0x10001014) and then the bootloader will jump to the SoftDevice, which in turn will jump to the application.

    If no bootloader address is stored in UICR, then the MBR will jump directly to the bootloader. 

    Best regards

    Bjørn

  • Thank you again for your answers and advices.

     Ok, Is this the complete log?

    No it is not and yes it starts from 0x00000000


    Have you checked which ram start value that sd_ble_enable() function returns?

    No, but I will check if the "sd_ble_enable" return since for instance I have deactivated BLE in the main application.

    I hope that RAM_NVIC & RAM_CRASH_DATA sections are detected by Softdevice so that it can shift the application start adress accordingly taking into account them.

    What do you suggest in that case? Specify the Softdevice ram section within linker script?

    When you refer to the bootloader you are talking about the Arduino bootloader right?

    Yes, i am talking about the SAM-BA factory bootloader of which I have recently checked the code and I have discovered they do not automate app start adress calculation.

    Consequently I'll load a different bootloader (the Adafruit_nRF52_Bootloader compatibles with nano 33 board) as soon as I'll receive the programming board. Hope will be fine once done.

    Thank you again for your support. It helps me to under quickly how it works.

    Let's be in touch later if you want to conclude this chapter.

  • Sebastien DRI said:

    No, but I will check if the "sd_ble_enable" return since for instance I have deactivated BLE in the main application.

    I hope that RAM_NVIC & RAM_CRASH_DATA sections are detected by Softdevice so that it can shift the application start adress accordingly taking into account them.

    What do you suggest in that case? Specify the Softdevice ram section within linker script?

     As long as the ram_start value returned by sd_ble_enable is lower than the origin of the RAM_NVIC region then I think you should be good!

    Sebastien DRI said:

    Yes, i am talking about the SAM-BA factory bootloader of which I have recently checked the code and I have discovered they do not automate app start adress calculation.

    Consequently I'll load a different bootloader (the Adafruit_nRF52_Bootloader compatibles with nano 33 board) as soon as I'll receive the programming board. Hope will be fine once done.

    Thank you again for your support. It helps me to under quickly how it works.

    Let's be in touch later if you want to conclude this chapter.

     Yes, let me know once you can program the board directly via SWD.

     

  • Welcome back!!,

    I can now boot my application from  the Adafruit_nRF52_Bootloader whatever the application offset is.

    First problem solved!

    I bought a Segger Jlink mini to perform the flashing operation, perfect.

    Now , I have still an issue when initialising softdevice upon mbedos

    I have recently posted a detailled explanation on the mbed-os forum:

    https://forums.mbed.com/t/svc-exit-when-activating-softdevice/8251

    Maybe you have an opinion on how to make work Nordic SDK on mbed OS when you have already flashed a softdevice on target. I seems that mbed OS has its own SVC_Handler and it results in going into application fault since softdevice is not properly initialised.

    Thank u again.

    Seb

  • Hi Seb, 

    Glad to hear that you can jump to the application to your application the nRF52840 with the Adafruit_nRF52_Bootloader. 

    I am afraid that dont have very much experience with Svc handlers, but I guess there may be issues if the mBed OS and SoftDevice API uses the same SVC numbers. In our example projects the SVC Handler is weakly defined in the startup file(.s).  When the SoftDevice is flashed to the nRF52840, then all execptions are processed by the SoftDevice first and then forwarded to either the bootloader or application. THats atleast how it works in our SDK. 

    Does sd_softdevice_enable return a non-zero error code ?

    Best regards

    Bjørn

Related