How to add different configurations with different GAP event length in multiliniks using the sd_ble_cfg_set() function?

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:

https://devzone.nordicsemi.com/f/nordic-q-a/67032/purpose-of-app_ble_conn_cfg_tag-in-the-function-nrf_sdh_ble_default_cfg_set-when-initializing-the-ble-stack

"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...

Parents Reply Children
  • Thinks for reply.

    There is no error message to log output. Softdevice is work fine.I found all perips have same gap event length with logic analyzer though radio notification(in radio notification event, a gpio turn high when radio is active).

    After a month, I am working on this thread again.

    When I set

    init_scan.connect_if_match = false;

    of uuid filter, and call  sd_ble_gap_connect() in 

    scan_evt_handler.NRF_BLE_SCAN_EVT_FILTER_MATCH,

    It works with expectations.

    Yes, It works.

    But I think it's not very elegance because I have to switch the “con_cfg_tag” by hard code.
    I am finding some better method. for example, switch the “con_cfg_tag” automatically via different UUID.
    One more question, the "conn_cfg_tag" is only work on local ? in other words,con_cfg_tag of peripheral can be completely different from the central ?

  • Yes, you must handle the connection yourself when receiving the NRF_BLE_SCAN_EVT_FILTER_MATCH event as the scan module does not have any way of knowing which connection configuration tag to use.

    velarn said:
    One more question, the "conn_cfg_tag" is only work on local ? 

    Yes, it's local only. The tag simply points to your local connection configurations.

Related