Follow-up to 2 J-Link devices reported when connecting nRF52840-DK.

A similar issue was reported here and I was wondering if there was any new information.

My specific issue is a failure to connect to the DK after following the soft-device tutorial put out by Sumair. I've followed the instructions for part 43 and got the resulting code:

#include <stdbool.h>
#include <stdint.h>
#include <string.h>

#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"

#include "app_timer.h"

#include "bsp_btn_ble.h"

#include "nrf_pwr_mgmt.h"

#include "nrf_sdh.h"
#include "nrf_sdh_ble.h"
#include "nrf_sdh_soc.h"

#include "nrf_ble_qwr.h"

#include "nrf_ble_gatt.h"

#include "ble_advdata.h"
#include "ble_advertising.h"

#include "ble_conn_params.h"




#define APP_BLE_CONN_CFG_TAG    1
#define APP_BLE_OBSERVER_PRIO   3

#define DEVICE_NAME             "Janus SmartPadlock"

#define MIN_CONN_INTERVAL       MSEC_TO_UNITS(100, UNIT_1_25_MS)
#define MAX_CONN_INTERVAL       MSEC_TO_UNITS(200, UNIT_1_25_MS)
#define SLAVE_LATENCY           0
#define CONN_SUP_TIMEOUT        MSEC_TO_UNITS(2000, UNIT_10_MS)

#define APP_ADV_INTERVAL        300
#define APP_ADV_DURATION        0

//#define FIRST_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(5000)
#define FIRST_CONN_PARMS_UPDATE_DELAY   APP_TIMER_TICKS(5000)  //  Typo?
#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)
#define MAX_CONN_PARAMS_UPDATE_COUNT   3





NRF_BLE_QWR_DEF(m_qwr);   //  NRF_BLE_QWRS_DEF for multiple devices.
NRF_BLE_GATT_DEF(m_gatt);
BLE_ADVERTISING_DEF(m_advertising);




static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID;




static void gap_params_init(void){

  ret_code_t err_code;

  ble_gap_conn_params_t   gap_conn_params;
  ble_gap_conn_sec_mode_t sec_mode;

  BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);  //  Security is set here.
  
  err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
  APP_ERROR_CHECK(err_code);

  memset(&gap_conn_params, 0, sizeof(gap_conn_params));

  gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
  gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
  gap_conn_params.slave_latency     = SLAVE_LATENCY;
  gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;

  err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
  APP_ERROR_CHECK(err_code);

}


static void gatt_init(void){

  ret_code_t err_code = nrf_ble_gatt_init(&m_gatt, NULL);
  APP_ERROR_CHECK(err_code);

}


static void nrf_qwr_error_handler(uint32_t nrf_error){

  APP_ERROR_HANDLER(nrf_error);

}


static void services_init(void){

  ret_code_t err_code;
  
  nrf_ble_qwr_init_t qwr_init = {0};

  qwr_init.error_handler = nrf_qwr_error_handler;

  err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
  APP_ERROR_CHECK(err_code);

}


static void on_conn_params_evt(ble_conn_params_evt_t * p_evt){

  ret_code_t err_code;

  if(p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED){
    
    err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
    APP_ERROR_CHECK(err_code);

  }
  if(p_evt->evt_type == BLE_CONN_PARAMS_EVT_SUCCEEDED){

    

  }
}


static void conn_params_error_handler(uint32_t nrf_error){

  APP_ERROR_HANDLER(nrf_error);

}


static void conn_params_init(void){

  ret_code_t err_code;

  ble_conn_params_init_t cp_init;

  memset(&cp_init, 0, sizeof(cp_init));

  cp_init.p_conn_params = NULL;
  cp_init.first_conn_params_update_delay = FIRST_CONN_PARMS_UPDATE_DELAY;
  cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY;
  cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT;
  cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID;
  cp_init.disconnect_on_fail = false;
  cp_init.error_handler = conn_params_error_handler;
  cp_init.evt_handler = on_conn_params_evt;

  err_code = ble_conn_params_init(&cp_init);
  APP_ERROR_CHECK(err_code);

}


static void on_adv_evt(ble_adv_evt_t ble_adv_evt){

  ret_code_t err_code;

  switch(ble_adv_evt){
    
    case BLE_ADV_EVT_FAST:

    NRF_LOG_INFO("Fast advertising...");
    err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
    APP_ERROR_CHECK(err_code);

    break;

    case BLE_ADV_EVT_IDLE:

    err_code = bsp_indication_set(BSP_INDICATE_IDLE);
    APP_ERROR_CHECK(err_code);

    break;

    default:
    break;

  }
}


static void advertising_init(void){

  ret_code_t err_code;

  ble_advertising_init_t init;

  memset(&init, 0, sizeof(init));

  init.advdata.name_type = BLE_ADVDATA_FULL_NAME;
  init.advdata.include_appearance = true;
  init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
  init.config.ble_adv_fast_enabled = true;
  init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
  init.config.ble_adv_fast_timeout = APP_ADV_DURATION;
  init.evt_handler = on_adv_evt;

  err_code = ble_advertising_init(&m_advertising, &init);
  APP_ERROR_CHECK(err_code);

  ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);

}


static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context){

  ret_code_t err_code = NRF_SUCCESS;
  
  switch(p_ble_evt->header.evt_id){

  case BLE_GAP_EVT_DISCONNECTED:

  NRF_LOG_INFO("Connection terminated.");

  break;


  case BLE_GAP_EVT_CONNECTED:
  
  NRF_LOG_INFO("Connected to device.");

  err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
  APP_ERROR_CHECK(err_code);

  m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;

  err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
  APP_ERROR_CHECK(err_code);

  break;


  case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
    
  NRF_LOG_DEBUG("PHY Update Request.");

  ble_gap_phys_t const phys = 
  {
    .rx_phys = BLE_GAP_PHY_AUTO,
    .tx_phys = BLE_GAP_PHY_AUTO,
  };

  err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
  APP_ERROR_CHECK(err_code);

  break;

  }
}


