Extended Advertising Start Issue with PAwR Scanner Role

Hi.

Environment : nrf52833, ncs v3.1.1

I am developing device that has PAwR Scanner Role and Extended Advertising for connecting Mobile Phone(nRF Connect APP).

PAwR is Fine. However when connect/disconnect several Times, bt_le_ext_adv_start return -12.

under code is prj.conf

## USER Config
CONFIG_DTM_INCLUDE=y
CONFIG_USER_LOG_ENABLE=n


# LOG
CONFIG_LOG=y
CONFIG_RTT_CONSOLE=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_LOG_DEFAULT_LEVEL=0
CONFIG_UART_CONSOLE=n
CONFIG_CBPRINTF_FP_SUPPORT=y
CONFIG_LOG_MODE_IMMEDIATE=y

CONFIG_LOG_TIMESTAMP_64BIT=y

## DEBUG
CONFIG_ASSERT=y
CONFIG_RESET_ON_FATAL_ERROR=n

CONFIG_DEBUG_THREAD_INFO=y
CONFIG_DEBUG_OPTIMIZATIONS=y



## WATCH DOG
CONFIG_WATCHDOG=y

CONFIG_REBOOT=y

## Power Management
CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y


##FLASH
CONFIG_FLASH=y
CONFIG_SOC_FLASH_NRF_UICR=y
CONFIG_MPU_ALLOW_FLASH_WRITE=y


## UART
CONFIG_SERIAL=y
CONFIG_UART_ASYNC_API=y
CONFIG_UART_USE_RUNTIME_CONFIGURE=y
CONFIG_UART_CONSOLE=n

## AES
CONFIG_NRF_SECURITY=y
CONFIG_MBEDTLS_PSA_CRYPTO_C=y
CONFIG_MBEDTLS_PSA_STATIC_KEY_SLOTS=y
CONFIG_MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE=32
CONFIG_PSA_WANT_GENERATE_RANDOM=y
CONFIG_PSA_WANT_KEY_TYPE_AES=y
CONFIG_PSA_WANT_ALG_CBC_PKCS7=y
CONFIG_PSA_WANT_ALG_CCM=y


## BLE
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_BUF_ACL_RX_SIZE=519
CONFIG_BT_BUF_ACL_TX_SIZE=519
CONFIG_BT_L2CAP_TX_MTU=512

CONFIG_BT_HCI_ERR_TO_STR=y
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
CONFIG_BT_RX_STACK_SIZE=4096

CONFIG_BT_ID_MAX=3
CONFIG_BT_MAX_CONN=7
CONFIG_BT_CTLR_SDC_PERIPHERAL_COUNT=7


CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n
CONFIG_BT_USER_DATA_LEN_UPDATE=y
CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y

## PAWR
CONFIG_BT_OBSERVER=y
CONFIG_BT_BROADCASTER=y
CONFIG_BT_EXT_ADV=y
CONFIG_BT_EXT_ADV_MAX_ADV_SET=5
CONFIG_BT_PER_ADV_SYNC=y

CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER=y
CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER=y

CONFIG_BT_PER_ADV_SYNC_RSP=y
CONFIG_BT_PER_ADV_SYNC_BUF_SIZE=255
CONFIG_BT_CTLR_ADV_DATA_LEN_MAX=255




# #### BLE DTM START
# #Configure assertions
CONFIG_ASSERT=y
CONFIG_ASSERT_NO_COND_INFO=y
CONFIG_ASSERT_NO_MSG_INFO=y
CONFIG_HW_STACK_PROTECTION=y

# # Use necessary peripherals
CONFIG_NRFX_TIMER0=y
CONFIG_NRFX_TIMER1=y
CONFIG_NRFX_TIMER2=y
CONFIG_CLOCK_CONTROL=y

CONFIG_FEM_AL_LIB=y

when increase  CONFIG_BT_CTLR_SDC_PERIPHERAL_COUNT and Max_Conn, can more connect. but is is not solution.

