Hi, I want to set different gap event length for different peripheral on a ble central: 1 link with high throughput and 4 links with low throughput.
The sdk is 17.0.2, softdevice 7.1, hardware is pca10400.
I checked some post like:
"Multiple connections/links using the same tag is possible, and most, if not all BLE examples in the nRF5 SDK uses a single tag. But, with multiple tags, you can have different configurations for each link. Examples: 2 links with low throughput + one with high throughput, or 5 links, only one of them needs a large ATT MTU."
but I can not find any detail instruction how to use sd_ble_cfg_set() function add configurations.
Is there any example code to do this?
when i modify a new function from nrf_sdh_ble_default_cfg_set() as this:
ret_code_t ble_cfg_set(uint8_t conn_cfg_tag, uint32_t * p_ram_start, uint8_t event_len, uint8_t total_link, uint8_t central_link, uint8_t perip_link) { uint32_t ret_code; ret_code = nrf_sdh_ble_app_ram_start_get(p_ram_start); if (ret_code != NRF_SUCCESS) { return ret_code; } #if defined (S112) || defined(S312) STATIC_ASSERT(NRF_SDH_BLE_CENTRAL_LINK_COUNT == 0, "When using s112, NRF_SDH_BLE_CENTRAL_LINK_COUNT must be 0."); #endif // Overwrite some of the default settings of the BLE stack. // If any of the calls to sd_ble_cfg_set() fail, log the error but carry on so that // wrong RAM settings can be caught by nrf_sdh_ble_enable() and a meaningful error // message will be printed to the user suggesting the correct value. ble_cfg_t ble_cfg; #if (NRF_SDH_BLE_TOTAL_LINK_COUNT != 0) // Configure the connection count. memset(&ble_cfg, 0, sizeof(ble_cfg)); ble_cfg.conn_cfg.conn_cfg_tag = conn_cfg_tag; ble_cfg.conn_cfg.params.gap_conn_cfg.conn_count = total_link; ble_cfg.conn_cfg.params.gap_conn_cfg.event_length = event_len; ret_code = sd_ble_cfg_set(BLE_CONN_CFG_GAP, &ble_cfg, *p_ram_start); if (ret_code != NRF_SUCCESS) { NRF_LOG_ERROR("sd_ble_cfg_set() returned %s when attempting to set BLE_CONN_CFG_GAP.", nrf_strerror_get(ret_code)); } // Configure the connection roles. memset(&ble_cfg, 0, sizeof(ble_cfg)); #if !defined (S122) ble_cfg.gap_cfg.role_count_cfg.periph_role_count = perip_link; #endif // !defined (S122) #if !defined (S112) && !defined(S312) && !defined(S113) ble_cfg.gap_cfg.role_count_cfg.central_role_count = central_link; ble_cfg.gap_cfg.role_count_cfg.central_sec_count = MIN(central_link, BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT); #endif // !defined (S112) && !defined(S312) && !defined(S113) ret_code = sd_ble_cfg_set(BLE_GAP_CFG_ROLE_COUNT, &ble_cfg, *p_ram_start); if (ret_code != NRF_SUCCESS) { NRF_LOG_ERROR("sd_ble_cfg_set() returned %s when attempting to set BLE_GAP_CFG_ROLE_COUNT.", nrf_strerror_get(ret_code)); } // Configure the maximum ATT MTU. #if (NRF_SDH_BLE_GATT_MAX_MTU_SIZE != 23) memset(&ble_cfg, 0x00, sizeof(ble_cfg)); ble_cfg.conn_cfg.conn_cfg_tag = conn_cfg_tag; ble_cfg.conn_cfg.params.gatt_conn_cfg.att_mtu = NRF_SDH_BLE_GATT_MAX_MTU_SIZE; ret_code = sd_ble_cfg_set(BLE_CONN_CFG_GATT, &ble_cfg, *p_ram_start); if (ret_code != NRF_SUCCESS) { NRF_LOG_ERROR("sd_ble_cfg_set() returned %s when attempting to set BLE_CONN_CFG_GATT.", nrf_strerror_get(ret_code)); } #endif // NRF_SDH_BLE_GATT_MAX_MTU_SIZE != 23 #endif // NRF_SDH_BLE_TOTAL_LINK_COUNT != 0 // Configure number of custom UUIDS. memset(&ble_cfg, 0, sizeof(ble_cfg)); ble_cfg.common_cfg.vs_uuid_cfg.vs_uuid_count = NRF_SDH_BLE_VS_UUID_COUNT; ret_code = sd_ble_cfg_set(BLE_COMMON_CFG_VS_UUID, &ble_cfg, *p_ram_start); if (ret_code != NRF_SUCCESS) { NRF_LOG_ERROR("sd_ble_cfg_set() returned %s when attempting to set BLE_COMMON_CFG_VS_UUID.", nrf_strerror_get(ret_code)); } // Configure the GATTS attribute table. memset(&ble_cfg, 0x00, sizeof(ble_cfg)); ble_cfg.gatts_cfg.attr_tab_size.attr_tab_size = NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE; ret_code = sd_ble_cfg_set(BLE_GATTS_CFG_ATTR_TAB_SIZE, &ble_cfg, *p_ram_start); if (ret_code != NRF_SUCCESS) { NRF_LOG_ERROR("sd_ble_cfg_set() returned %s when attempting to set BLE_GATTS_CFG_ATTR_TAB_SIZE.", nrf_strerror_get(ret_code)); } // Configure Service Changed characteristic. memset(&ble_cfg, 0x00, sizeof(ble_cfg)); ble_cfg.gatts_cfg.service_changed.service_changed = NRF_SDH_BLE_SERVICE_CHANGED; ret_code = sd_ble_cfg_set(BLE_GATTS_CFG_SERVICE_CHANGED, &ble_cfg, *p_ram_start); if (ret_code != NRF_SUCCESS) { NRF_LOG_ERROR("sd_ble_cfg_set() returned %s when attempting to set BLE_GATTS_CFG_SERVICE_CHANGED.", nrf_strerror_get(ret_code)); } return NRF_SUCCESS;
and call it like this:
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; // nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start); // APP_ERROR_CHECK(err_code); err_code = ble_cfg_set(1, &ram_start, 10, 4, 4, 0); APP_ERROR_CHECK(err_code); err_code = ble_cfg_set(2, &ram_start, 20, 1, 1, 0); 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); }
It does not work...