Hello everyone,
I am trying to implement UARTE on a custom board embedding an nRF52832, as part of an upgrade from SDK 12 to SDK 15. The nRF52832 is communicating via UART with a GSM chip, sending it messages and receiving some, with different lengths. I am using FreeRTOS.
In order to do that, I checked the example "experimental_libuarte" that is present in the SDK 15.2 file (nRF5_SDK_15.2.0_9412b96/examples/peripheral/experimental_libuarte).
But after implementing it in my project, I always have the same error: as soon as the STARTRX flag is raised, when calling "nrf_libuarte_async_enable(1)", the EVENTS_ERROR register pass to 1, and the ERRORSRC register shows 0xC, so framing and break errors. This happens before anything is send or retrieved.
I then tried to run only the example program, so without SoftDevice and FreeRTOS, and I have the same error.
After configuration and initialization of UARTE0, everything seems to be fine with UARTE0 register.
r
But as soon as the enabling is done by calling "nrf_libuarte_async_enable(1)", the error appears.
The error is more precisely thrown as soon as the STARTRX flag is raised, inside the "nrf_libuarte_async_enable()" function.
At first I thought that it might be a hardware error, that could for example put the RX line to 0V, interpreted as sending an infinite amount of "0", but it is not : the program worked well when using UART FIFO before, and the RX line is driven high by the nRF52832.
I am adding the main file here, that I slightly modified to match my pins settings and to initialize external clock and gsm chip :
#include <stdbool.h> #include <stdint.h> #include <stdio.h> #include "nrf_libuarte_async.h" #include <bsp.h> #include "nrf_delay.h" #define GSM_TXD_PIN 30 #define GSM_RXD_PIN 29 #define GSM_DTR_PIN 28 #define GSM_RI_PIN 27 #define GSM_CTS_PIN 26 #define GSM_RTS_PIN 25 #define GSM_PWR_PIN 31 #define ENABLE_4V_PIN 6 static uint8_t text[] = "UART example started.\r\n Loopback:\r\n"; static uint8_t text_size = sizeof(text); void uart_event_handler(nrf_libuarte_async_evt_t * p_evt) { static uint8_t ch = 0; ret_code_t ret; switch (p_evt->type) { case NRF_LIBUARTE_ASYNC_EVT_ERROR: bsp_board_led_invert(0); break; case NRF_LIBUARTE_ASYNC_EVT_RX_DATA: ch = p_evt->data.rxtx.p_data[0]; nrf_libuarte_async_rx_free(p_evt->data.rxtx.p_data, p_evt->data.rxtx.length); ret = nrf_libuarte_async_tx(&ch, 1); APP_ERROR_CHECK(ret); bsp_board_led_invert(1); break; case NRF_LIBUARTE_ASYNC_EVT_TX_DONE: bsp_board_led_invert(2); break; default: break; } } /** * @brief Function for main application entry. */ int main(void) { //External clock init NRF_CLOCK->EVENTS_HFCLKSTARTED = 0; NRF_CLOCK->TASKS_HFCLKSTART = 1; while(NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) { } NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos); NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; NRF_CLOCK->TASKS_LFCLKSTART = 1; while(NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) { } //Turning on GSM chip nrf_gpio_cfg_output(ENABLE_4V_PIN); nrf_gpio_pin_clear(ENABLE_4V_PIN); nrf_delay_ms(200); nrf_gpio_pin_set (ENABLE_4V_PIN); nrf_gpio_cfg_output(GSM_PWR_PIN); nrf_gpio_pin_set(GSM_PWR_PIN); nrf_delay_ms(4200); //UARTE0 configuration nrf_libuarte_async_config_t nrf_libuarte_async_config = { .rx_pin = GSM_RXD_PIN, .tx_pin = GSM_TXD_PIN, .cts_pin = GSM_CTS_PIN, .rts_pin = GSM_RTS_PIN, .timeout_us = 100, .baudrate = NRF_UARTE_BAUDRATE_57600, .parity = NRF_UARTE_PARITY_EXCLUDED, .hwfc = NRF_UARTE_HWFC_ENABLED }; //UARTE0 initialization ret_code_t err_code = nrf_libuarte_async_init(&nrf_libuarte_async_config, uart_event_handler); APP_ERROR_CHECK(err_code); //UARTE0 enabled (and rx start) nrf_libuarte_async_enable(1); err_code = nrf_libuarte_async_tx(text, text_size); APP_ERROR_CHECK(err_code); while (true) { } }
Thank you for your help !