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

How to use UARE of nrf52840 (nRF52840 DK)

I am having trouble because TX / RX processing using UARTE cannot be performed.

nrf52840 DK  <---------> PC

The operation of TX / RX can be confirmed with UART. (Interrupts can be fetched)

But I can't do TX / RX with UARTE (Easy DMA).

I will show you the code, please tell me how to use it correctly.

/**
* uart_driver.c
**/
#define UART_PORT0_TX_PIN NRF_GPIO_PIN_MAP(1, 1)
#define UART_PORT0_RX_PIN NRF_GPIO_PIN_MAP(1, 2)

static nrfx_uarte_t uarte_instance_0 = NRFX_UARTE_INSTANCE(UART_PORT0_INSTANCE);
static uint8_t readerBuffer[UART_TX_BUFFER_SIZE] __attribute__((section(".ram_uarte1_rx"))) = { 0 }; // Data RAM
static uint8_t writerBuffer[UART_TX_BUFFER_SIZE] __attribute__((section(".ram_uarte1_tx"))) = { 0 };  // Data RAM


static void uart_port0_event_handler(nrf_drv_uart_event_t* p_event, void* p_context) {
 switch (p_event->type) {
 case NRF_DRV_UART_EVT_TX_DONE:
 break;

 case NRF_DRV_UART_EVT_RX_DONE:
 NRF_LOG_HEXDUMP_DEBUG(p_event->data.rxtx.p_data, p_event->data.rxtx.bytes);
 break;

 case NRF_DRV_UART_EVT_ERROR:
 break;


 }
}

void uart_driver_init(void)
{
 ret_code_t err_code;
 nrfx_uarte_config_t nrfx_uarte_config0; // Nordic SDKのUART設定構造体
 nrfx_uarte_config0.baudrate = NRF_UART_BAUDRATE_9600;
 nrfx_uarte_config0.hwfc = NRF_UART_HWFC_DISABLED;
 nrfx_uarte_config0.interrupt_priority = 2;
 nrfx_uarte_config0.parity = NRF_UART_PARITY_EXCLUDED;
 nrfx_uarte_config0.pselcts = NRF_UART_PSEL_DISCONNECTED;
 nrfx_uarte_config0.pselrts = NRF_UART_PSEL_DISCONNECTED;
 nrfx_uarte_config0.pselrxd = UART_PORT0_TX_PIN;
 nrfx_uarte_config0.pseltxd = UART_PORT0_RX_PIN;

 err_code = nrfx_uarte_init(&uarte_instance_0, &nrfx_uarte_config0, uarte_port0_event_handler);
}


uart_driver_send_data(void) {
 ret_code_t err_code;
 char data[] = "hello!!";

 memset(writerBuffer, 0x00, sizeof(writerBuffer));
 memcpy(writerBuffer,data, 7);

 err_code = nrfx_uarte_tx(&uarte_instance_0, writerBuffer, send_data_len);
}


void uart_read(void){

 nrfx_uarte_rx(&uarte_instance_0, readerBuffer, 6);
}


/**
* main.c
**/
APP_TIMER_DEF(uart_test_timer_id);

static void uart_timer_handler(void* p_context) {
 uart_driver_send_data();
 uart_read();
}


int main(void) {
 APP_ERROR_CHECK(nrf_sdh_enable_request());

 log_init();


 power_management_init();

 ret_code_t err_code = app_timer_init();
 APP_ERROR_CHECK(err_code);
 app_timer_create(&uart_test_timer_id, APP_TIMER_MODE_REPEATED, uart_timer_handler);


 uart_driver_init();

 app_timer_start(uart_test_timer_id, APP_TIMER_TICKS(5000), NULL);


 while (true) {
 idle_state_handle();
 }

}

Related