I am developing with nRF5340 because I want to use nRF7002. When I try to use extended advertisements or extended scanning, I get error -5 (EIO). Why is this?
static void advertising_work_handler(struct k_work *work) { int err; struct bt_le_adv_param adv_param; char addr[BT_ADDR_LE_STR_LEN]; #if defined(CONFIG_BT_EXT_ADV) static struct bt_le_ext_adv *ext_adv; struct bt_le_ext_adv_start_param ext_adv_start_param = {0}; #endif bt_addr_le_copy(&bond_addr, BT_ADDR_LE_NONE); bt_foreach_bond(BT_ID_DEFAULT, copy_last_bonded_addr, NULL); if (bt_addr_le_cmp(&bond_addr, BT_ADDR_LE_NONE) != 0) { // Directed Advertising bt_addr_le_to_str(&bond_addr, addr, sizeof(addr)); LOG_INF("Start directed advertising to %s", addr); adv_param = *BT_LE_ADV_CONN_DIR_LOW_DUTY(&bond_addr); adv_param.options |= (BT_LE_ADV_OPT_DIR_ADDR_RPA | BT_LE_ADV_OPT_ONE_TIME); err = bt_le_adv_start(&adv_param, NULL, 0, NULL, 0); if (err) { LOG_ERR("Failed to start advertising.(%d)", err); fatal_error(); } // Set LED pattern ... } else { #if defined(CONFIG_BT_EXT_ADV) // Undirected Extended Advertising LOG_INF("Start undirected advertising with extension."); // Stop if (ext_adv) { err = bt_le_ext_adv_stop(ext_adv); if (err) { LOG_ERR("Failed to stop extended advertising(%d)", err); fatal_error(); } err = bt_le_ext_adv_delete(ext_adv); if (err) { LOG_ERR("Failed to delete advertising set(%d)", err); fatal_error(); } } // Fast Advertising with extension adv_param = *BT_LE_ADV_PARAM( BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME | BT_LE_ADV_OPT_EXT_ADV, 0x0050, // 0x0050(80) * 0.625 = 50(msec) 0x0050, // 0x0050(80) * 0.625 = 50(msec) NULL ); err = bt_le_ext_adv_create(&adv_param, NULL, &ext_adv); if (err) { LOG_ERR("Failed to create advertiser set.(%d)", err); fatal_error(); } err = bt_le_ext_adv_set_data(ext_adv, ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd)); if (err) { LOG_ERR("Failed to set advertising data.(%d)", err); fatal_error(); } err = bt_le_ext_adv_start(ext_adv, &ext_adv_start_param); if (err) { LOG_ERR("Failed to start advertising.(%d)", err); fatal_error(); } #else // Undirected Advertising LOG_INF("Start undirected advertising."); // Fast Advertising adv_param = *BT_LE_ADV_PARAM( BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME, 0x0050, // 0x0050(80) * 0.625 = 50(msec) 0x0050, // 0x0050(80) * 0.625 = 50(msec) NULL ); err = bt_le_adv_start(&adv_param, ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd)); if (err) { printk("Advertising failed to start (err %d)\n", err); } #endif // Set LED pattern ... } } K_WORK_DELAYABLE_DEFINE(advertising, advertising_work_handler);
It automatically uses different advertising depending on whether CONFIG_BT_EXT_ADV is present or not. nRF52840 and nRF52832 do not have errors with this source code, but only nRF5340 has errors when using extended advertising. Perhaps nRF5340 has a different API for extended advertising?
For reference, I have tried SDK 2.4.2, 2.5.2 and 2.6.0, all with the same results.