This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Connection event trigger and Timeslot API

Good day to all

I would like to get a little more information about the function:

Fullscreen
1
2
3
// API for triggering a task when the SoftDevice is about to start a connection event
sd_ble_gap_conn_evt_trigger_start();
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

added in softdevice version 7.0.1.

Starting the radio in connection mode is shown in the figure (taken from the online power calculator). At what point will this trigger be issued?

Using the timer that starts on this trigger, I want to use timeslots before the connection event. At the moment, I have received the following diagram:

general

For run trigger:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
ret_code_t err_code;
switch (p_ble_evt->header.evt_id)
{
case BLE_GAP_EVT_CONNECTED:
{
NRF_LOG_INFO("Connected.");
err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
APP_ERROR_CHECK(err_code);
m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
APP_ERROR_CHECK(err_code);
ble_gap_conn_event_trigger_t trigger_params;
trigger_params.ppi_ch_id = 0;
trigger_params.task_endpoint = (uint32_t)&NRF_EGU3->TASKS_TRIGGER[0];
trigger_params.conn_evt_counter_start = 1;
trigger_params.period_in_events = 1;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

IRQ Handlers:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// event's connection
void SWI3_EGU3_IRQHandler(void)
{
if (NRF_EGU3->EVENTS_TRIGGERED[0] != 0)
{
NRF_EGU3->EVENTS_TRIGGERED[0] = 0;
// Запускаем таймер на ожидание следующего интервала
NRF_RTC2->TASKS_START = 1;
// for debug with SALEAE: short pulse on gpio
NRF_P1->OUTSET = 1 << 1;
for(uint8_t i=0; i<63; ++i)
__NOP();
NRF_P1->OUTCLR = 1 << 1;
}
}
void RTC2_IRQHandler (void)
{
if(NRF_RTC2->EVENTS_COMPARE[0] == 1)
{
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Requsting timeslots:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static void ts_on_sys_evt(uint32_t sys_evt, void *p_context);
NRF_SDH_SOC_OBSERVER(timesync_soc_obs, TS_SOC_OBSERVER_PRIO, ts_on_sys_evt, 0);
void ts_on_sys_evt(uint32_t sys_evt, void *p_context)
{
switch (sys_evt)
{
case NRF_EVT_RADIO_BLOCKED:
case NRF_EVT_RADIO_CANCELED:
case NRF_EVT_RADIO_SESSION_IDLE:
case NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN:
{ // CLOSE (!)
uint32_t err_code = sd_radio_session_close();
APP_ERROR_CHECK(err_code);
}break;
case NRF_EVT_RADIO_SESSION_CLOSED:
sd_clock_hfclk_release();
sd_power_mode_set(NRF_POWER_MODE_LOWPWR);
NRF_P1->OUTCLR = 1 << 2;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

I expected the session to be closed long before the start of the next connection event, but judging by the analyzer diagram, this happens later.

I have an assumption that this is due to handler priorities. The handler starts working later, after SD. Is this behavior correct?

I didn’t fully figure out how to correctly track the time of the time slot. Now I am measuring the time between events: NRF_RADIO_CALLBACK_SIGNAL_TYPE_START and NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0. 

Best regards,

Max