Hi,
I am now on implementing a dynamic change between the 2 possible roles central and peripheral. I try to do this like described here: nordicsemi.com/question/35367... But when trying to switch from peripheral to central, I always get an error on the SOFTDEVICE_HANDLER_INIT() function. My ble_stack_init() function looks like this:
static uint32_t ble_stack_init(uint8_t role)
{
uint32_t err_code;
ble_uuid128_t base_uuid = DEVICE_PERIPHERAL_BASE_UUID;
// Initialize the SoftDevice handler module.
SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, NULL);
// Enable BLE stack
ble_enable_params_t ble_enable_params;
memset(&ble_enable_params, 0, sizeof(ble_enable_params));
if(role == BLE_GAP_ROLE_PERIPH) ble_enable_params.gatts_enable_params.service_changed = IS_SRVC_CHANGED_CHARACT_PRESENT;
else if (role == BLE_GAP_ROLE_CENTRAL) ble_enable_params.gatts_enable_params.service_changed = false;
#ifdef S120
ble_enable_params.gap_enable_params.role = role;
#endif
err_code = sd_ble_enable(&ble_enable_params);
APP_ERROR_CHECK(err_code);
if(role == BLE_GAP_ROLE_PERIPH)
{
err_code = sd_ble_uuid_vs_add(&base_uuid, &m_base_uuid_type);
APP_ERROR_CHECK(err_code);
}
err_code = softdevice_ble_evt_handler_set(ble_evt_dispatch);
APP_ERROR_CHECK(err_code);
if(role == BLE_GAP_ROLE_PERIPH)
{
// Register with the SoftDevice handler module for BLE events.
err_code = softdevice_sys_evt_handler_set(sys_evt_dispatch);
APP_ERROR_CHECK(err_code);
}
return err_code;
}
Before I call this ble_stack_init() function, I disable the softdevice with:
err_code = sd_softdevice_disable();
SOFTDEVICE_HANDLER_INIT() returns error code 4097. For me this does not look like a valid error code. The documentation for that function says, that SOFTDEVICE_HANDLER_INIT should be called only once. So, how to achive the switch between the roles? Is there a working example with the S120 where the role is switched somewhere in the application?
Regards, BTprogrammer