Hi all,
I'm trying to use uart2 on my custom nrf9151 board, but I'm stuck. As I understand, I use i2c1 so I can't use uart1 and i2c1in parallel, so here is why I wnt to use uart2.
Here is my configufration: I use P0.23 and P0.24 in my dtsi file
uart2_default: uart2_default { group1 { psels = <NRF_PSEL(UART_TX, 0, 23)>, <NRF_PSEL(UART_RX, 0, 24)>; }; }; uart2_sleep: uart2_sleep { group1 { psels = <NRF_PSEL(UART_TX, 0, 23)>, <NRF_PSEL(UART_RX, 0, 24)>; low-power-enable; }; };
And in overlay file
&uart2 { status = "okay"; current-speed = <115200>; pinctrl-0 = <&uart2_default>; pinctrl-1 = <&uart2_sleep>; pinctrl-names = "default", "sleep"; };
and I've added CONFIG_UART_ASYNC_API=y in my prj.conf. So after all thaht setup I've write uart_async.c file (inspired by devacedemy here)
#define UART_NODE DT_NODELABEL(uart2) #define RX_BUF_SIZE 64 #define RX_TIMEOUT 100 static const struct device *uart_dev; static uint8_t rx_buf[RX_BUF_SIZE]; struct tx_msg { uint8_t data[64]; size_t len; }; static void uart_cb(const struct device *dev, struct uart_event *evt, void *user_data) { switch (evt->type) { case UART_TX_DONE: LOG_DBG("TX done (%d bytes)", evt->data.tx.len); break; case UART_TX_ABORTED: LOG_ERR("TX aborted"); break; case UART_RX_RDY: if (evt->data.rx.len > 0) { LOG_INF("RX"); LOG_HEXDUMP_INF(&evt->data.rx.buf[evt->data.rx.offset], evt->data.rx.len, "RX Data"); for (size_t i = evt->data.rx.offset; i < evt->data.rx.offset + evt->data.rx.len; i++) { if (rx_buf[i] == '\n') { LOG_INF("End of message detected"); } } } break; case UART_RX_DISABLED: LOG_WRN("RX disabled, re-enabling"); uart_rx_enable(dev, rx_buf, sizeof(rx_buf), RX_TIMEOUT); break; case UART_RX_BUF_REQUEST: // RX buffer management not used in this basic example break; case UART_RX_BUF_RELEASED: // RX buffer management not used in this basic example break; case UART_RX_STOPPED: LOG_ERR("RX stopped due to error %d", evt->data.rx_stop.reason); break; default: break; } } int uart_init(void) { uart_dev = DEVICE_DT_GET(UART_NODE); if (!device_is_ready(uart_dev)) { LOG_ERR("UART device not ready"); return -ENODEV; } const struct uart_config uart_cfg = { .baudrate = 115200, .parity = UART_CFG_PARITY_NONE, .stop_bits = UART_CFG_STOP_BITS_1, .data_bits = UART_CFG_DATA_BITS_8, .flow_ctrl = UART_CFG_FLOW_CTRL_NONE }; int ret = uart_configure(uart_dev, &uart_cfg); if (ret == -ENOSYS) { return -ENOSYS; } ret = uart_rx_enable(uart_dev, rx_buf, sizeof(rx_buf), RX_TIMEOUT); if (ret) { LOG_ERR("Failed to enable UART RX (%d)", ret); return ret; } LOG_INF("UART initialized"); return 0; } int uart_send_data(const uint8_t *data, size_t len) { int ret = uart_tx(uart_dev, data, len, SYS_FOREVER_MS); if (ret) { LOG_ERR("UART TX failed (%d)", ret); return ret; } return 0; }
and my main
uart_init(); static uint8_t tx_buf[] = { "nRF Connect SDK Fundamentals Course\r\n" }; uart_send_data(tx_buf, sizeof(tx_buf)); ....
Everything build but when my board boot, I receive my tx data but after thaht my board seem to be freeze nothing happen. If I boot my board without cp21 connected to P0.23/24 my board boot and run normaly, but if I try to send data through my cp21 i receive nothing...
Is there other configuration I missed in non secure to use uart2? It's seem RX pin to somthing, if I unplung it from mycp2102 my board boot normally