Why does nRF5340 cause an error when extended advertising/scanning using?

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.

Parents Reply Children
Related