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

nrf51-ble-app-temp Example - DFU App returns error

(Before debugging with IAR, I downloaded both the bootloader.hex and s110 7.1 hex with nrfjprog.exe)

  • Modified SDK files : bootloader_util_arm.c

(copied asm code SDK 8.1 since I use ICCARM, thanks to Vidar Berg for answering my prev question.)

  • Using nRFGo Studio 1.19.0

  • Board : PCA10001 V 2.0.0 (Rev. 2 MCU)

  • Test device : Nexus 5 (Android 5.1.1) and iPhone 6+ (iOS 8.4)

  • Toolbox App Version : 1.14.1 (at Nexus 5) & 2.1 (at iPhone 6+)

  • nRF Loader iOS App (Ver 1.0.0) : Cannot scan the board

/************************/

Hi, before defining "BLE_DFU_APP_SUPPORT" the example worked well.

However, after defining, both Tool kit app showed error.

At iOS,

iOS

The "nRF Loader" app doesn't scan the board.

Loader

Where as, at Android

An1

I selected "NO".

An2

An3

Master

What could be the reason?

Added 8, July, 2015 :

I noticed that, at debugging mode and after calling on_rw_auth_req (at ble_dfu.c),

the board falls into a HardFault_handler.

I couldn't check the returned error number from on_ctrl_pt_write.

Added : 12, July, 2015 : I tried to open your bootloader IAR project.

However, it showed this message 6 times.

msg

log

So, I followed your linker script settings manually.

I also changed the ble_stack_init as well.

Thanks to you, if there isn't application at memory 0x16000,

the firmware update over the air (DFU) is managed successfully.

I tested with the test devices mentioned above (Nexus 5 and iPhone 6+).

linker 1 linker 2

linker 3

After downloading the bootloader firmware,

I changed the linker setting of the nrf51-ble-app-temp example.

  1. Is this setting in the nrf51-ble-app-temp example's linker script is fine?

I took a guess using this memory layout.

  1. The hilarious thing is that, after downloading this nrf51-ble-app-temp example,

I tried the DFU using the nRF Toolbox app and failed.

With detail, when using the Nexus 5, it sometimes update the firmware.

(Edited : Now the Nexus 5 works well.)

Whereas when using the iPhone 6+, the app kept shows "waiting".

I placed a breakpoint at the bootloader project after the board was advertising HRS.

I noticed that, when using the iPhone 6+, after requesting upload, the breakpoint didn't triggered.

The firmware was kept running at the nrf51-ble-app-temp example.

However, it did not lost connection together.

So, what could be the problem?

-Regards, Mango922

  • Bond sharing between application and bootloader was added in SDK 7.0.0 which relies on the assembly routines in dfu_ble_svc.c (bootloader) to fetch the bond data. IAR support for this was added in SDK 8.1.0

    I have attached the bootloader from SDK 8.1.0 configured for running on PCA10001 with the 2nd rev chip in addition to the ble_app_hrs .zip package which can be used for testing of DFU.

    nRF Loader for iOS is deprecated and should only be used for legacy support. nRFtoolbox/Master control panel(not available on iOS) are now the recommend applications for doing DFU.

    Changes:

    • Enabled CPU blocking due to PAN #44 and #45, see ble_stack_init()
    • Changed board pinout
    • Adjusted the linker so the RAM usage would not exceed 16K.

    Attachments:

    dfu_iar_pca10001.zip

    IAR_ble_app_hrs.zip

    Note that the init file became a requirement in SDK version 7.0.0 and later. Details on how to create a init file for your own application is documented here.

  • iOS caches the attribute table if the service changed characteristic is not being used. So it could be that your phone is 'seeing' an old attribute table . You can try to clear any bonding in settings->bluetooth and then do a reboot. - This should force a re-discovery of the services.

    1. Regardless whether the peripheral pairs or bond with the central (in this case, the iPhone),

    does iOS caches the attribute table? This is the reason why, after changing the device's name,

    the iPhone shows the past name, is it?

    1. This example uses Heart Rate Service. Due to this reason, I cannot clear bonding

    in settings -> Bluetooth because this service only pairs. Then what should I do?

    Added : Sorry for not mentioning. I was using SDK7.2.

  • Are you using SDK 8.1.0/9.0.0? With bonding the service changed indication needs to be sent from the bootloader, which it did not do in SDK 7.x.x. You can try the hrs without bonding if you use the example images found in \examples\dfu\ble_dfu_send_hex\test_images_update\dfu_test_app_hrm_s110.zip"

  • I think the easiest solution to this problem is to just download nRF51_SDK_9.0.0 as it already supports IAR. Then you will only have to do changes mentioned in my answer below. I tried the example I sent you with iOS and did not experience any issues. However, looks like it does not work if opened in a different version of IAR.

Related