打印
[技术问答]

NUC029 UART FIFO问题

[复制链接]
1030|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lz13|  楼主 | 2020-8-26 16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一次用NUC029,在调试UART0时,发现一个不能理解的问题,UART0接收的FIFO里有个指针,按文档里说应该是读一个字节,指针减1,现在发现我用F10单步走的时候,每次都导致FIFO指针减少,还不是减少1,而且程序并没有执行读取数据的操作。

使用特权

评论回复
沙发
jasontu| | 2020-8-27 08:32 | 只看该作者
fifo是增加,可以贴你的代码上来让看看。

使用特权

评论回复
板凳
lz13|  楼主 | 2020-8-28 09:08 | 只看该作者
jasontu 发表于 2020-8-27 08:32
fifo是增加,可以贴你的代码上来让看看。

感谢你的回复,代码其实很简单,功能其实也是对的,就是不用调试。

#pragma inline = forced
void InitModbus(u8 mode )
{       
        InitGPIOPort(PIN_SendCS, GP_MOD_PP, GP_DINOFF_DF, GP_DBEN_DF, GP_OUT_0 );
        //InitGPIOPort(PIN_TXD, GP_MOD_PP, GP_DINOFF_DF, GP_DBEN_DF, GP_OUT_1 );
        //InitGPIOPort(PIN_RXD, GP_MOD_IN, GP_DINOFF_DIS, GP_DBEN_EN, GP_OUT_1 );
        UART_Open(UART0, 9600);
        UART_DisableFlowCtrl(UART0);
        //UART0->FUN_SEL = UART_FUNC_SEL_RS485;
        UART0->FCR |= UART_FCR_RFITL_4BYTES;
        UART0->TOR = (20<<8) | 30;        // XX bit
        //UART_EnableInt(UART0, UART_IER_RDA_IEN_Msk|UART_IER_RTO_IEN_Msk);
        StartRecv();
}

#pragma inline = forced
void Interactive(void) {
        static u16 ovt=0;
        ovt ++;
       
        //while( UART_GET_INT_FLAG(UART0, UART_ISR_RDA_IF_Msk) ) {
        while( !UART_GET_RX_EMPTY(UART0) ) {
                u8 dat;
                dat = UART_READ(UART0);
                if( RecvBuff.len < MODBUS_STREAMMAXLEN ) {
                        RecvBuff.content[ RecvBuff.len ] = dat;
                        RecvBuff.len ++;
                }
                if( PrtlFlag == PRTL_IDLE ) {
                        PrtlFlag = PRTL_RECV;
                }
                ovt = 0;
        }
        //if( UART_GET_INT_FLAG(UART0, UART_ISR_TOUT_IF_Msk) ) {
        if( ovt >=2 ) {
                if( PrtlFlag == PRTL_RECV ) {
                        PrtlFlag = PRTL_RECV_OVER;
                }
        }          
       
        if( PrtlFlag == PRTL_RECV_OVER ) {
                u8 tmp;
                if( unpack() ) {
                        tmp = ProcPack( (struct CmdDataStruct*)&cmdbuff );
                        if( tmp == OP_RIGHT ) {
                                pack();
                                StartSend();
                        } else {
                                StartRecv();
                        }
                } else {
                        StartRecv();
                }
        }
       
        if( PrtlFlag == PRTL_SEND ) {
                while( !UART_IS_TX_FULL(UART0) ) {
                        if(  SendBuff.index < SendBuff.len ) {
                                UART_WRITE(UART0, SendBuff.content[SendBuff.index]);
                                SendBuff.index ++;
                        }
                }
                if( UART_IS_TX_EMPTY(UART0) ) {
                        PrtlFlag = PRTL_SEND_OVER;
                        SendOverTcnt = 0;
                }
        }
       
        if( PrtlFlag == PRTL_SEND_OVER ) {       
                if( SendOverTcnt >= 2 ) {
                        StartRecv();
                } else {
                        SendOverTcnt ++;
                }
        }
}

使用特权

评论回复
地板
lz13|  楼主 | 2020-8-28 09:13 | 只看该作者
还是有个问题,我保证FIFO不空的情况下,接收超时标志,永远等不到,采用查询的方式,查询间隔1ms,波特率9600

使用特权

评论回复
5
jasontu| | 2020-8-31 08:43 | 只看该作者
UART0->FCR |= UART_FCR_RFITL_4BYTES; 及你把fifo 里里面的值读走了。
大概有2个case
你可以送4笔FIFO里面,不取走资料。UART TIMEOUT会发生。

你可以送3笔FIFO里面,不取走资料。UART TIMEOUT会不会发生

使用特权

评论回复
6
lz13|  楼主 | 2020-9-2 11:20 | 只看该作者
没空试了,用了个最原始的办法,直接询空来计算超时。估计是调试模式时,接收不停止,会导致溢出错误,然后里面的逻辑就乱了。

使用特权

评论回复
7
lz13|  楼主 | 2020-9-2 17:37 | 只看该作者
今个有空,再次试了下读取TOUT_IF 这个标志,发现各种参数都试了,还是等不到这个标志,难道这个芯片硬件有问题吗

使用特权

评论回复
8
lz13|  楼主 | 2020-9-3 11:19 | 只看该作者
结贴,原来在IER里还有个超时定时器的开关位,阅读能力出问题了。
我就纳闷了,新唐的工程师,不会把这个位放到时间设定的寄存器里吗,空那么多,放到IER里这风马牛不相及的地方,也没出个功能描途里细讲一下。

使用特权

评论回复
9
真爱吴迪迪| | 2020-9-4 16:05 | 只看该作者
很棒,很赞,我认为这种比较好一些。能够很好的调试。希望国产的单片机越来越强大。

使用特权

评论回复
10
xuanhuanzi| | 2020-9-7 22:46 | 只看该作者
说明还有一些BUG。。。BSP里BUG确实有。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

48

帖子

0

粉丝