static void ble_stack_init(void){

  ret_code_t err_code;

  err_code = nrf_sdh_enable_request();
  APP_ERROR_CHECK(err_code);

  uint32_t ram_start = 0;

  err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
  APP_ERROR_CHECK(err_code);

  err_code = nrf_sdh_ble_enable(&ram_start);
  APP_ERROR_CHECK(err_code);

  NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);

}


static void power_management_init(void){

  ret_code_t err_code = nrf_pwr_mgmt_init();
  APP_ERROR_CHECK(err_code);

}


static void idle_state_handle(void){

  if(NRF_LOG_PROCESS() == false){
    nrf_pwr_mgmt_run();

  }
}


static void leds_init(void){

  ret_code_t err_code = bsp_init(BSP_INIT_LEDS, NULL);
  APP_ERROR_CHECK(err_code);

}


static void timers_init(void){

  ret_code_t err_code = app_timer_init();
  APP_ERROR_CHECK(err_code);

}


static void log_init(void){

  ret_code_t err_code = NRF_LOG_INIT(NULL);
  APP_ERROR_CHECK(err_code);

  NRF_LOG_DEFAULT_BACKENDS_INIT();

}


static void advertising_start(void){

  ret_code_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
  APP_ERROR_CHECK(err_code);

}


/**@brief Function for application main entry.
 */
int main(void){

//  NRF_LOG_INFO("log_init...");
  log_init();
//  NRF_LOG_INFO("timers_init...");
  timers_init();
//  NRF_LOG_INFO("leds_init...");
  leds_init();
//  NRF_LOG_INFO("power_management_init...");
  power_management_init();
//  NRF_LOG_INFO("ble_stack_init...");
  ble_stack_init();
//  NRF_LOG_INFO("gap_params_init...");
  gap_params_init();
//  NRF_LOG_INFO("gatt_init...");
  gatt_init();
//  NRF_LOG_INFO("advertising_init...");
  advertising_init();
//  NRF_LOG_INFO("services_init...");
  services_init();
//  NRF_LOG_INFO("conn_params_init...");
  conn_params_init();

  NRF_LOG_INFO("BLE Base application started...");

  advertising_start();

  // Enter main loop.
  for (;;)
  {
    idle_state_handle();

  }
}

The code builds and programs fine, but running it is another question.

First, the board shows up on COM9 and COM10. I have to use COM9 to get it to program correctly.

Second, I can see the DK on my phone's Bluetooth so I know the code I have is working somewhat correctly, but Sumair's last video tutorial shows him connecting to the board with the NRFConnect Bluetooth Low Energy App while still connected to the board with puTTY. I get an "COM9: Access denied" when I try. When I try without puTTY connected, it tells me the device must be programmed and if I say no, I get:

"Found device type: unknown. J-Link firmware: J-Link OB-nRF5340-NordicSemi compiled Oct 17 2023 10:37:25.

Connectivity firmware version: undefined. SoftDevice API version: undefined.

Unsupported soft-device version!"

This example starts with the ble_app_template example from the SDK and only rewrites the main.c file. In the video, he's not using the BLE standalone app so maybe it's a versioning issue? Is it possible that the stated change in chips on the nRF52840-DK boards causing it to show up on 2 COM ports is causing this as well? Any suggested workarounds? 

Parents Reply Children
  • Yes, I have the nRF Connect SDK and I did finally figure out that he's using 2 boards in the tutorial. I got the sample code that he used to work with the nRF Connect BLE Application; I can connect and view the GAP and GATT data but when I connect with puTTY it just repeatedly prints the letter z to the screen. I assume that means that something is asleep but I've never seen that behavior and it's certainly not something I put in my code. Is this something you're familiar with? I was hoping to use the data printed to puTTY for troubleshooting. I should be getting a message when connecting and disconnecting but nothing is going to the monitor except a constant string of z's. While this is happening, powering off my custom board has no effect on the puTTY terminal.

  • I did a bit more testing and discovered that the nRF52840-DK board is responsible for the 'z' output to the terminal. With or without my board connected, it does this anytime the default BLE app code is present on it. (Turn on the BLE app with the DK board erased and it automatically programs this code.) With the DK board erased, the terminal no longer outputs anything, even with my board connected. Should the NRF_LOG_INFO function work with my board connected through the DK board or do I need a direct connection to my PC?

    Something else I noticed, and this may be totally unrelated, was that reading back the program on the DK board showed the MBR, softdevice, and application areas, but when I do the same on my board it only shows the MBR and softdevice. (See below.) The thing is, I can see my device advertising, and the device name, etc. is correct. Wouldn't that imply that the application is present?

  • I'm still waiting for support. Is anyone still following this ticket?

  • trackerfx said:
    I'm still waiting for support. Is anyone still following this ticket?

    Yes and no, looking at the last replies you made I still get the sense that you are actually working on the nRF5 SDK, and not the nRF Connect SDK. At least the descriptions "NRF_LOG_INFO", "MBR", "softdevice and application area" all seem to point to nRF5 SDK. So based on that my initial reponse still seem to be valid?

    Kenneth

  • But if you have your own board with UART interface that you want to display on a terminal window in Windows I suggest you for instance try to get something similar to:
    https://ftdichip.com/products/ttl-232r-3v3/ 

    Kenneth

Related