Hello everyone,
I'm currently working on a project that requires a nrf52832 chip to relay raw beacon data over UART to an esp-12F module. I am having a difficult time figuring out why it is not working. When running the program the esp module does not receive anything on it's input buffer. I am using an off the shelf device with the schematic showing connecting UART terminals. This example was created using the ble_app_uart_c example from the NRF5 SDK 15.3, also using the s132 soft device and my development environment of choice is keil µvision. Everything builds and compiles just fine and I only run into visible problems when I use a debugger.
When I try to debug the code with the NRF52 DK I am getting stuck in this while loop. Is there a problem with the way I #defined DEBUG?
Here is the code I am using right now.
#include <stdio.h> #include <stdint.h> #include <stdbool.h> #include "nordic_common.h" #include "app_error.h" #include "app_uart.h" #include "ble_db_discovery.h" #include "app_timer.h" #include "app_util.h" #include "bsp_btn_ble.h" #include "ble.h" #include "ble_gap.h" #include "ble_hci.h" #include "nrf_sdh.h" #include "nrf_sdh_ble.h" #include "nrf_sdh_soc.h" #include "ble_nus_c.h" #include "nrf_pwr_mgmt.h" #include "nrf_ble_scan.h" #include "nrf_delay.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" #define APP_BLE_CONN_CFG_TAG 1 /**< Tag that refers to the BLE stack configuration set with @ref sd_ble_cfg_set. The default tag is @ref BLE_CONN_CFG_TAG_DEFAULT. */ #define APP_BLE_OBSERVER_PRIO 3 /**< BLE observer priority of the application. There is no need to modify this value. */ #define RETARGET_ENABLED 1 #define DEBUG 1 #define UART_TX_BUF_SIZE 1024 /**< UART TX buffer size. */ #define UART_RX_BUF_SIZE 1024 /**< UART RX buffer size. */ BLE_DB_DISCOVERY_DEF(m_db_disc); /**< Database discovery module instance. */ NRF_BLE_SCAN_DEF(m_scan); /**< Scanning Module instance. */ BLE_NUS_C_DEF(m_ble_TnP_c); /**< BLE TnP client instance. */ /**@brief TnP UUID. */ static ble_uuid128_t const m_TnP_uuid = { .uuid128 = {0xFD, 0xA5, 0x06, 0x93, 0xA4, 0xE2, 0x4F, 0xB1, 0xAF, 0xCF, 0xC6, 0xEB, 0x07, 0x64, 0x78, 0x25} /**< Little-Endian UUID bytes. */}; /**@brief Function for handling asserts in the SoftDevice. * * @details This function is called in case of an assert in the SoftDevice. * * @warning This handler is only an example and is not meant for the final product. You need to analyze * how your product is supposed to react in case of assert. * @warning On assert from the SoftDevice, the system can only recover on reset. * * @param[in] line_num Line number of the failing assert call. * @param[in] p_file_name File name of the failing assert call. * void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name) { app_error_handler(0xDEADBEEF, line_num, p_file_name); } *@brief Function for starting scanning. */ static void scan_start(void) { ret_code_t ret; ret = nrf_ble_scan_start(&m_scan); APP_ERROR_CHECK(ret); ret = bsp_indication_set(BSP_INDICATE_SCANNING); APP_ERROR_CHECK(ret); } /**@brief Function for handling Scanning Module events. */ static void scan_evt_handler(scan_evt_t const * p_scan_evt) { ret_code_t ret; switch(p_scan_evt->scan_evt_id) { case NRF_BLE_SCAN_EVT_FILTER_MATCH: { APP_ERROR_CHECK(ret); int i =0; ble_data_t rawBLEData = p_scan_evt->params.filter_match.p_adv_report->data;//p_adv_report APP_ERROR_CHECK(ret); printf("%s",(char*)rawBLEData.p_data); app_uart_put(0x3C); for(i=0;i<rawBLEData.len;i++){ printf("%d",rawBLEData.p_data[i]); app_uart_put(rawBLEData.p_data[i]); app_uart_put(rawBLEData.len); //send raw data to esp8266 } nrf_delay_ms(1); app_uart_put(0x3E); APP_ERROR_CHECK(ret); }break; case NRF_BLE_SCAN_EVT_SCAN_TIMEOUT: { // NRF_LOG_INFO("Scan timed out."); scan_start(); } break; default: break; } } /**@brief Function for initializing the scanning and setting the filters. */ static void scan_init(void) { ret_code_t err_code; nrf_ble_scan_init_t init_scan; memset(&init_scan, 0, sizeof(init_scan)); init_scan.connect_if_match = false; err_code = nrf_ble_scan_init(&m_scan, &init_scan, scan_evt_handler); APP_ERROR_CHECK(err_code); err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_UUID_FILTER, &m_TnP_uuid); APP_ERROR_CHECK(err_code); err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_UUID_FILTER, false); APP_ERROR_CHECK(err_code); } /**@brief Function for handling app_uart events. * * @details This function receives a single character from the app_uart module and appends it to * a string. The string is sent over BLE when the last character received is a * 'new line' '\n' (hex 0x0A) or if the string reaches the maximum data length. */ void uart_event_handle(app_uart_evt_t * p_event) { static uint8_t data_array[BLE_NUS_MAX_DATA_LEN]; static uint16_t index = 0; uint32_t ret_val; switch (p_event->evt_type) { /**@snippet [Handling data from UART] */ case APP_UART_DATA_READY: UNUSED_VARIABLE(app_uart_get(&data_array[index])); index++; if (data_array[index - 1] == '\n' /*|| (index >= (max_data_len))*/) { // NRF_LOG_DEBUG("Ready to send data to ESP8266 module"); NRF_LOG_HEXDUMP_DEBUG(data_array, index); do { ret_val = ble_nus_c_string_send(&m_ble_TnP_c, data_array, index); if ( (ret_val != NRF_ERROR_INVALID_STATE) && (ret_val != NRF_ERROR_RESOURCES) ) { APP_ERROR_CHECK(ret_val); } } while (ret_val == NRF_ERROR_RESOURCES); index = 0; } break; /**@snippet [Handling data from UART] */ case APP_UART_COMMUNICATION_ERROR: // NRF_LOG_ERROR("Communication error occurred while handling UART."); APP_ERROR_HANDLER(p_event->data.error_communication); break; case APP_UART_FIFO_ERROR: // NRF_LOG_ERROR("Error occurred in FIFO module used by UART."); APP_ERROR_HANDLER(p_event->data.error_code); break; default: break; } } /** * @brief Function for handling shutdown events. * * @param[in] event Shutdown type. */ static bool shutdown_handler(nrf_pwr_mgmt_evt_t event) { ret_code_t err_code; err_code = bsp_indication_set(BSP_INDICATE_IDLE); APP_ERROR_CHECK(err_code); switch (event) { case NRF_PWR_MGMT_EVT_PREPARE_WAKEUP: // Prepare wakeup buttons. err_code = bsp_btn_ble_sleep_mode_prepare(); APP_ERROR_CHECK(err_code); break; default: break; } return true; } NRF_PWR_MGMT_HANDLER_REGISTER(shutdown_handler, APP_SHUTDOWN_HANDLER_PRIORITY); /**@brief Function for handling BLE events. * * @param[in] p_ble_evt Bluetooth stack event. * @param[in] p_context Unused. */ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { ret_code_t err_code; ble_gap_evt_t const * p_gap_evt = &p_ble_evt->evt.gap_evt; int i=0; switch (p_ble_evt->header.evt_id) { case BLE_GAP_EVT_ADV_REPORT: app_uart_put(0x3C); printf("%s",(char*)p_ble_evt->evt.gap_evt.params.adv_report.data.p_data); for(i=0;i<p_ble_evt->evt.gap_evt.params.adv_report.data.len;i++){ app_uart_put(p_ble_evt->evt.gap_evt.params.adv_report.data.p_data[i]); // app_uart_put(p_adv_report->data.p_data[i]); //send raw data to esp8266 } // nrf_delay_ms(1); app_uart_put(0x3E); break; case BLE_GAP_EVT_TIMEOUT: if (p_gap_evt->params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN) { // NRF_LOG_INFO("Connection Request timed out."); } break; case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST: // Accepting parameters requested by peer. err_code = sd_ble_gap_conn_param_update(p_gap_evt->conn_handle, &p_gap_evt->params.conn_param_update_request.conn_params); 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; default: break; } } /**@brief Function for initializing the BLE stack. * * @details Initializes the SoftDevice and the BLE event interrupt. */ static void ble_stack_init(void) { ret_code_t err_code; err_code = nrf_sdh_enable_request(); APP_ERROR_CHECK(err_code); // Configure the BLE stack using the default settings. // Fetch the start address of the application RAM. 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); // Enable BLE stack. err_code = nrf_sdh_ble_enable(&ram_start); APP_ERROR_CHECK(err_code); // Register a handler for BLE events. NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL); APP_ERROR_CHECK(err_code); } /**@brief Function for handling events from the BSP module. * * @param[in] event Event generated by button press. */ void bsp_event_handler(bsp_event_t event) { switch (event) { case BSP_EVENT_SLEEP: nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_SYSOFF); break; default: break; } } /**@brief Function for initializing the UART. */ static void uart_init(void) { ret_code_t err_code; app_uart_comm_params_t const comm_params = { .rx_pin_no = RX_PIN_NUMBER, .tx_pin_no = TX_PIN_NUMBER, .rts_pin_no = RTS_PIN_NUMBER, .cts_pin_no = CTS_PIN_NUMBER, .flow_control = APP_UART_FLOW_CONTROL_DISABLED, .use_parity = false, .baud_rate = UART_BAUDRATE_BAUDRATE_Baud115200 }; APP_ERROR_CHECK(err_code); APP_UART_FIFO_INIT(&comm_params, UART_RX_BUF_SIZE, UART_TX_BUF_SIZE, uart_event_handle, APP_IRQ_PRIORITY_LOWEST, err_code); APP_ERROR_CHECK(err_code); } /**@brief Function for initializing buttons and leds. */ static void buttons_leds_init(void) { ret_code_t err_code; bsp_event_t startup_event; err_code = bsp_init(BSP_INIT_LEDS, bsp_event_handler); APP_ERROR_CHECK(err_code); err_code = bsp_btn_ble_init(NULL, &startup_event); APP_ERROR_CHECK(err_code); } /**@brief Function for initializing the timer. */ static void timer_init(void) { ret_code_t err_code = app_timer_init(); APP_ERROR_CHECK(err_code); } /**@brief Function for initializing power management. */ static void power_management_init(void) { ret_code_t err_code; err_code = nrf_pwr_mgmt_init(); APP_ERROR_CHECK(err_code); } /**@brief Function for handling the idle state (main loop). * * @details Handles any pending log operations, then sleeps until the next event occurs. */ static void idle_state_handle(void) { if (NRF_LOG_PROCESS() == false) { nrf_pwr_mgmt_run(); } } int main(void) { // Initialize. timer_init(); uart_init(); buttons_leds_init(); power_management_init(); ble_stack_init(); scan_init(); // Start execution. scan_start(); // Enter main loop. for (;;) { idle_state_handle(); } }
Can anyone possibly help and see what I'm doing wrong?
Thank you so much in advance.