UART Communication Failed

Hi,

I am implemented the uart functionality,  I'm getting below issue. 

[00:00:00.445,526] <err> Throughput: Failed to set UART callback (err -88)
[00:00:00.445,556] <err> Throughput: uart_init failed (err -88)

I checked with the logic analyzer and I  am getting the signals Please find below image,

pri.config:

 #Enable the UART driver
CONFIG_UART_ASYNC_API=y
CONFIG_NRFX_UARTE1=y
CONFIG_SERIAL=y
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y

# Config logger
CONFIG_LOG=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_LOG_BACKEND_RTT=y
CONFIG_LOG_BACKEND_UART=n
CONFIG_LOG_PRINTK=y

CONFIG_ASSERT=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_UART_1_INTERRUPT_DRIVEN=y

main.c:

#include <zephyr/sys/printk.h>
#include <zephyr/kernel.h>
#include <nrfx_clock.h>
#endif
#include <stdio.h>

#include <stddef.h>
#include <errno.h>
#include <zephyr/sys/byteorder.h>

#include <zephyr/device.h>
#include <zephyr/devicetree.h>

#include <zephyr/settings/settings.h>

#include <zephyr/drivers/uart.h>

#include <zephyr/logging/log.h>

#define LOG_MODULE_NAME Throughput
LOG_MODULE_REGISTER(LOG_MODULE_NAME);


/* UART payload buffer element size. */
#define UART_BUF_SIZE 20

#define UART_WAIT_FOR_BUF_DELAY K_MSEC(100)
#define UART_RX_TIMEOUT 60000 /* Wait for RX complete event time in microseconds. */

static const struct device *uart = DEVICE_DT_GET(DT_NODELABEL(uart1));
static struct k_work_delayable uart_work;

struct uart_data_t {
	void *fifo_reserved;
	uint8_t  data[UART_BUF_SIZE];
	uint16_t len;
};
static K_FIFO_DEFINE(fifo_uart_tx_data);
static K_FIFO_DEFINE(fifo_uart_rx_data);

static void uart_cb(const struct device *dev, struct uart_event *evt, void *user_data)
{
    ARG_UNUSED(dev);
        
    static size_t aborted_len;
    struct uart_data_t *buf;
    static uint8_t *aborted_buf;
    static bool disable_req;

    switch (evt->type) {
    case UART_TX_DONE:
        LOG_DBG("UART_TX_DONE");
        if (!evt->data.tx.buf || evt->data.tx.len == 0) {
            return;
        }

        if (aborted_buf) {
            buf = CONTAINER_OF(aborted_buf, struct uart_data_t, data[0]);
            aborted_buf = NULL;
            aborted_len = 0;
        } else {
            buf = CONTAINER_OF(evt->data.tx.buf, struct uart_data_t, data[0]);
        }

        k_free(buf);

        buf = k_fifo_get(&fifo_uart_tx_data, K_NO_WAIT);
        if (buf) {
            if (uart_tx(uart, buf->data, buf->len, SYS_FOREVER_MS)) {
                LOG_WRN("Failed to send data over UART");
            }
        }

        break;

    case UART_RX_RDY:
        LOG_DBG("UART_RX_RDY");
        buf = CONTAINER_OF(evt->data.rx.buf, struct uart_data_t, data[0]);
        buf->len += evt->data.rx.len;

        if (disable_req) {
            return;
        }

        if (evt->data.rx.buf[buf->len - 1] == '\n' || evt->data.rx.buf[buf->len - 1] == '\r') {
            disable_req = true;
            uart_rx_disable(uart);
        }

        break;

    case UART_RX_DISABLED:
        LOG_DBG("UART_RX_DISABLED");
        disable_req = false;

        buf = k_malloc(sizeof(*buf));
        if (buf) {
            buf->len = 0;
            uart_rx_enable(uart, buf->data, sizeof(buf->data), UART_RX_TIMEOUT);
        } else {
            LOG_WRN("Not able to allocate UART receive buffer");
            k_work_reschedule(&uart_work, UART_WAIT_FOR_BUF_DELAY);
        }

        break;

    case UART_RX_BUF_REQUEST:
        LOG_DBG("UART_RX_BUF_REQUEST");
        buf = k_malloc(sizeof(*buf));
        if (buf) {
            buf->len = 0;
            uart_rx_buf_rsp(uart, buf->data, sizeof(buf->data));
        } else {
            LOG_WRN("Not able to allocate UART receive buffer");
        }

        break;

    case UART_RX_BUF_RELEASED:
        LOG_DBG("UART_RX_BUF_RELEASED");
        buf = CONTAINER_OF(evt->data.rx_buf.buf, struct uart_data_t, data[0]);

        if (buf->len > 0) {
            k_fifo_put(&fifo_uart_rx_data, buf);
        } else {
            k_free(buf);
        }

        break;

    case UART_TX_ABORTED:
        LOG_DBG("UART_TX_ABORTED");
        if (!aborted_buf) {
            aborted_buf = (uint8_t *)evt->data.tx.buf;
        }

        aborted_len += evt->data.tx.len;
        buf = CONTAINER_OF(aborted_buf, struct uart_data_t, data[0]);

        uart_tx(uart, &buf->data[aborted_len], buf->len - aborted_len, SYS_FOREVER_MS);

        break;

    default:
        break;
    }
}
static void uart_work_handler(struct k_work *item)
{
	struct uart_data_t *buf;

	buf = k_malloc(sizeof(*buf));
	if (buf) {
		buf->len = 0;
	} else {
		LOG_WRN("Not able to allocate UART receive buffer");
		k_work_reschedule(&uart_work, UART_WAIT_FOR_BUF_DELAY);
		return;
	}

	uart_rx_enable(uart, buf->data, sizeof(buf->data), UART_RX_TIMEOUT);
}

