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