I use create one ext adv. and reuse it.
I try restart extended advertising on recycled callback. and it execute that delayed after 3 seconds. delay execute function use k_work_schedule.
I checked Log about conn Ref Count. Count is normally increase and reduce when connected and disconnected
could you advice any solution?
* Add: after PAwR is Timeout, adv start is fine. but after resynced from Advertiser, restart advertisement return -12 error.
* Add: Adv Start is Fine when PAwR is Not Synced. Only Occur When PAwR Synced. After the advertisement is failed, the recycled callback arrives, and the adv fails with -12.
 This repeats continuously.
*Add (26.06.16): 
when Disconnected
00> [00:00:34.632,781] <dbg> bt_adv: bt_le_adv_resume: No valid legacy adv 

when return -12 err
Detail Log is Under.
00> [00:01:45.228,790] <dbg> bt_hci_core: tx_processor: TX process start
00> [00:01:45.228,820] <dbg> bt_hci_core: hci_core_send_cmd: fetch cmd
00> [00:01:45.228,851] <dbg> bt_hci_core: hci_core_send_cmd: Sending command 0x2083 (buf 0x20016524) to driver
00> [00:01:45.228,851] <dbg> bt_hci_core: bt_send: buf 0x20016524 len 54 type 1
00> [00:01:45.229,003] <dbg> bt_hci_core: bt_tx_irq_raise: kick TX
00> [00:01:45.229,095] <dbg> bt_hci_core: tx_processor: TX process start
00> [00:01:45.506,530] <dbg> bt_hci_core: bt_recv_unsafe: buf 0x20016304 len 9
00> [00:01:45.506,561] <dbg> bt_hci_core: hci_cmd_complete: opcode 0x2083
00> [00:01:45.506,652] <dbg> bt_hci_core: hci_cmd_done: opcode 0x2083 status 0x00 BT_HCI_ERR_SUCCESS buf 0x20016304
00> [00:01:45.506,683] <dbg> bt_hci_core: hci_cmd_done: sync cmd released
00> [00:01:45.506,713] <dbg> bt_hci_core: bt_tx_irq_raise: kick TX
00> [00:01:45.506,835] <dbg> bt_hci_core: bt_hci_cmd_send_sync: rsp 0x20016524 opcode 0x2083 len 3
00> [00:01:45.506,927] <dbg> bt_hci_core: tx_processor: TX process start
00> [00:01:47.033,996] <dbg> bt_hci_core: bt_hci_cmd_send_sync: process cmd 0x20016524 want 0x20016524
00> --- 33 messages dropped ---
00> [00:01:47.034,027] <dbg> bt_hci_core: hci_core_send_cmd: fetch cmd
00> [00:01:47.034,057] <dbg> bt_hci_core: hci_core_send_cmd: Sending command 0x2036 (buf 0x20016524) to driver
00> [00:01:47.034,088] <dbg> bt_hci_core: bt_send: buf 0x20016524 len 29 type 1
00> [00:01:47.034,240] <dbg> bt_hci_core: bt_recv_unsafe: buf 0x20016304 len 8
00> [00:01:47.034,271] <dbg> bt_hci_core: hci_cmd_complete: opcode 0x2036
00> [00:01:47.034,393] <dbg> bt_hci_core: hci_cmd_done: opcode 0x2036 status 0x00 BT_HCI_ERR_SUCCESS buf 0x20016304
00> [00:01:47.034,423] <dbg> bt_hci_core: hci_cmd_done: sync cmd released
00> [00:01:47.034,484] <dbg> bt_hci_core: bt_tx_irq_raise: kick TX
00> [00:01:47.034,576] <dbg> bt_hci_core: bt_hci_cmd_send_sync: rsp 0x20016524 opcode 0x2036 len 2
00> [00:01:47.034,698] <dbg> bt_hci_core: bt_hci_cmd_alloc: buf 0x20016524
00> [00:01:47.034,729] <dbg> bt_hci_core: bt_hci_cmd_send_sync: buf 0x20016524 opcode 0x2039 len 6
00> [00:01:47.034,759] <dbg> bt_hci_core: bt_hci_cmd_send: opcode 0x2039 param_len 6
00> [00:01:47.034,820] <dbg> bt_hci_core: bt_tx_irq_raise: kick TX
00> [00:01:47.034,851] <dbg> bt_hci_core: bt_hci_cmd_send_sync: process cmd 0x20016524 want 0x20016524
00> [00:01:47.034,881] <dbg> bt_hci_core: hci_core_send_cmd: fetch cmd
00> [00:01:47.034,942] <dbg> bt_hci_core: hci_core_send_cmd: Sending command 0x2039 (buf 0x20016524) to driver
00> [00:01:47.034,973] <dbg> bt_hci_core: bt_send: buf 0x20016524 len 10 type 1
00> [00:01:47.035,095] <dbg> bt_hci_core: bt_recv_unsafe: buf 0x20016304 len 7
00> [00:01:47.035,125] <dbg> bt_hci_core: hci_cmd_complete: opcode 0x2039
00> [00:01:47.035,247] <dbg> bt_hci_core: hci_cmd_done: opcode 0x2039 status 0x0d BT_HCI_ERR_INSUFFICIENT_RESOURCES buf 0x20016304
00> [00:01:47.035,278] <dbg> bt_hci_core: hci_cmd_done: sync cmd released
00> [00:01:47.035,339] <dbg> bt_hci_core: bt_tx_irq_raise: kick TX
00> [00:01:47.035,491] <wrn> bt_hci_core: opcode 0x2039 status 0x0d BT_HCI_ERR_INSUFFICIENT_RESOURCES
00> [00:01:47.035,552] <err> bt_adv: Failed to start advertiser
00> [00:01:47.035,583] <inf> ble: bt_le_ext_adv_start Fail -12
start code is below
static void advStartRaw()
{
    if (deviceInfo.advState)
        return;

    advParam.interval_min = deviceInfo.advInterval;
    advParam.interval_max = deviceInfo.advInterval + 32; // + 20ms

    int err = bt_le_ext_adv_set_data(extAdv, advData, ARRAY_SIZE(advData),
                                     NULL, 0);
    if (err)
    {
        LOG_INF("bt_le_ext_adv_set_data Fail %d", err);
        return;
    }

    err = bt_le_ext_adv_update_param(extAdv, &advParam);
    if (err)
    {
        LOG_INF("bt_le_ext_adv_update_param Fail %d", err);
        return;
    }

    err = bt_le_ext_adv_start(extAdv, &extraStartAdvParam);
    if (err)
    {
        LOG_INF("bt_le_ext_adv_start Fail %d", err);
        return;
    }

    deviceInfo.advState = true;
    LOG_INF("ADV Start");    
}
stop is below
static int advStopRaw()
{
    if (!deviceInfo.advState)
        return -1;

    int err = bt_le_ext_adv_stop(extAdv);
    if (err)
    {
        LOG_INF("BT ADV Stop Fail Code %d", err);
        return err;
    }

    deviceInfo.advState = false;
    LOG_INF("ADV Stop");
    return 0;
}
onConnected is Below
static void onConnected(struct bt_conn *conn, uint8_t err)
{
    if (err)
    {
        LOG_INF("Connection Error %d", err);
        return;
    }

    advStopRaw();
    connHandle = bt_conn_ref(conn);
    connectedState = true;
    deviceInfo.advState = false;
    mtuSize = (int)bt_gatt_get_mtu(conn);
    LOG_INF("Connected. Set MTU Size : %d", mtuSize);
	bt_conn_le_param_update(conn, &updateConnParam); 
}
onDisconnected
static void onDisconnected(struct bt_conn *conn, uint8_t reason)
{  
    bt_conn_unref(conn);
    connectedState = false;
    connHandle = NULL;
    //LOG_INF("Disconnected. Reason 0x%02X", reason);     
    // 0x19 Remote Term Conn
    // 0x22 Local Term Conn
    LOG_INF("Disconnected. Reason 0x%02x %s\n",reason, bt_hci_err_to_str(reason));
}
Parents Reply Children
Related