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

Unexpected return value when calling sd_ble_gatts_hvx() when notifications are not enabled

This issue concerns code using Softdevice S132 v6.1.1. v5.0.0. I did not test with any other version.

From the documentation of sd_ble_gatts_hvx in ble_gatts.h, I expect that the return value when calling this function while notifications are disabled for the characteristic in question is NRF_ERROR_INVALID_STATE.

Instead, the function returns BLE_ERROR_NOT_ENABLED, which suggests that the softdevice is not enabled, but this is of course not the case because the device in question is connected when the issue arises.

Parents Reply
  • Hi Andreas,

    Could you help me reproduce the issue? Perhaps share your project? I can make the ticket private if you like :-)

    I finally managed to reproduce the issue for you. I don't even have to provide code, the Nordic SDK provides the example directly.

    Steps to reproduce:

    1. Download SDK 15.2.0
    2. Flash the associated softdevice onto an nRF52 DK (S132 v6.1.0)
    3. Build and flash the exmple "ble_peripheral\ble_app_blinky"
    4. Start the debugger and set a breakpoint in main.c, function button_event_handler(), in the if-block on line 497:
      if (err_code != NRF_SUCCESS &&
                      err_code != BLE_ERROR_INVALID_CONN_HANDLE &&
                      err_code != NRF_ERROR_INVALID_STATE &&
                      err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
    5. Connect to the peripheral with e.g. nRF Connect.
    6. Press Button 1 on the nRF52 DK.
    7. When you inspect the contents of the err_code variable in the debugger, you will notice that the value reads 0x3401, which corresponds to BLE_ERROR_NOT_ENABLED and is documented in ble_err.h as indicating that "sd_ble_enable has not been called."

    Best regards,

    -mike

Children
  • Hi.

    I've give you a reply tomorrow, I've been quite busy today, sorry.

    Best regards,

    Andreas

  • Hi.

    The error you see is not BLE_ERROR_NOT_ENABLED, but BLE_ERROR_GATTS_SYS_ATTR_MISSING.

    We can first take a look at the math for the two different definitions:

    NRF_ERROR_STK_BASE_NUM = 0x3000 in the SDK

    BLE_ERROR_NOT_ENABLED = NRF_ERROR_STK_BASE_NUM + 0x001 = 0x3001

    BLE_ERROR_GATTS_SYS_ATTR_MISSING = NRF_GATTS_ERR_BASE + 0x001 = NRF_ERROR_STK_BASE_NUM + 0x400 + 0x001 = 0x3401

    Also checked that this is the value by debugging:

    Can also see that sd_ble_enabled returns 0x8 which is invalid state (NRF_ERROR_INVALID_STATE):

    So I'm pretty confident that the error is BLE_ERROR_GATTS_SYS_ATTR_MISSING, and the solution to handle this error is described here.

    Best regards,

    Andreas

Related