This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Serial port library read function and Free RTOS

Hi! 

I am trying to use serial port library with Free RTOS (SDK 15.3). I created a read task but when I try to read, the function does sometimes receive wrong bytes. I also get "NRF_SERIAL_EVENT_DRV_ERR" events when adding an event handler. Does anybode know why?

Following my code:

static void sleep_handler(void)
{
    __WFE();
    __SEV();
    __WFE();
}

NRF_SERIAL_DRV_UART_CONFIG_DEF(m_uarte0_drv_config,
                      RX_PIN_NUMBER, ARDUINO_SCL_PIN,
                      RTS_PIN_NUMBER, CTS_PIN_NUMBER,
                      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,
                      ARDUINO_SDA_PIN, TX_PIN_NUMBER,
                      RTS_PIN_NUMBER, CTS_PIN_NUMBER,
                      NRF_UART_HWFC_DISABLED, NRF_UART_PARITY_EXCLUDED,
                      NRF_UART_BAUDRATE_115200,
                      UART_DEFAULT_CONFIG_IRQ_PRIORITY);


#define SERIAL_FIFO_TX_SIZE 32
#define SERIAL_FIFO_RX_SIZE 32

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 1
#define SERIAL_BUFF_RX_SIZE 1

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, NULL, sleep_handler);
NRF_SERIAL_CONFIG_DEF(serial1_config, NRF_SERIAL_MODE_DMA,
                      &serial1_queues, &serial1_buffs, NULL, sleep_handler);


NRF_SERIAL_UART_DEF(serial0_uarte, 0);
NRF_SERIAL_UART_DEF(serial1_uarte, 1);

void UART_Read_Task()
{
   char c;
   ret_code_t ret;
   while(true)
   {
      ret = nrf_serial_read(&serial0_uarte, &c, sizeof(c), NULL, 0);
      if (ret == NRF_SUCCESS)
      {
          // todo
      }

      ret = nrf_serial_read(&serial1_uarte, &c, 1, NULL, 0);
      if (ret == NRF_SUCCESS)
      {
         // todo
      }
  }
}

int main(void)
{
    ret_code_t ret;

    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();

    timers_init();


    APP_ERROR_CHECK(ret);
    log_init();
    // 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);

    // other stuff here
    
     if (pdPASS != xTaskCreate(UART_Read_Task,
                              "UART_Read",
                              USBD_STACK_SIZE,
                              NULL,
                              1,
                              &m_UART_Read_thread))
    {
        APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
    }

      // Activate deep sleep mode.
    SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
    // Start FreeRTOS scheduler.
    vTaskStartScheduler();


    for (;;)
    {
       APP_ERROR_HANDLER(NRF_ERROR_FORBIDDEN);
    }
    
}

Parents Reply
  • The problem could be the mode which you seem to have configured to be DMA mode to work in blocking mode at the time of initialization.

    I am not sure if this combo works fine with the mutex, queues used from nRF5 SDK combined with FreeRTOS. 

    Does your read had to be blocking? I would recommend you to use non blocking reads or make the driver work in interrupt mode

    Do not forget if you use interrupt mode

    Warning
    Do not use synchronous API (timeout_ms parameter > 0) in IRQ context. It may lead to a deadlock because the timeout interrupt cannot preempt the current IRQ context.

Children
Related