We are trying to use extended BLE advertising with a nrf5340dk and are experiencing problems when trying to connect to an android phone (Android 13). Using legacy adverising works just fine but when extended advertising is used the device is discovered noticeably less reliable. Using the nrfConnect app we experience following behaviour:
- Discovery of the device while scanning is noticeably less reliable, takes sometimes very long
- The connection information in the app (rssi, ...) are greyed out after ~1s
- When the device is discovered, the advertising data is parsed correctly
- When trying to connect, the connection fails on the host side after ~2s!
- The nrf5340 shows this warning:
[00:04:35.721,862] <inf> BT_CENTRAL_MGR: Connected: 79:D3:63:A2:1C:44 (random) [00:04:35.721,893] <inf> BT_CENTRAL_MGR: Connected as Peripheral [00:04:36.011,199] <wrn> bt_conn: conn 0x200068a0 failed to establish. RF noise?
The extended advertising is started like this:
static struct bt_le_ext_adv *g_extAdv = NULL; ... int err = bt_le_ext_adv_create( BT_LE_EXT_ADV_CONN, NULL, &g_extAdv ); if ( err ) { LOG_ERR( "Failed to create advertising set (err %d)", err ); return err; } const struct bt_data advDat[6] = { BT_DATA( BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME, sizeof( CONFIG_BT_DEVICE_NAME ) - 1 ), BT_DATA_BYTES( BT_DATA_FLAGS, ( BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR ) ), BT_DATA( BT_DATA_MANUFACTURER_DATA, &g_advDat.devT, sizeof( g_advDat.devT ) ), BT_DATA( BT_DATA_MANUFACTURER_DATA, g_advDat.configID, 16 ), BT_DATA( BT_DATA_MANUFACTURER_DATA, &g_advDat.alarmCnt, sizeof( g_advDat.alarmCnt ) ), BT_DATA( BT_DATA_MANUFACTURER_DATA, &g_advDat.bat, sizeof( g_advDat.bat ) ) }; int err = bt_le_ext_adv_set_data( g_extAdv, advDat, ARRAY_SIZE( advDat ), NULL, 0 ); if ( err ) { LOG_ERR( "Failed to set advertising data (err %d)", err ); return err; } bt_le_ext_adv_start( g_extAdv, BT_LE_EXT_ADV_START_DEFAULT ); ...
prj.conf BLE Options
CONFIG_BT=y CONFIG_BT_SMP=y CONFIG_BT_SIGNING=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_CENTRAL=y CONFIG_BT_DIS=y # To make long/reliable writes with 512Bytes possible this has to be set to # 512Bytes / minimal MTU payload (23-5 = 18Bytes) ~ 29 CONFIG_BT_ATT_PREPARE_COUNT=29 # Configs for Static ble address CONFIG_BT_PRIVACY=n CONFIG_BT_SCAN_WITH_IDENTITY=y CONFIG_BT_DEVICE_NAME="Test" CONFIG_BT_DEVICE_APPEARANCE=833 CONFIG_BT_DEVICE_NAME_DYNAMIC=y CONFIG_BT_DEVICE_NAME_MAX=65 CONFIG_BT_MAX_CONN=4 CONFIG_BT_MAX_PAIRED=2 CONFIG_BT_SCAN=y CONFIG_BT_SCAN_FILTER_ENABLE=y CONFIG_BT_SCAN_MANUFACTURER_DATA_CNT=1 CONFIG_BT_GATT_DM=y CONFIG_BT_GATT_CLIENT=y CONFIG_BT_KEYS_OVERWRITE_OLDEST=y CONFIG_BT_SETTINGS=y CONFIG_BT_BUF_ACL_RX_SIZE=516 CONFIG_BT_BUF_ACL_TX_SIZE=516 CONFIG_BT_L2CAP_TX_MTU=516 CONFIG_BT_RX_STACK_SIZE=4096 CONFIG_BT_GAP_PERIPHERAL_PREF_PARAMS=y CONFIG_BT_PERIPHERAL_PREF_MIN_INT=6 CONFIG_BT_PERIPHERAL_PREF_MAX_INT=6 CONFIG_BT_PERIPHERAL_PREF_LATENCY=0 CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=400 CONFIG_BT_CONN_PARAM_UPDATE_TIMEOUT=500 CONFIG_BT_EXT_ADV=y
hci_ipc.conf
CONFIG_MAIN_STACK_SIZE=512 CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=512 CONFIG_BT_BUF_ACL_TX_SIZE=516 CONFIG_BT_BUF_ACL_RX_SIZE=516 CONFIG_BT_CTLR_DATA_LENGTH_MAX=251 CONFIG_BT_MAX_CONN=4 CONFIG_BT_CTLR_SDC_PERIPHERAL_COUNT=3 CONFIG_HEAP_MEM_POOL_SIZE=8192 CONFIG_BT_EXT_ADV=y # Enable GPIO CONFIG_GPIO=n # Enable UART driver CONFIG_SERIAL=n # Enable console CONFIG_CONSOLE=n CONFIG_UART_CONSOLE=n CONFIG_PINCTRL=n
The connection with an iPhone 11 works.
Are there any Configuration Options we missed or is there some other reason on the nrf side why extended advertising won't work correctly? Are you able to suggest some debug steps?
Thanks in advance.