Hello,
I plan to use uart1 for serial port development based on the binary protocol. I will receive bytes using the interrupt method. But when I send bytes (such as FAFBFC), I can only receive FA from the fifo, even if I use while.
Also, when I send bytes again (such as FBFCFD), the interrupt will not enter again. I would like to know how to solve this problem.
The following is my code:
int uart_init(void* param)
{
k_tid_t uart_rx_tid;
memset(tx_rb, 0, sizeof(tx_rb));
ring_buf_init(&tx_ringbuf, sizeof(tx_rb), tx_rb);
memset(rx_buf,0,sizeof(rx_buf));
k_sem_init(&rx_handle_sem,0,1);
k_mutex_init(&send_mutex);
uart_rx_tid = k_thread_create(&rec_thread_data, rec_thread_stack,
K_THREAD_STACK_SIZEOF(rec_thread_stack),
rec_thread_entry, NULL, NULL, NULL,
1, 0, K_MSEC(10));
k_thread_name_set(uart_rx_tid, "uart_rx_thread");
uart_dev = device_get_binding(UART_LABEL);
if (uart_dev == NULL)
{
return -1;
}
uart_irq_callback_user_data_set(uart_dev, int_driven_callback, &uart_user_data);
uart_extra_port_init();
uart_state = true;
uart_irq_rx_enable(uart_dev);
tx_state = false;
rx_state = true;
if(gpio_pin_get_dt(&rx_en_dt) == 0)
{
rx_state = false;
uart_disable();
}
else
{
k_work_reschedule(&rx_timeout_work, K_MSEC(RX_TIMEOUT_INTERVAL));
}
return 0;
}
static int uart_extra_port_init(void)
{
int ret;
if(!device_is_ready(rx_en_dt.port))
{
ULOG_ERR("rx_en_dt not ready");
return -1;
}
// gpio
ret = gpio_pin_configure_dt(&rx_en_dt, GPIO_INPUT);
if (ret != 0) {
ULOG_ERR("Error %d: failed to configure %s pin %d\n",
ret, rx_en_dt.port->name, rx_en_dt.pin);
return -2;
}
//interrupt config
ret = gpio_pin_interrupt_configure_dt(&rx_en_dt,
GPIO_INT_EDGE_TO_ACTIVE);
if (ret != 0) {
ULOG_ERR("Error %d: failed to configure interrupt on %s pin %d\n",
ret, rx_en_dt.port->name, rx_en_dt.pin);
return -3;
}
//interrupt callback
gpio_init_callback(&rx_en_pin_cb_data, rx_en_pin_handler, BIT(rx_en_dt.pin));
gpio_add_callback(rx_en_dt.port, &rx_en_pin_cb_data);
ULOG_INF("Set up rx en at %s pin %d\n", rx_en_dt.port->name, rx_en_dt.pin);
if(!device_is_ready(tx_ntf_dt.port))
{
ULOG_ERR("tx_ntf_dt not ready");
return -4;
}
ret = gpio_pin_configure_dt(&tx_ntf_dt, GPIO_OUTPUT);
if (ret < 0) {
ULOG_ERR("Error %d: failed to configure device %s pin %d",
ret, tx_ntf_dt.port->name, tx_ntf_dt.pin);
return -5;
}
gpio_pin_set_dt(&tx_ntf_dt, 0);
return 0;
}And my prj.conf about uart:
CONFIG_SERIAL=y CONFIG_UART_INTERRUPT_DRIVEN=y CONFIG_UART_1_INTERRUPT_DRIVEN=y CONFIG_UART_0_INTERRUPT_DRIVEN=n CONFIG_UART_1_ASYNC=n CONFIG_UART_ASYNC_API=y CONFIG_UART_0_ASYNC=y CONFIG_UART_0_NRF_ASYNC_LOW_POWER=y
I am looking for your reply.
Jerry