Hello,
While building a custom board, I need 52832 to communicate with a modem at regular intervals, send AT commands and read modem responses. nrf_serial library in IRQ mode seems like a good choice, since it can put CPU to sleep while waiting for the response, and also support Rx timeouts.
Although nrf_serial_read() works as expected when called from the main thread, calls from APP_TIMER never return. It seems that:
1. nrf_serial_read() busy-waits and never goes to sleep,
2. serial_timeout_handler() never fires so nrf_serial_read() keeps busy waiting.
Playing with priorities didn't help much.
I am using SDK 15.2 with softdevice enabled.
Below you can find how to reproduce the problem, can you please assist?
#include "nrf_serial.h" #include "nrf_pwr_mgmt.h" #include "app_timer.h" void test_serial_evt_handler(struct nrf_serial_s const *p_serial, nrf_serial_event_t event); void test_idle_state_handle(void); NRF_SERIAL_DRV_UART_CONFIG_DEF(test_uart0_drv_config, 8, 6, 0, 0, NRF_UART_HWFC_DISABLED, NRF_UART_PARITY_EXCLUDED, NRF_UART_BAUDRATE_115200, 5/*UART_DEFAULT_CONFIG_IRQ_PRIORITY*/); NRF_SERIAL_QUEUES_DEF(test_serial_queues, 128, 128); NRF_SERIAL_BUFFERS_DEF(test_serial_buffs, 8, 1); NRF_SERIAL_CONFIG_DEF(test_serial_config, NRF_SERIAL_MODE_IRQ, &test_serial_queues, &test_serial_buffs, test_serial_evt_handler, test_idle_state_handle); NRF_SERIAL_UART_DEF(test_serial_uart, 0); APP_TIMER_DEF(test_Tx_timer_id); /* */ void test_idle_state_handle(void) { nrf_pwr_mgmt_run(); } /* */ void test_serial_evt_handler(struct nrf_serial_s const *p_serial, nrf_serial_event_t event) { // do nothing } /* */ void onTestTxTimerTick(void *data) { // try to read 10 bytes in the next 1 second uint8_t inBuf[10]; size_t bytes_read; nrf_serial_read(&test_serial_uart, inBuf, sizeof(inBuf), &bytes_read, 1000); // Rx pin is unconnected, so we should return with a timeout. // Unfortunatelly, we never reach this point ! } /* */ void test_main() { APP_ERROR_CHECK(nrf_serial_init(&test_serial_uart, &test_uart0_drv_config, &test_serial_config)); // create a 10-sec repetitive timer APP_ERROR_CHECK(app_timer_create(&test_Tx_timer_id, APP_TIMER_MODE_REPEATED, onTestTxTimerTick)); APP_ERROR_CHECK(app_timer_start(test_Tx_timer_id, APP_TIMER_TICKS(10000), NULL)); // Enter main loop. for (;;) { test_idle_state_handle(); } }
Thanks,
Thanos