static int uart_init(void)
{
    int err;
	int pos;
	struct uart_data_t *tx;
    struct uart_data_t *rx;
  

    if (!device_is_ready(uart)) {
        LOG_ERR("UART device not ready");
        return -ENODEV;
    }

    rx = k_malloc(sizeof(*rx));
    if (!rx) {
        return -ENOMEM;
    }

    rx->len = 0;

    k_work_init_delayable(&uart_work, uart_work_handler);

    err = uart_callback_set(uart, uart_cb, NULL);
    if (err) {
        LOG_ERR("Failed to set UART callback (err %d)", err);
        return err;
    }

    printk("UART initialized successfully");
	
	 tx = k_malloc(sizeof(*tx));

        if (tx) {
            pos = snprintf(tx->data, sizeof(tx->data), "WELCOME NOrdic\r\n");
          

            if ((pos < 0) || (pos >= sizeof(tx->data))) {
                k_free(tx);
                LOG_ERR("snprintf returned %d", pos);
                return;
            }  

            tx->len = pos;
        } else {
            return;
        }

        err = uart_tx(uart, tx->data, tx->len, SYS_FOREVER_MS);
        if (err) {
            k_free(tx);
            LOG_ERR("Cannot display welcome message (err: %d)", err);
            return;
        }
	return uart_rx_enable(uart, rx->data, sizeof(rx->data),
			      UART_RX_TIMEOUT);
}




int main(void)
{

	int err;
	err = uart_init();
	if (err != 0) {
		LOG_ERR("uart_init failed (err %d)", err);
		return 0;
	}

I'm using the nRF7002dk,  I configured the uart pins as mention in the below overlay file

&pinctrl {
uart1_default: uart1_default {
    group1 {
        psels = <NRF_PSEL(UART_TX, 1, 1)>,
            <NRF_PSEL(UART_RX, 1, 2)>;
    };
};

uart1_sleep: uart1_sleep {
    group1 {
        psels = <NRF_PSEL(UART_TX, 1, 1)>,
            <NRF_PSEL(UART_RX, 1, 2)>;
        low-power-enable;
    };
};
&uart1 {
	compatible = "nordic,nrf-uarte";
	status = "okay";
	current-speed = <115200>;
	pinctrl-0 = <&uart1_default>;
	pinctrl-1 = <&uart1_sleep>;
	pinctrl-names = "default", "sleep";
};

YOUR HELP IS MUCH APPRICIATED,

Thanks & Regards,

SUDHAKAR V.

Related