Distinguish between Coded S2 and S8 (NRF52840)

Hi,

I'm trying to understand how I exactly can differentiate between CODED S=2 and S=8. I've experimented with the BLE fundamentals Lesson 3, Exercise 2 and set the PHY modes (1M, 2M, S2 and S8) (Also CONFIG_BT_CTLR_PHY_CODED=y is set in prj.conf)

I'm setting the PHY directly in the peripheral with the update_phy(...) function. In the .options field, I tested BT_CONN_LE_PHY_OPT_CODED_S2 and  BT_CONN_LE_PHY_OPT_CODED_S8.

static void update_phy(struct bt_conn *conn) {
    int err;
    const struct bt_conn_le_phy_param preferred_phy = {
        .options = BT_CONN_LE_PHY_OPT_CODED_S8,
        .pref_rx_phy = BT_GAP_LE_PHY_CODED,
        .pref_tx_phy = BT_GAP_LE_PHY_CODED,
    };
    err = bt_conn_le_phy_update(conn, &preferred_phy);
    if (err) {
        LOG_ERR("bt_conn_le_phy_update() returned %d", err);
    }
}

Although I change the options I'm always getting getting tx_phy = 4 and rx_phy = 4 in the on_le_phy_updated(...) function, which is according to the macro BT_CONN_LE_TX_POWER_PHY_CODED_S2

void on_le_phy_updated(struct bt_conn *conn, struct bt_conn_le_phy_info *param) {
    // PHY Updated
    if (param->tx_phy == BT_CONN_LE_TX_POWER_PHY_1M) {
        LOG_INF("PHY updated. New PHY: 1M");
    }
    else if (param->tx_phy == BT_CONN_LE_TX_POWER_PHY_2M) {
        LOG_INF("PHY updated. New PHY: 2M");
    }
    else if (param->tx_phy == BT_CONN_LE_TX_POWER_PHY_CODED_S8) {
        LOG_INF("PHY updated. New PHY: Long Range S8");
    }
    else if (param->tx_phy == BT_CONN_LE_TX_POWER_PHY_CODED_S2) {
        LOG_INF("PHY updated. New PHY: Long Range S2");
    }
}

Is it possible that the function of checking the PHY is incorrect? Cause in update_phy(...) we are setting BT_GAP_LE_PHY_CODED for  pref_rx_phy and  pref_tx_phy (which is 4). And I think these values are just the same in the on_le_phy_updated(...) (param->tx_phy, param->rx_phy) So there can be no distinction between S2 and S8?

So my question now: Is the update_phy(...) function wrong and there is no possibility to set S8 or is the on_le_phy_updated(...) function wrong.

Thanks a lot,
Phobios
Parents Reply
  • I'm using the NRF Connect SDK with version v2.4.2 and the SoftDevice Controller.

    I've tested the peripheral_hr_coded examples now and there the coded connection is used with value 4
    (Connected: D9:E5:ED:BF:7E:69 (random), tx_phy 4, rx_phy 4)

    Does value 4 now mean S2 or S8? Or in a simpler question. How can I set the coded PHY to S8 in user code?

    Best Regards,

    Manuel

Children
No Data
Related