Hello,
I've got a NRF52840-DK development kit and tried to configure it with a ATT MTU size of 512 bytes (larger than 247 bytes). I've activated data length extension and configured the BLE softdevice with the following code:
static uint32_t ble_ram_start = 0x200030d0;
static nrf_clock_lf_cfg_t const softdevice_clock = {
.source = 1,
.rc_ctiv = 0,
.rc_temp_ctiv = 0,
.accuracy = 7};
//Enable softdevice
ret_error = sd_softdevice_enable(&softdevice_clock, app_error_fault_handler);
APP_ERROR_CHECK(ret_error);
//Enable interrupt handler
ret_error = sd_nvic_EnableIRQ(SWI2_IRQn);
APP_ERROR_CHECK(ret_error);
//Create BLE configuration
ble_cfg_t ble_config;
//Common CFG
memset(&ble_config, 0, sizeof(ble_config));
ble_config.common_cfg.vs_uuid_cfg.vs_uuid_count = 1; //Number of Vendor UUIDs
ret_error = sd_ble_cfg_set(BLE_COMMON_CFG_VS_UUID, &ble_config, ble_ram_start); //Configure Common CFG
APP_ERROR_CHECK(ret_error); //Check for error
//CONN CFG GAP
memset(&ble_config, 0, sizeof(ble_config));
ble_config.conn_cfg.conn_cfg_tag = 1; //Configuration tag for identifiing
ble_config.conn_cfg.params.gap_conn_cfg.conn_count = 1; //Maximum connections at a time
ble_config.conn_cfg.params.gap_conn_cfg.event_length = BLE_GAP_EVENT_LENGTH_MIN; //Minimum event length timing for faster events
ret_error = sd_ble_cfg_set(BLE_CONN_CFG_GAP, &ble_config, ble_ram_start); //Configure CONN GAP
APP_ERROR_CHECK(ret_error); //Check for error
//CONN CFG GATT
memset(&ble_config, 0, sizeof(ble_config));
ble_config.conn_cfg.conn_cfg_tag = 1; //Configuration tag for identifiing
ble_config.conn_cfg.params.gatt_conn_cfg.att_mtu = 512; //Set maximum ATT MTU package size like in specification
ret_error = sd_ble_cfg_set(BLE_CONN_CFG_GATT, &ble_config, ble_ram_start); //Configure CONN GATT
APP_ERROR_CHECK(ret_error); //Check for error
//CONN CFG GATTC
memset(&ble_config, 0, sizeof(ble_config));
ble_config.conn_cfg.conn_cfg_tag = 1; //Configuration tag for identifiing
ble_config.conn_cfg.params.gattc_conn_cfg.write_cmd_tx_queue_size = BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT; //Minimum one write without response request
ret_error = sd_ble_cfg_set(BLE_CONN_CFG_GATTC, &ble_config, ble_ram_start); //Configure CONN GATTC
APP_ERROR_CHECK(ret_error); //Check for error
//CONN CFG GATTS
memset(&ble_config, 0, sizeof(ble_config));
ble_config.conn_cfg.conn_cfg_tag = 1; //Configuration tag for identifiing
ble_config.conn_cfg.params.gatts_conn_cfg.hvn_tx_queue_size = BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT; //Minimum one handle request for queue
ret_error = sd_ble_cfg_set(BLE_CONN_CFG_GATTS, &ble_config, ble_ram_start); //Configure CONN GATTS
APP_ERROR_CHECK(ret_error); //Check for error
//CONN CFG L2CAP
memset(&ble_config, 0, sizeof(ble_config));
ble_config.conn_cfg.conn_cfg_tag = 1; //Configuration tag for identifiing
ble_config.conn_cfg.params.l2cap_conn_cfg.ch_count = 0; //Turn off L2CAP
ret_error = sd_ble_cfg_set(BLE_CONN_CFG_L2CAP, &ble_config, ble_ram_start); //Configure CONN L2CAP
APP_ERROR_CHECK(ret_error); //Check for error
//GAP CFG name
ble_gap_conn_sec_mode_t access_permissions = {.sm = 1, .lv = 1};
memset(&ble_config, 0, sizeof(ble_config));
ble_config.gap_cfg.device_name_cfg.write_perm = access_permissions; //No restrictions in permissions
ble_config.gap_cfg.device_name_cfg.vloc = BLE_GATTS_VLOC_USER; //Name in stack
ble_config.gap_cfg.device_name_cfg.p_value = device_name; //Device name buffer
ble_config.gap_cfg.device_name_cfg.max_len = sizeof(device_name); //Maximum size of device name
ble_config.gap_cfg.device_name_cfg.current_len = sizeof(device_name); //Size of device name
ret_error = sd_ble_cfg_set(BLE_GAP_CFG_DEVICE_NAME, &ble_config, ble_ram_start); //Configure device name
APP_ERROR_CHECK(ret_error); //Check for error
//GAP CFG role
memset(&ble_config, 0, sizeof(ble_config));
ble_config.gap_cfg.role_count_cfg.adv_set_count = 1; //Maximum advertising set
ble_config.gap_cfg.role_count_cfg.periph_role_count = 1; //Maximum connections as peripheral
ble_config.gap_cfg.role_count_cfg.central_role_count = 0; //Maximum connections as central
ble_config.gap_cfg.role_count_cfg.central_sec_count = 0; //Maximum shared instances as central
ble_config.gap_cfg.role_count_cfg.qos_channel_survey_role_available = 0; //Quality survey not available
ret_error = sd_ble_cfg_set(BLE_GAP_CFG_ROLE_COUNT, &ble_config, ble_ram_start); //Configure gap role
APP_ERROR_CHECK(ret_error); //Check for error
//GATTS CFG attr size
memset(&ble_config, 0, sizeof(ble_config));
ble_config.gatts_cfg.attr_tab_size.attr_tab_size = 1408; //Default GATTS attribute table size
ret_error = sd_ble_cfg_set(BLE_GATTS_CFG_ATTR_TAB_SIZE, &ble_config, ble_ram_start); //Configure attribute size
APP_ERROR_CHECK(ret_error); //Check for error
//GATTS CFG service changed
memset(&ble_config, 0, sizeof(ble_config));
ble_config.gatts_cfg.service_changed.service_changed = 0; //Don't include service changed characteristic
ret_error = sd_ble_cfg_set(BLE_GATTS_CFG_SERVICE_CHANGED, &ble_config, ble_ram_start); //Configure service changed
APP_ERROR_CHECK(ret_error); //Check for error
//Enable BLE
ret_error = sd_ble_enable(&ble_ram_start);
APP_ERROR_CHECK(ret_error);
When I enter 247 as the size for the ATT MTU all works perfect, but when I choose a larger number (in my case 512 byte) as ATT MTU, sd_ble_enable() does not return an error and I can debug over the code line. But when I try to step over the APP_ERROR_CHECK, it stops at the assembler command "4B01 ldr r3, [pc, #4]". When I debug through the assembler commands it ends after the command "4798 blx r3" with a NRF_BREAKPOINT_COND. What can I do to use a ATT MTU size over 247 bytes?
Thank you in advance, Jannik

