Hi! I'm currently using
- board: nRF52840 DK
- SoftDevice v15
- ble_app_template example + midi (adding custom service and characteristic)
-----------------------------------------------------------------------------------------------------------
I want to achieve maximum throughput, and so far this is what I found out
1. Use notifications
2. Raise the NRF_SDH_BLE_GATT_MAX_MTU_SIZE to 247
3. Raise the NRF_SDH_BLE_GAP_DATA_LENGTH to 251 ( I assumed this is enabling DLE)
4. Use LE 2M PHY
5. Minimize Connection interval
- #define MIN_CONN_INTERVAL MSEC_TO_UNITS(7.5, UNIT_1_25_MS
- #define MAX_CONN_INTERVAL MSEC_TO_UNITS(7.5, UNIT_1_25_MS)
---------------------------------------------------------------------------------------------------------
1~3 worked fine. However, I have questions with 4 and 5.
Question1.
I read that the minimum connection interval should be 7.5. However, when I tried changing the value above to
#define MIN_CONN_INTERVAL MSEC_TO_UNITS(5, UNIT_0_625_MS)
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(5, UNIT_0_625_MS)
I found out that this results in more better results. ( I could send more notifications in 1 second )
Why is this possible? And again, is the code written in 5 the minimum spec we can go to??
Question2.
The codes related to setting PHY are like below. With this code, when I connect to nRF Connect with my mobile phone(Galaxy S9) and read the PHY it is always set to 1MBPS. I've searched all day to change it to 2 MBPS, but just can't seem to change it.
- p_advertising->adv_params.primary_phy = BLE_GAP_PHY_1MBPS;
-
// Initialize advertising parameters with default values.
memset(&p_advertising->adv_params, 0, sizeof(p_advertising->adv_params));
p_advertising->adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED;
// Use 1MBIT as primary phy if no phy was selected.
if (phy_is_valid(&p_advertising->adv_modes_config.ble_adv_primary_phy))
{
p_advertising->adv_params.primary_phy = p_advertising->adv_modes_config.ble_adv_primary_phy;
}
else
{
p_advertising->adv_params.primary_phy = BLE_GAP_PHY_1MBPS;//here
}
if (p_advertising->adv_modes_config.ble_adv_extended_enabled)
{
// Use 1MBIT as secondary phy if no phy was selected.
if (phy_is_valid(&p_advertising->adv_modes_config.ble_adv_primary_phy))
{
p_advertising->adv_params.secondary_phy = p_advertising->adv_modes_config.ble_adv_secondary_phy;
}
else
{
p_advertising->adv_params.secondary_phy = BLE_GAP_PHY_1MBPS;
}
}
p_advertising->adv_params.filter_policy = BLE_GAP_ADV_FP_ANY;
-
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
ret_code_t err_code = NRF_SUCCESS;
switch (p_ble_evt->header.evt_id)
{
case BLE_GAP_EVT_DISCONNECTED:
NRF_LOG_INFO("Disconnected.");
// LED indication will be changed when advertising starts.
break;
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);
break;
case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
{
NRF_LOG_DEBUG("PHY update request.");
ble_gap_phys_t const phys =
{
.rx_phys = BLE_GAP_PHY_AUTO,
.tx_phys = BLE_GAP_PHY_AUTO,//here
};
err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
APP_ERROR_CHECK(err_code);
} break;
case BLE_GATTC_EVT_TIMEOUT:
// Disconnect on GATT Client timeout event.
NRF_LOG_DEBUG("GATT Client Timeout.");
err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
APP_ERROR_CHECK(err_code);
break;
case BLE_GATTS_EVT_TIMEOUT:
// Disconnect on GATT Server timeout event.
NRF_LOG_DEBUG("GATT Server Timeout.");
err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
APP_ERROR_CHECK(err_code);
break;
default:
// No implementation needed.
break;
}
}
-
static bool config_is_valid(ble_adv_modes_config_t const * const p_config)
{
if ((p_config->ble_adv_directed_high_duty_enabled == true) &&
(p_config->ble_adv_extended_enabled == true))
{
return false;
}
#if !defined (S140)
else if ( p_config->ble_adv_primary_phy == BLE_GAP_PHY_CODED||
p_config->ble_adv_secondary_phy == BLE_GAP_PHY_CODED)//here
{
return false;
}
#endif // !defined (S140)
else
{
return true;
}
}
------------------------------------------------------------------------------------------------------------------
Thanks for all your help.
