hi
how i can get a log for why nrf52840 is reset when start advertising for bluetooth?
the reset register is 4
can i get more information from log?
how?
thank you
hi
how i can get a log for why nrf52840 is reset when start advertising for bluetooth?
the reset register is 4
can i get more information from log?
how?
thank you
Hi katrindqawn,
I had the same problem and it was caused by the high ramp up time delay of the high frequency external crystal. Have a look there: https://devzone.nordicsemi.com/f/nordic-q-a/107808/reset-with-hard-fault-after-bluetooth-advertising
I solved starting the high frequency cristal before enabling ble subsystem, and also setting "mpsl_clock_hfclk_latency_set(MPSL_CLOCK_HF_LATENCY_WORST_CASE);"
thank you simoiamma
I add this line before bt_enable() line
but the problem has not been solved yet!
my full code is copied from SDK samples:
/** Copyright (c) 2018 Nordic Semiconductor ASA** SPDX-License-Identifier: LicenseRef-Nordic-5-Clause*/#include <zephyr/types.h>#include <stddef.h>#include <string.h>#include <errno.h>#include <zephyr/sys/printk.h>#include <zephyr/sys/byteorder.h>#include <zephyr/kernel.h>#include <zephyr/drivers/gpio.h>#include <soc.h>#include <zephyr/bluetooth/bluetooth.h>#include <zephyr/bluetooth/hci.h>#include <zephyr/bluetooth/conn.h>#include <zephyr/bluetooth/uuid.h>#include <zephyr/bluetooth/gatt.h>#include <bluetooth/services/lbs.h>#include <zephyr/settings/settings.h>#include <dk_buttons_and_leds.h>#include <helpers/nrfx_reset_reason.h>#define DEVICE_NAME CONFIG_BT_DEVICE_NAME#define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1)#define RUN_STATUS_LED DK_LED1#define CON_STATUS_LED DK_LED2#define RUN_LED_BLINK_INTERVAL 1000#define USER_LED DK_LED3#define USER_BUTTON DK_BTN1_MSKstatic bool app_button_state;uint32_t reason;static const struct bt_data ad[] = {BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),};static const struct bt_data sd[] = {BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_LBS_VAL),};static void connected(struct bt_conn *conn, uint8_t err){if (err) {printk("Connection failed (err %u)\n", err);return;}printk("Connected\n");dk_set_led_on(CON_STATUS_LED);}static void disconnected(struct bt_conn *conn, uint8_t reason){printk("Disconnected (reason %u)\n", reason);dk_set_led_off(CON_STATUS_LED);}#ifdef CONFIG_BT_LBS_SECURITY_ENABLEDstatic void security_changed(struct bt_conn *conn, bt_security_t level,enum bt_security_err err){char addr[BT_ADDR_LE_STR_LEN];bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));if (!err) {printk("Security changed: %s level %u\n", addr, level);} else {printk("Security failed: %s level %u err %d\n", addr, level,err);}}#endifBT_CONN_CB_DEFINE(conn_callbacks) = {.connected = connected,.disconnected = disconnected,#ifdef CONFIG_BT_LBS_SECURITY_ENABLED.security_changed = security_changed,#endif};#if defined(CONFIG_BT_LBS_SECURITY_ENABLED)static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey){char addr[BT_ADDR_LE_STR_LEN];bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));printk("Passkey for %s: %06u\n", addr, passkey);}static void auth_cancel(struct bt_conn *conn){char addr[BT_ADDR_LE_STR_LEN];bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));printk("Pairing cancelled: %s\n", addr);}static void pairing_complete(struct bt_conn *conn, bool bonded){char addr[BT_ADDR_LE_STR_LEN];bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));printk("Pairing completed: %s, bonded: %d\n", addr, bonded);}static void pairing_failed(struct bt_conn *conn, enum bt_security_err reason){char addr[BT_ADDR_LE_STR_LEN];bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));printk("Pairing failed conn: %s, reason %d\n", addr, reason);}static struct bt_conn_auth_cb conn_auth_callbacks = {.passkey_display = auth_passkey_display,.cancel = auth_cancel,};static struct bt_conn_auth_info_cb conn_auth_info_callbacks = {.pairing_complete = pairing_complete,.pairing_failed = pairing_failed};#elsestatic struct bt_conn_auth_cb conn_auth_callbacks;static struct bt_conn_auth_info_cb conn_auth_info_callbacks;#endifstatic void app_led_cb(bool led_state){dk_set_led(USER_LED, led_state);}static bool app_button_cb(void){return app_button_state;}static struct bt_lbs_cb lbs_callbacs = {.led_cb = app_led_cb,.button_cb = app_button_cb,};static void button_changed(uint32_t button_state, uint32_t has_changed){if (has_changed & USER_BUTTON) {uint32_t user_button_state = button_state & USER_BUTTON;bt_lbs_send_button_state(user_button_state);app_button_state = user_button_state ? true : false;}}static int init_button(void){int err;err = dk_buttons_init(button_changed);if (err) {printk("Cannot init buttons (err: %d)\n", err);}return err;}int main(void){int blink_status = 0;int err;printk("Starting Bluetooth Peripheral LBS example\n");err = dk_leds_init();if (err) {printk("LEDs init failed (err %d)\n", err);return 0;}err = init_button();if (err) {printk("Button init failed (err %d)\n", err);return 0;}if (IS_ENABLED(CONFIG_BT_LBS_SECURITY_ENABLED)) {err = bt_conn_auth_cb_register(&conn_auth_callbacks);if (err) {printk("Failed to register authorization callbacks.\n");return 0;}err = bt_conn_auth_info_cb_register(&conn_auth_info_callbacks);if (err) {printk("Failed to register authorization info callbacks.\n");return 0;}}mpsl_clock_hfclk_latency_set(MPSL_CLOCK_HF_LATENCY_BEST);err = bt_enable(NULL);if (err) {printk("Bluetooth init failed (err %d)\n", err);return 0;}printk("Bluetooth initialized\n");if (IS_ENABLED(CONFIG_SETTINGS)) {settings_load();}err = bt_lbs_init(&lbs_callbacs);if (err) {printk("Failed to init LBS (err:%d)\n", err);return 0;}reason = nrfx_reset_reason_get();for(int i=0; i<5; i++){dk_set_led(DK_LED1, (++blink_status) % 2);k_sleep(K_MSEC(500));}err = bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad),sd, ARRAY_SIZE(sd));if (err) {printk("Advertising failed to start (err %d)\n", err);return 0;}for(int i=0; i<5; i++){dk_set_led(DK_LED2, (++blink_status) % 2);k_sleep(K_MSEC(500));}printk("Advertising successfully started\n");for (;;) {dk_set_led(DK_LED3, (++blink_status) % 2);k_sleep(K_MSEC(RUN_LED_BLINK_INTERVAL));}}
/*
* Copyright (c) 2018 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
#include <zephyr/types.h>
#include <stddef.h>
#include <string.h>
#include <errno.h>
#include <zephyr/sys/printk.h>
#include <zephyr/sys/byteorder.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
#include <soc.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/hci.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/bluetooth/uuid.h>
#include <zephyr/bluetooth/gatt.h>
#include <bluetooth/services/lbs.h>
#include <zephyr/settings/settings.h>
#include <dk_buttons_and_leds.h>
#include <helpers/nrfx_reset_reason.h>
#define DEVICE_NAME CONFIG_BT_DEVICE_NAME
#define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1)
#define RUN_STATUS_LED DK_LED1
#define CON_STATUS_LED DK_LED2
#define RUN_LED_BLINK_INTERVAL 1000
#define USER_LED DK_LED3
#define USER_BUTTON DK_BTN1_MSK
static bool app_button_state;
uint32_t reason;
static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
};
static const struct bt_data sd[] = {
BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_LBS_VAL),
};
static void connected(struct bt_conn *conn, uint8_t err)
{
if (err) {
printk("Connection failed (err %u)\n", err);
return;
}
printk("Connected\n");
dk_set_led_on(CON_STATUS_LED);
}
static void disconnected(struct bt_conn *conn, uint8_t reason)
{
printk("Disconnected (reason %u)\n", reason);
dk_set_led_off(CON_STATUS_LED);
}
#ifdef CONFIG_BT_LBS_SECURITY_ENABLED
static void security_changed(struct bt_conn *conn, bt_security_t level,
enum bt_security_err err)
{
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
if (!err) {
printk("Security changed: %s level %u\n", addr, level);
} else {
printk("Security failed: %s level %u err %d\n", addr, level,
err);
}
}
#endif
BT_CONN_CB_DEFINE(conn_callbacks) = {
.connected = connected,
.disconnected = disconnected,
#ifdef CONFIG_BT_LBS_SECURITY_ENABLED
.security_changed = security_changed,
#endif
};
#if defined(CONFIG_BT_LBS_SECURITY_ENABLED)
static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey)
{
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
printk("Passkey for %s: %06u\n", addr, passkey);
}
static void auth_cancel(struct bt_conn *conn)
{
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
printk("Pairing cancelled: %s\n", addr);
}
static void pairing_complete(struct bt_conn *conn, bool bonded)
{
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
printk("Pairing completed: %s, bonded: %d\n", addr, bonded);
}
static void pairing_failed(struct bt_conn *conn, enum bt_security_err reason)
{
char addr[BT_ADDR_LE_STR_LEN];
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
printk("Pairing failed conn: %s, reason %d\n", addr, reason);
}
static struct bt_conn_auth_cb conn_auth_callbacks = {
.passkey_display = auth_passkey_display,
.cancel = auth_cancel,
};
static struct bt_conn_auth_info_cb conn_auth_info_callbacks = {
.pairing_complete = pairing_complete,
.pairing_failed = pairing_failed
};
#else
static struct bt_conn_auth_cb conn_auth_callbacks;
static struct bt_conn_auth_info_cb conn_auth_info_callbacks;
#endif
static void app_led_cb(bool led_state)
{
dk_set_led(USER_LED, led_state);
}
static bool app_button_cb(void)
{
return app_button_state;
}
static struct bt_lbs_cb lbs_callbacs = {
.led_cb = app_led_cb,
.button_cb = app_button_cb,
};
static void button_changed(uint32_t button_state, uint32_t has_changed)
{
if (has_changed & USER_BUTTON) {
uint32_t user_button_state = button_state & USER_BUTTON;
bt_lbs_send_button_state(user_button_state);
app_button_state = user_button_state ? true : false;
}
}
static int init_button(void)
{
int err;
err = dk_buttons_init(button_changed);
if (err) {
printk("Cannot init buttons (err: %d)\n", err);
}
return err;
}
int main(void)
{
int blink_status = 0;
int err;
printk("Starting Bluetooth Peripheral LBS example\n");
err = dk_leds_init();
if (err) {
printk("LEDs init failed (err %d)\n", err);
return 0;
}
err = init_button();
if (err) {
printk("Button init failed (err %d)\n", err);
return 0;
}
if (IS_ENABLED(CONFIG_BT_LBS_SECURITY_ENABLED)) {
err = bt_conn_auth_cb_register(&conn_auth_callbacks);
if (err) {
printk("Failed to register authorization callbacks.\n");
return 0;
}
err = bt_conn_auth_info_cb_register(&conn_auth_info_callbacks);
if (err) {
printk("Failed to register authorization info callbacks.\n");
return 0;
}
}
mpsl_clock_hfclk_latency_set(MPSL_CLOCK_HF_LATENCY_BEST);
err = bt_enable(NULL);
if (err) {
printk("Bluetooth init failed (err %d)\n", err);
return 0;
}
printk("Bluetooth initialized\n");
if (IS_ENABLED(CONFIG_SETTINGS)) {
settings_load();
}
err = bt_lbs_init(&lbs_callbacs);
if (err) {
printk("Failed to init LBS (err:%d)\n", err);
return 0;
}
reason = nrfx_reset_reason_get();
for(int i=0; i<5; i++){
dk_set_led(DK_LED1, (++blink_status) % 2);
k_sleep(K_MSEC(500));
}
err = bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad),sd, ARRAY_SIZE(sd));
if (err) {
printk("Advertising failed to start (err %d)\n", err);
return 0;
}
for(int i=0; i<5; i++){
dk_set_led(DK_LED2, (++blink_status) % 2);
k_sleep(K_MSEC(500));
}
printk("Advertising successfully started\n");
for (;;) {
dk_set_led(DK_LED3, (++blink_status) % 2);
k_sleep(K_MSEC(RUN_LED_BLINK_INTERVAL));
}
}
You need to start the HFCLK somewhere before calling bt_enable(), with the code provided in the question I've linked in my previous answer, that is:
NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_32Bit << TIMER_BITMODE_BITMODE_Pos; NRF_TIMER1->TASKS_CLEAR = 1; NRF_CLOCK->EVENTS_HFCLKSTARTED = 0; NRF_TIMER1->TASKS_START = 1; NRF_CLOCK->TASKS_HFCLKSTART = 1; while(NRF_CLOCK->EVENTS_HFCLKSTARTED == 0); NRF_TIMER1->TASKS_CAPTURE[0] = 1; printk("HF Clock has started. Startup time: %d uS\n", NRF_TIMER1->CC[0]);
Simone
i add this but the code is Being stuck in while loop
it means the NRF_CLOCK->EVENTS_HFCLKSTARTED is zero
what is the problem?
hardware side?
It means that you external oscillator is not starting or giving a stable clock. Yes, sounds more like a hardware related issue with the external clock or the connections to it.
It means that you external oscillator is not starting or giving a stable clock. Yes, sounds more like a hardware related issue with the external clock or the connections to it.
this is our circuit
what is your idea about shematic?
...
I think it may be better to have an image of the routing of the traces of the 32MHz crystal than the schematic.
I'm also having issue with external crystals, one possible cause could be too much heat transfer when soldering the crystal component.
Simone