T1-CHL串口相关的问题

Wi-Fi 设备、Wi-Fi 低功耗设备、Wi-Fi BLE 双模设备、Ethernet设备、Ethernet+Wi-Fi设备等
JSHANG
Posts: 63

您好,反复复现这个问题,有时日志串口输入没有中断发生,还在排查中


Tags:
feige2023
Posts: 21

Re: T1-CHL串口相关的问题

大佬,请问排查得怎样哈,有什么处理方式哈,在线等,急。
我最终还是要用我们自己的简易的命令终端,所以最核心的目的还是想能获取到日志串口的输入哈。
(因为从2.3.3的BK7231N SDK升级过来的,依赖以前的命令行)

feige2023
Posts: 21

Re: T1-CHL串口相关的问题

大佬大佬,日志串口的接收回调问题(或获取该串口的输入)有没有下文,我现在临时用TCP服务作为命令终端,依赖于配网这个条件,也让我们一些测试环境受限诶。

feige2023
Posts: 21

Re: T1-CHL串口相关的问题

大佬大佬们,求解决。

JSHANG
Posts: 63

Re: T1-CHL串口相关的问题

  1. 不用再起用cli_init, 因为底层中断把uart寄存器的内容先读到了fifo, 再去寄存器读不到

  2. 如下修改解决T1_os/T1/driver/uart/uart_bk.c b/T1_os/T1/driver/uart/uart_bk.c:
    中断通过宏CFG_CLI_UART, 不让读到fifo解决。
    diff --git a/T1_os/T1/driver/uart/uart_bk.c b/T1_os/T1/driver/uart/uart_bk.c
    index fb64bc4..6233033 100755
    --- a/T1_os/T1/driver/uart/uart_bk.c
    +++ b/T1_os/T1/driver/uart/uart_bk.c
    @@ -878,10 +878,12 @@ void uart2_isr(void)

    if(status & (RX_FIFO_NEED_READ_STA | UART_RX_STOP_END_STA))
    {

  3. #if CFG_CLI_UART
    #if (!CFG_SUPPORT_RTT)
    uart_read_fifo_frame(UART2_PORT, uart[UART2_PORT].rx);
    #endif
    -

  4. #endif
    +
    if (uart_receive_callback[1].callback != 0)
    {

  5. 测试代码如下:
    void xx_cb(int port_id)
    {
    uint32_t rx_char = 0;
    int ret;
    while (1)
    {
    rx_char = 0;
    ret = tkl_uart_read(port_id, &rx_char, 1);
    if (!ret) {
    bk_printf("%s:%d ret %d\r\n", func, LINE, ret);
    break;
    }
    bk_printf("%s:%d rx_char 0x%x ret %d\r\n", func, LINE, rx_char, ret);
    }
    }

void tkl_uart_unit_test(void)
{
tkl_uart_rx_irq_cb_reg(1, xx_cb);
}

feige2023
Posts: 21

Re: T1-CHL串口相关的问题

您好,我反复测试,按照您的修改方案,以及直接在uart2_isr中这样修改:
修改测试1 中断回调测试:

Code: Select all

void uart2_isr(void)
{
#if CFG_UART_DEBUG_COMMAND_LINE
    UINT32 status;
    UINT32 intr_en;
    UINT32 intr_status;

intr_en = REG_READ(REG_UART2_INTR_ENABLE);
intr_status = REG_READ(REG_UART2_INTR_STATUS);
REG_WRITE(REG_UART2_INTR_STATUS, intr_status);
status = intr_status & intr_en;

if(status & (RX_FIFO_NEED_READ_STA | UART_RX_STOP_END_STA))
{
    bk_printf("uart2 isr\n");

修改测试2 回环测试:

Code: Select all

void uart2_isr(void)
{
#if CFG_UART_DEBUG_COMMAND_LINE
    UINT32 status;
    UINT32 intr_en;
    UINT32 intr_status;

intr_en = REG_READ(REG_UART2_INTR_ENABLE);
intr_status = REG_READ(REG_UART2_INTR_STATUS);
REG_WRITE(REG_UART2_INTR_STATUS, intr_status);
status = intr_status & intr_en;

if(status & (RX_FIFO_NEED_READ_STA | UART_RX_STOP_END_STA))
{
    uart_read_fifo_frame(UART2_PORT, uart[UART2_PORT].rx);
    
/* ------------------ fifo frame ---------------------------*/     
UINT32 uart_read_fifo_frame(UINT8 uport, KFIFO_PTR rx_ptr) { UINT32 val; UINT32 rx_count, fifo_status_reg; if(UART1_PORT == uport) fifo_status_reg = REG_UART1_FIFO_STATUS; else fifo_status_reg = REG_UART2_FIFO_STATUS; rx_count = 0; while(REG_READ(fifo_status_reg) & FIFO_RD_READY) { UART_READ_BYTE(uport, val); UART_WRITE_BYTE(uport,val); // 进行回环测试,直接输出 rx_count += kfifo_put(rx_ptr, (UINT8 *)&val, 1); } return rx_count; }

在日志终端中,均没有打印出相应日志。
就是说,中断回调都没进来。。。我们更换过模块,也是相同情况。

JSHANG
Posts: 63

Re: T1-CHL串口相关的问题

我测试可以的;再确认一下你的函数修改:
void uart2_isr(void)
{
#if CFG_UART_DEBUG_COMMAND_LINE
UINT32 status;
UINT32 intr_en;
UINT32 intr_status;

Code: Select all

intr_en = REG_READ(REG_UART2_INTR_ENABLE);
intr_status = REG_READ(REG_UART2_INTR_STATUS);
REG_WRITE(REG_UART2_INTR_STATUS, intr_status);
status = intr_status & intr_en;

if(status & (RX_FIFO_NEED_READ_STA | UART_RX_STOP_END_STA))
{

#if CFG_CLI_UART    
#if (!CFG_SUPPORT_RTT)
	uart_read_fifo_frame(UART2_PORT, uart[UART2_PORT].rx);
#endif
#endif

	if (uart_receive_callback[1].callback != 0)
	{
		void *param = uart_receive_callback[1].param;
		uart_receive_callback[1].callback(UART2_PORT, param);
	}
	else
	{
		uart_read_byte(UART2_PORT); /*drop data for rtt*/
	}
}

if(status & TX_FIFO_NEED_WRITE_STA)
{
    if (uart_txfifo_needwr_callback[1].callback != 0)
    {
        void *param = uart_txfifo_needwr_callback[1].param;

        uart_txfifo_needwr_callback[1].callback(UART2_PORT, param);
    }      
}

if(status & RX_FIFO_OVER_FLOW_STA)
{
}

if(status & UART_RX_PARITY_ERR_STA)
{
    uart_fifo_flush(UART2_PORT);
}
 
if(status & UART_RX_STOP_ERR_STA)
{
}

if(status & UART_TX_STOP_END_STA)
{
    if (uart_tx_end_callback[1].callback != 0)
    {
        void *param = uart_tx_end_callback[1].param;

        uart_tx_end_callback[1].callback(UART2_PORT, param);
    }
}

if(status & UART_RXD_WAKEUP_STA)
{
}

#endif
}

  1. 用我的demo先跑一个确认一下:
    void xx_cb(int port_id)
    {
    uint32_t rx_char = 0;
    int ret;
    while (1)
    {
    rx_char = 0;
    ret = tkl_uart_read(port_id, &rx_char, 1);
    if (!ret) {
    bk_printf("%s:%d ret %d\r\n", func, LINE, ret);
    break;
    }
    bk_printf("%s:%d rx_char 0x%x ret %d\r\n", func, LINE, rx_char, ret);
    }
    }

void tkl_uart_unit_test(void)
{
tkl_uart_rx_irq_cb_reg(1, xx_cb);
}

我本地验证过的,输入可以收上来;

feige2023
Posts: 21

Re: T1-CHL串口相关的问题

您好,我确认是按照您的修改方案处理的:
以下是uart2_isr代码:

Code: Select all

void uart2_isr(void)
{
#if CFG_UART_DEBUG_COMMAND_LINE
    UINT32 status;
    UINT32 intr_en;
    UINT32 intr_status;

intr_en = REG_READ(REG_UART2_INTR_ENABLE);
intr_status = REG_READ(REG_UART2_INTR_STATUS);
REG_WRITE(REG_UART2_INTR_STATUS, intr_status);
status = intr_status & intr_en;

if(status & (RX_FIFO_NEED_READ_STA | UART_RX_STOP_END_STA))
{
#if CFG_CLI_UART         
#if (!CFG_SUPPORT_RTT) uart_read_fifo_frame(UART2_PORT, uart[UART2_PORT].rx); #endif #endif
if (uart_receive_callback[1].callback != 0) { void *param = uart_receive_callback[1].param; uart_receive_callback[1].callback(UART2_PORT, param); } else { uart_read_byte(UART2_PORT); /*drop data for rtt*/ } }

按照你的demo,我在quickstart中测试也是没有打印中断回调的东西。。。

Code: Select all

void uart2_isr_callback(int port_id)
{
    uint32_t rx_char = 0;
    int ret;
    while (1)
    {
        rx_char = 0;
        ret = tkl_uart_read(port_id, &rx_char, 1);
        if (!ret) {
            bk_printf("%s:%d ret %d\r\n", "uart2_isr_callback", __LINE__, ret);
            break;
        }
        bk_printf("%s:%d rx_char 0x%x ret %d\r\n", "uart2_isr_callback", __LINE__, rx_char, ret);
    }
}
STATIC VOID_T user_main(VOID_T)
{
    OPERATE_RET rt = OPRT_OK;

  /* 忽略了中间无关代码 */
    tal_log_set_manage_attr(TAL_LOG_LEVEL_DEBUG);
    tkl_uart_rx_irq_cb_reg(1, uart2_isr_callback);
    /* Initialization device */
    TAL_PR_DEBUG("device_init in");
    TUYA_CALL_ERR_LOG(__soc_device_init());

return;
}

是否是SDK版本的问题哈?SDK包为:tuyaos-iot_3.11.11_T1_wifi_ble_com_0.0.12

feige2023
Posts: 21

Re: T1-CHL串口相关的问题

-- 删除此前描述

Last edited by feige2023 on 2025年 May 26日 18:56, edited 1 time in total.
feige2023
Posts: 21

Re: T1-CHL串口相关的问题

对了,确定CFG_CLI_UART宏为0,即uart2_isr中没有执行uart_read_fifo_frame(UART2_PORT, uart[UART2_PORT].rx);

Post Reply