Using SDK 14.0.0 with an nRF52832, I'm trying to use the data length extension, following some sample code found in this post:
https://devzone.nordicsemi.com/f/nordic-q-a/24840/using-dle-and-nrf_ble_gatt_max_mtu_size-23
Here's how I init the BLE stack.
static void ble_stack_init(void)
{
ret_code_t err_code;
err_code = nrf_sdh_enable_request();
APP_ERROR_CHECK(err_code);
// Configure the BLE stack using the default settings. Fetch the start address of the application RAM.
uint32_t ram_start = 0;
err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
APP_ERROR_CHECK(err_code);
// Overwrite some of the default configurations for the BLE stack.
ble_cfg_t ble_cfg;
memset(&ble_cfg, 0, sizeof(ble_cfg));
// Vendor-specific UUIDs. Count these in services_init() below.
ble_cfg.common_cfg.vs_uuid_cfg.vs_uuid_count = 3;
// Maximum transmission unit.
ble_cfg.conn_cfg.params.gatt_conn_cfg.att_mtu = NRF_SDH_BLE_GATT_MAX_MTU_SIZE;
// Data length extension.
ble_cfg.conn_cfg.conn_cfg_tag = APP_BLE_CONN_CFG_TAG;
uint8_t data_length = NRF_SDH_BLE_GATT_MAX_MTU_SIZE + L2CAP_HDR_LEN;
err_code = nrf_ble_gatt_data_length_set(&m_gatt, BLE_CONN_HANDLE_INVALID, data_length);
APP_ERROR_CHECK(err_code);
err_code = sd_ble_cfg_set(BLE_COMMON_CFG_VS_UUID, &ble_cfg, ram_start);
APP_ERROR_CHECK(err_code);
// Enable BLE stack.
err_code = nrf_sdh_ble_enable(&ram_start);
APP_ERROR_CHECK(err_code);
// Register a handler for BLE events.
NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
// Connection event length extension. Must be done *after* BLE is enabled.
ble_opt_t opt;
memset(&opt, 0x00, sizeof(opt));
opt.common_opt.conn_evt_ext.enable = 1;
err_code = sd_ble_opt_set(BLE_COMMON_OPT_CONN_EVT_EXT, &opt);
APP_ERROR_CHECK(err_code);
}
This causes NRF_ERROR_NO_MEM at the point where I init the third of four services (three of which are vendor specific) in my application. My linker script looks like this.
MEMORY
{
FLASH (rx) : ORIGIN = 0x23000, LENGTH = 0x2F000
RAM (rwx) : ORIGIN = 0x20002760, LENGTH = 0xB4A0
NOINIT (rwx) : ORIGIN = 0x2000DC00, LENGTH = 0x2400
}
I'm using the exact RAM start and size that the warnings I get at runtime ask for.
Removing the data length extension stuff fixes the NRF_ERROR_NO_MEM error (and produces new warnings about RAM size).