This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nRF52840 stops scanning

Hi.

We have a strange issue we are seeing with a nRF52840 where scanning fails, but it is very rare.

Setup - nRF52840 is a central device, and there are 20 x nRF52832's peripherals advertising. The central reports the status of all the peripherals to a PC via CDC usb.

The system can be running fine like this for 1 / 2 weeks 24 hours a day, then out of the blue the nRF52840 stops picking up any peripherals. It could be in the middle of the night, when the system isn't doing anything complicated like connecting / mass data transfer etc.

The fact that all the peripherals 'disappear' at the same time suggests the central is at fault. The peripherals have all been started at different times and have power etc.

I can't monitor / debug as it is a almost finished system, and the fault is too rare to wait and see it.

Are there any obvious properties I could monitor and report over so they are logged on the PC? All the BLE functions result in a hard restart if they fail which I am not seeing. This problem just occurs randomly, like the radio has just switched off etc.

Thanks

Phil

Parents
  • I find tracing all the scanning events helpful, something like this:

    // Scan Events
    static char * ble_scan_event_description[] =
    {
    /* NRF_BLE_SCAN_EVT_FILTER_MATCH",        */ " 0 Filter matched in the multifilter mode",
    /* NRF_BLE_SCAN_EVT_WHITELIST_REQUEST:    */ " 1 Request the whitelist from the main application",
    /* NRF_BLE_SCAN_EVT_WHITELIST_ADV_REPORT: */ " 2 Device from the whitelist is found",
    /* NRF_BLE_SCAN_EVT_NOT_FOUND:            */ " 3 Filter not matched for the scan data",
    /* NRF_BLE_SCAN_EVT_SCAN_TIMEOUT:         */ " 4 Scan timeout",
    /* NRF_BLE_SCAN_EVT_SCAN_REQ_REPORT:      */ " 5 Scan request report",
    /* NRF_BLE_SCAN_EVT_CONNECTING_ERROR:     */ " 6 Error occurred when establishing the connection from sd_ble_gap_connect",
    /* NRF_BLE_SCAN_EVT_CONNECTED:            */ " 7 Connected to device"
    };
    #define NUM_BLE_SCAN_EVENTS (sizeof(ble_scan_event_description)/sizeof(ble_scan_event_description[0]))
    
    /**@brief Function for handling Scanning Module events.
     */
    static void scan_evt_handler(scan_evt_t const * p_scan_evt)
    {
        ret_code_t err_code;
    
        switch(p_scan_evt->scan_evt_id)
        {
             case NRF_BLE_SCAN_EVT_CONNECTING_ERROR:     // Error occurred when establishing the connection. In this event, an error is passed from the function call @ref sd_ble_gap_connect
             {
                  err_code = p_scan_evt->params.connecting_err.err_code;
                  APP_ERROR_CHECK(err_code);
             } break;
    
             case NRF_BLE_SCAN_EVT_CONNECTED:            // Connected to device
             {
                 ble_gap_evt_connected_t const * p_connected = p_scan_evt->params.connected.p_connected;
                 // Scan is automatically stopped by the connection.
                 NRF_LOG_INFO("Connect to Id %02x%02x%02x%02x%02x%02x",
                          p_connected->peer_addr.addr[0],
                          p_connected->peer_addr.addr[1],
                          p_connected->peer_addr.addr[2],
                          p_connected->peer_addr.addr[3],
                          p_connected->peer_addr.addr[4],
                          p_connected->peer_addr.addr[5]
                          );
             } break;
    
             case NRF_BLE_SCAN_EVT_SCAN_TIMEOUT:         // Scan timeout
             {
                 NRF_LOG_INFO("Scan timed out.");
                 scan_start();
             } break;
    
             case NRF_BLE_SCAN_EVT_FILTER_MATCH:         // A filter is matched or all filters are matched in the multifilter mode
                 {
                   ble_gap_evt_adv_report_t const *p_adv_report = p_scan_evt->params.filter_match.p_adv_report;
                   NRF_LOG_INFO("Scan Match Id: %02x%02x%02x%02x%02x%02x",
                          p_adv_report->peer_addr.addr[0],
                          p_adv_report->peer_addr.addr[1],
                          p_adv_report->peer_addr.addr[2],
                          p_adv_report->peer_addr.addr[3],
                          p_adv_report->peer_addr.addr[4],
                          p_adv_report->peer_addr.addr[5]
                          );
                 }
                 break;
    
             case NRF_BLE_SCAN_EVT_NOT_FOUND:            // The filter was not matched for the scan data
                 {
                   ble_gap_evt_adv_report_t const *p_not_found = p_scan_evt->params.p_not_found;
                   NRF_LOG_INFO("Deny Id: %02x%02x%02x%02x%02x%02x",
                          p_not_found->peer_addr.addr[0],
                          p_not_found->peer_addr.addr[1],
                          p_not_found->peer_addr.addr[2],
                          p_not_found->peer_addr.addr[3],
                          p_not_found->peer_addr.addr[4],
                          p_not_found->peer_addr.addr[5]
                          );
                 }
                 break;
    
             default:
    //       case NRF_BLE_SCAN_EVT_FILTER_MATCH:         // A filter is matched or all filters are matched in the multifilter mode
             case NRF_BLE_SCAN_EVT_WHITELIST_REQUEST:    // Request the whitelist from the main application. For whitelist scanning to work, the whitelist must be set when this event occurs
             case NRF_BLE_SCAN_EVT_WHITELIST_ADV_REPORT: // Send notification to the main application when a device from the whitelist is found
    //       case NRF_BLE_SCAN_EVT_NOT_FOUND:            // The filter was not matched for the scan data
             case NRF_BLE_SCAN_EVT_SCAN_REQ_REPORT:      // Scan request report
                if (p_scan_evt->scan_evt_id < NUM_BLE_SCAN_EVENTS)
                {
                   NRF_LOG_INFO("scan_evt_id: %d %s", p_scan_evt->scan_evt_id, ble_scan_event_description[p_scan_evt->scan_evt_id]);
                }
                else
                {
                   NRF_LOG_INFO("Unhandled scan_evt_id: %d", p_scan_evt->scan_evt_id);
                }
                 break;
        }
    }

    Selectively enable/disable the event reports, but ensure everything generates a trace in case something wierd happes .. if any event happens that is ..

  • Hmm, thanks for the suggestion sounds good.

    I will give it a try and monitor the events.

    Thanks

    Phil

  • It could be the last case, i.e the status bit is set to BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. However, if the workaround solves the issue then I guess we can mark the case as solved.

  • Hi Bjorn.

    Am looking at the last case in your message above. Can't work out how I check the status part of the ADV_REPORT. Can't find 'status' in there??

            case BLE_GAP_EVT_ADV_REPORT:
                on_adv_report(&p_gap_evt->params.adv_report);
    
                if(p_gap_evt->params.adv_report.?????? == BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA)
                {
                    start_scan();
                }
                break;
    

    Thanks

    Phil

  • Hi Phil, 

    The status field should be a member of the ble_gap_adv_report_type_t structwhich in turn is a member of the ble_gap_evt_adv_report_t struct in S140 v6.x.x, see S140 SoftDevice v6.1.0: ble_gap_evt_adv_report_t Struct Reference.

    So I think it should be

            case BLE_GAP_EVT_ADV_REPORT:
                on_adv_report(&p_gap_evt->params.adv_report);
    
                if(p_gap_evt->params.adv_report.type.status == BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA)
                {
                    start_scan();
                }
                break;
    

    Best regards

    Bjørn

  • Happy to help. Let me know if you run into any issues. 

    -Bjørn

Reply Children
No Data
Related