Hi there,
I am using nRF5_SDK 16 with PCA10056 and Fanstel EV-BT840-V4. I am testing my example with BT-840 module as we will use it for our final product.
First i tried the peripheral uart example and it works perfectly as expected but i prefer to use 2 UARTS if possible.
Now i am trying serial_uartes example, i can TX on both ports(both are connected to PC terminals) and then i do receive NRF_SERIAL_EVENT_TX_DONE event.
But RX interrupt is never fired without a call to nrf_serial_read(), i was expecting in interrupt mode RX interrupt should be fired as soon byte is received without a read call.
Is it possible to get RX interrupts without read call ?
Here are my changes in main.c, i only pasted the changes here. Full main.c is attached.
... //UART 0 on #define RX_PIN_NUMBER_0 26 //8 #define TX_PIN_NUMBER_0 27 // 6 #define CTS_PIN_NUMBER_0 0 //7 #define RTS_PIN_NUMBER_0 0 //5 //UART 1 on #define RX_PIN_NUMBER_1 02 //8 #define TX_PIN_NUMBER_1 03 // 6 #define CTS_PIN_NUMBER_1 0 //7 #define RTS_PIN_NUMBER_1 0 //5 .... static void serial_event_handler(nrf_serial_t const * p_serial,nrf_serial_event_t event) { if(event == NRF_SERIAL_EVENT_FIFO_ERR) { printf("\nNRF_SERIAL_EVENT_FIFO_ERR on serial id = %d\n",p_serial->instance); } if(event == NRF_SERIAL_EVENT_DRV_ERR) { printf("\nNRF_SERIAL_EVENT_DRV_ERR on serial id = %d\n",p_serial->instance); } if(event == NRF_SERIAL_EVENT_TX_DONE) { printf("\nNRF_SERIAL_EVENT_TX_DONE on serial id = %d\n",p_serial->instance); } if(event == NRF_SERIAL_EVENT_RX_DATA) { printf("\nNRF_SERIAL_EVENT_RX_DATA on serial id = %d\n",p_serial->instance); } } ... NRF_SERIAL_DRV_UART_CONFIG_DEF(m_uarte0_drv_config, RX_PIN_NUMBER_0, TX_PIN_NUMBER_0, RTS_PIN_NUMBER_0, CTS_PIN_NUMBER_0, NRF_UART_HWFC_DISABLED, NRF_UART_PARITY_EXCLUDED, NRF_UART_BAUDRATE_115200, UART_DEFAULT_CONFIG_IRQ_PRIORITY); NRF_SERIAL_DRV_UART_CONFIG_DEF(m_uarte1_drv_config, RX_PIN_NUMBER_1, TX_PIN_NUMBER_1, RTS_PIN_NUMBER_1, CTS_PIN_NUMBER_1, NRF_UART_HWFC_DISABLED, NRF_UART_PARITY_EXCLUDED, NRF_UART_BAUDRATE_115200, UART_DEFAULT_CONFIG_IRQ_PRIORITY); ... NRF_SERIAL_CONFIG_DEF(serial0_config, NRF_SERIAL_MODE_DMA,&serial0_queues, &serial0_buffs, serial_event_handler, sleep_handler); NRF_SERIAL_CONFIG_DEF(serial1_config, NRF_SERIAL_MODE_DMA,&serial1_queues, &serial1_buffs, serial_event_handler, sleep_handler); ... in main() static char tx_message0[] = "Hello nrf_serial port = 0!\n\r"; static char tx_message1[] = "Hello nrf_serial port = 1!\n\r"; ret = nrf_serial_write(&serial0_uarte, tx_message0, strlen(tx_message0), NULL, NRF_SERIAL_MAX_TIMEOUT); (void)nrf_serial_flush(&serial0_uarte, 0); ret = nrf_serial_write(&serial1_uarte, tx_message1, strlen(tx_message1), NULL, NRF_SERIAL_MAX_TIMEOUT); (void)nrf_serial_flush(&serial1_uarte, 0); while (true) {}
#include <stdint.h> #include <stdbool.h> #include <stddef.h> #include "nrf.h" #include "nrf_drv_clock.h" #include "nrf_gpio.h" #include "nrf_delay.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_drv_power.h" #include "nrf_serial.h" #include "app_timer.h" #include "app_error.h" #include "app_util.h" #include "boards.h" //UART 0 on #define RX_PIN_NUMBER_0 26 //8 #define TX_PIN_NUMBER_0 27 // 6 #define CTS_PIN_NUMBER_0 0 //7 #define RTS_PIN_NUMBER_0 0 //5 //UART 1 on #define RX_PIN_NUMBER_1 02 //8 #define TX_PIN_NUMBER_1 03 // 6 #define CTS_PIN_NUMBER_1 0 //7 #define RTS_PIN_NUMBER_1 0 //5 /** @file * @defgroup nrf_serial_uartes_example main.c * @{ * @ingroup nrf_serial_uartes_example * @brief Example of @ref nrf_serial usage. Loopback example using two UARTE peripherals. * Please short Arduino SCL and SDA GPIOs to start transmission. * */ #define OP_QUEUES_SIZE 3 #define APP_TIMER_PRESCALER NRF_SERIAL_APP_TIMER_PRESCALER static void sleep_handler(void) { __WFE(); __SEV(); __WFE(); } static void serial_event_handler(nrf_serial_t const * p_serial,nrf_serial_event_t event) { if(event == NRF_SERIAL_EVENT_FIFO_ERR) { printf("\nNRF_SERIAL_EVENT_FIFO_ERR on serial id = %d\n",p_serial->instance); } if(event == NRF_SERIAL_EVENT_DRV_ERR) { printf("\nNRF_SERIAL_EVENT_DRV_ERR on serial id = %d\n",p_serial->instance); } if(event == NRF_SERIAL_EVENT_TX_DONE) { printf("\nNRF_SERIAL_EVENT_TX_DONE on serial id = %d\n",p_serial->instance); } if(event == NRF_SERIAL_EVENT_RX_DATA) { printf("\nNRF_SERIAL_EVENT_RX_DATA on serial id = %d\n",p_serial->instance); } } NRF_SERIAL_DRV_UART_CONFIG_DEF(m_uarte0_drv_config, RX_PIN_NUMBER_0, TX_PIN_NUMBER_0, RTS_PIN_NUMBER_0, CTS_PIN_NUMBER_0, NRF_UART_HWFC_DISABLED, NRF_UART_PARITY_EXCLUDED, NRF_UART_BAUDRATE_115200, UART_DEFAULT_CONFIG_IRQ_PRIORITY); NRF_SERIAL_DRV_UART_CONFIG_DEF(m_uarte1_drv_config, RX_PIN_NUMBER_1, TX_PIN_NUMBER_1, RTS_PIN_NUMBER_1, CTS_PIN_NUMBER_1, NRF_UART_HWFC_DISABLED, NRF_UART_PARITY_EXCLUDED, NRF_UART_BAUDRATE_115200, UART_DEFAULT_CONFIG_IRQ_PRIORITY); #define SERIAL_FIFO_TX_SIZE 256 #define SERIAL_FIFO_RX_SIZE 256 NRF_SERIAL_QUEUES_DEF(serial0_queues, SERIAL_FIFO_TX_SIZE, SERIAL_FIFO_RX_SIZE); NRF_SERIAL_QUEUES_DEF(serial1_queues, SERIAL_FIFO_TX_SIZE, SERIAL_FIFO_RX_SIZE); #define SERIAL_BUFF_TX_SIZE 64 #define SERIAL_BUFF_RX_SIZE 64 NRF_SERIAL_BUFFERS_DEF(serial0_buffs, SERIAL_BUFF_TX_SIZE, SERIAL_BUFF_RX_SIZE); NRF_SERIAL_BUFFERS_DEF(serial1_buffs, SERIAL_BUFF_TX_SIZE, SERIAL_BUFF_RX_SIZE); NRF_SERIAL_CONFIG_DEF(serial0_config, NRF_SERIAL_MODE_DMA,&serial0_queues, &serial0_buffs, serial_event_handler, sleep_handler); NRF_SERIAL_CONFIG_DEF(serial1_config, NRF_SERIAL_MODE_DMA,&serial1_queues, &serial1_buffs, serial_event_handler, sleep_handler); //NRF_SERIAL_CONFIG_DEF(serial0_config, NRF_SERIAL_MODE_IRQ,&serial0_queues, &serial0_buffs, serial_event_handler, sleep_handler); //NRF_SERIAL_CONFIG_DEF(serial1_config, NRF_SERIAL_MODE_DMA,&serial1_queues, &serial1_buffs, serial_event_handler, sleep_handler); NRF_SERIAL_UART_DEF(serial0_uarte, 0); NRF_SERIAL_UART_DEF(serial1_uarte, 1); int main(void) { uint32_t ret; uint32_t pinnum = 13; ret = nrf_drv_clock_init(); APP_ERROR_CHECK(ret); ret = nrf_drv_power_init(NULL); APP_ERROR_CHECK(ret); nrf_drv_clock_lfclk_request(NULL); ret = app_timer_init(); APP_ERROR_CHECK(ret); nrf_gpio_cfg_output(pinnum); nrf_gpio_pin_write(pinnum,1); nrf_gpio_pin_write(pinnum,0); // Initialize LEDs and buttons. // bsp_board_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS); ret = nrf_serial_init(&serial0_uarte, &m_uarte0_drv_config, &serial0_config); APP_ERROR_CHECK(ret); ret = nrf_serial_init(&serial1_uarte, &m_uarte1_drv_config, &serial1_config); APP_ERROR_CHECK(ret); static char tx_message0[] = "Hello nrf_serial port = 0!\n\r"; static char tx_message1[] = "Hello nrf_serial port = 1!\n\r"; ret = nrf_serial_write(&serial0_uarte, tx_message0, strlen(tx_message0), NULL, NRF_SERIAL_MAX_TIMEOUT); (void)nrf_serial_flush(&serial0_uarte, 0); ret = nrf_serial_write(&serial1_uarte, tx_message1, strlen(tx_message1), NULL, NRF_SERIAL_MAX_TIMEOUT); (void)nrf_serial_flush(&serial1_uarte, 0); while (true) { char c; // nrf_serial_read(&serial0_uarte, &c, sizeof(c), NULL, 0); //nrf_serial_read(&serial1_uarte, &c, sizeof(c), NULL, 0); /*char c; if(nrf_serial_read(&serial0_uarte, &c, sizeof(c), NULL, 0) == NRF_SUCCESS) //printf("received on port = 0, c= %c\n",c); if(nrf_serial_read(&serial1_uarte, &c, sizeof(c), NULL, 0) == NRF_SUCCESS) //printf("received on port = 1, c= %c\n",c); ret = nrf_serial_read(&serial0_uarte, &c, sizeof(c), NULL, 1000); if (ret != NRF_SUCCESS) { continue; } (void)nrf_serial_write(&serial0_uarte, &c, sizeof(c), NULL, 0); (void)nrf_serial_flush(&serial0_uarte, 0); ret = nrf_serial_read(&serial1_uarte, &c, sizeof(c), NULL, 1000); if (ret != NRF_SUCCESS) { continue; } (void)nrf_serial_write(&serial1_uarte, &c, sizeof(c), NULL, 0); (void)nrf_serial_flush(&serial1_uarte, 0); */ } } /** @} */