搜索
bottom↓
回复: 5

UART0串口接收时出现溢出错误,接收不到RXB0中数据,请帮忙分析

[复制链接]

出0入0汤圆

发表于 2012-4-8 14:37:24 | 显示全部楼层 |阅读模式
单片机是NEC的uPD78F0513,在调试UART0通信时有溢出错误,在未读取RXB0寄存器之前先读取ASIS0,指示帧错误(如果接收完成时未检测到停止位),然后再读取RXB0寄存器,但是读出来的始终是00,我不知道是没有读出来,还是其它的什么原因.
出现帧错误是什么原因,该怎样解决呢?
请帮忙分析指点下,谢谢~

出0入0汤圆

发表于 2012-4-9 08:54:54 | 显示全部楼层
我用过0511,代码也不贴不知道怎么给你分析,我把我的代码贴上给你参考吧
/*
**-----------------------------------------------------------------------------
**
**  Abstract:
**        This function initializes UART0.
**
**  Parameters:
**        None
**
**  Returns:
**        None
**
**-----------------------------------------------------------------------------
*/
void UART0_Init( void )
{
        RXE0 = 0;        /* uart0 receive disable */
        TXE0 = 0;
        SRMK0 = 1;        /* INTSR0 disable */
        SRIF0 = 0;        /* INTSR0 IF clear */

        BRGC0 = 0x80 | 0x1a;
        ASIM0 = 0x05;        //8bit none proi,1bit stop
        /* INTSR0 priority low */
        SRPR0 = 1;
        STPR0 = 1;
        /* RXD0 pin setting */
        PM1 |= 0x02;
        SRMK0 = 0;        /* INTSR0 enable */
        STMK0 = 0;
        POWER0 = 1;        /* uart0 enable */
        TXE0 = 1;        /* uart0 TX enable */
        RXE0 = 1;        /* uart0 receive enable */
}
接收中断,向一个循环缓冲填充数据,协议分析里只读缓冲区,读写指针碰头就认为缓冲区空,指针永远指向空单元。
#pragma vector=INTSR0_vect
__interrupt void UART0_ISR( void )
{
        unsigned char err_type;
        //error deal
        err_type = ASIS0;
        SRIF0=0;                //CLEAR THE INTERRUPT FLAG
        if( (err_type & 0x07 )!=0){                //don't check the usart error statute
                err_type=RXB0;        //if has error clear it
                return;
        }
        ucUART0buf[ucUART0wr]=RXB0;
        ucUART0wr++;
        ucUART0wr=ucUART0wr%16;
}
发射中断,采用阻塞方式发送,需要的话可以改成中断方式发
/**********************************************************************/
#pragma vector=INTST0_vect
__interrupt void UART0_ISR_tx( void )
{
        RF_TxD_OUT;
        bSlaveTxdEnd=1;
        return;
}
/**********************************************************************/
void Uart0Send(unsigned char val)
{
        TXS0=val;
        while(bSlaveTxdEnd==0);
        bSlaveTxdEnd=0;
}

出0入0汤圆

 楼主| 发表于 2012-4-9 15:50:01 | 显示全部楼层
本帖最后由 huojinqiu 于 2012-4-9 15:51 编辑
yangsen 发表于 2012-4-9 08:54
我用过0511,代码也不贴不知道怎么给你分析,我把我的代码贴上给你参考吧
/*
**-------------------------- ...


不好意思,下面是我的代码。

void UART0_Init( void )
{
        TXE0 = 0;        /* uart0 transmit disable */
        RXE0 = 0;        /* uart0 receive disable */
        STMK0 = 1;        /* INTST0 disable */
        SRMK0 = 1;        /* INTSR0 disable */
        STIF0 = 0;        /* INTST0 IF clear */
        SRIF0 = 0;        /* INTSR0 IF clear */
        BRGC0 = UART0_BASECLK_4 | UART0_BASECLK_DIVISION;
        ASIM0 = UART0_ASIM0_INITIALVALUE | UART0_DATA_LENGTH_8|UART0_STOP_BIT_1|UART0_PARITY_NONE;
        /* INTST0 priority low */
        STPR0 = 1;
        /* INTSR0 priority low */
        SRPR0 = 1;
        /* TXD0 pin setting */
        P1 |= 0x01;
        PM1 &= ~0x01;
        /* RXD0 pin setting */
        PM1 |= 0x02;
}
void UART0_Start( void )
{
        STMK0 = 0;        /* INTST0 enable */
        SRMK0 = 0;        /* INTSR0 enable */
        POWER0 = 1;        /* uart0 enable */
        TXE0 = 1;        /* uart0 transmit enable */
        RXE0 = 1;        /* uart0 receive enable */
}
void  main( void )
{   
                UART0_Init();
                UART0_Start();
        while (1)
        {
                ;
        }
}
__interrupt void MD_INTSR0( void )
{   
        err_type = ASIS0;
        rx_data = RXB0;
        if( err_type & 0x07 )
                {
                CALL_UART0_Error( err_type );
                return;
        }
                else CALL_UART0_Receive( );
}

单片机发送数据能够用串口调试助手接收到,所以没有贴出发送部分的程序代码;
有两种可能会进入INTSR0,第一种是UART0接收结束,第二种是产生接收错误;通过测试,我没有给单片机发送数据的前提下,程序运行后即进入INTSR0,那么就可能是由于产生接收错误而使程序进入INTSR0,并通过进一步测试产生的接收错误是帧错误(如果接收完成时未检测到停止位),我现在就是不知道为什么会产生帧错误,该从哪找到出现这个错误的原因?
请帮帮!

出0入0汤圆

发表于 2012-4-17 13:40:32 | 显示全部楼层
我也贴下我的代码,0511上机通过测试。
void UART6_Init( void )
{
        TXE6 = 0;        /* uart6 transmit disable */
        RXE6 = 0;        /* uart6 receive disable */
        STMK6 = 1;        /* INTST6 disable */
        SRMK6 = 1;        /* INTSR6 disable */
        STIF6 = 0;        /* INTST6 IF clear */
        SRIF6 = 0;        /* INTSR6 IF clear */
        
       
        ASIM6 = 0x05;//数据位8位,停止位1位
        CKSR6 = 3;  //2的3次方
        BRGC6 = 78;//波特率=(12M/8)/(2*78)=9615.38
        /* INTST0 priority low */
        STPR6 = 1;
        /* TXD0 pin setting */
        P1 |= 0x08;
        PM1 &= ~0x08;
        /* RXD6 pin setting */
        PM1 |= 0x10;
        
        
        STMK6 = 0;        /* INTST6 enable */
        SRMK6 = 0;        /* INTSR6 enable */
        POWER6 = 1;        /* uart6 enable */
        TXE6 = 1;        /* uart6 transmit enable */
        //RXE6 = 1;        /* uart6 receive enable */
}
void uart6send(unsigned char *psend,unsigned char num)
{
        unsigned char i;
        STIF6 = 0;
        
        for(i=0;i<num;i++)
        {
                TXB6 = *(psend+i);
                while(STIF6==0);
                STIF6 = 0;
                NOP();NOP();NOP();NOP();
        }
        delay3(1);
   
}

void uart6receive( uchar* rxbuf, uchar rxnum )
{
        gUart0RxLen = rxnum;
        gpUart0RxAddress = rxbuf;
       
        if (gUart0RxLen > 0)
    {
                *gpUart0RxAddress = RXB6;
                gpUart0RxAddress++;
                gUart0RxLen--;
        }
}

出0入0汤圆

发表于 2012-4-19 09:03:23 | 显示全部楼层
楼上,楼主用的是UART0,我测试了,的确会有溢出错误,并且导致下一个字节不能接收,有1~3%的可能出现(我测试每次发2000字节,会丢10~30字节,不一定)。我原来的程序在收到帧不对时不会回应答,这样主机会重发若干次,这样就把这个问题掩盖掉了,实际上最坏情况会导致主机重发两次。昨天看了又看手册,实在想不明白这个问题怎么避免。不知道楼主解决了没有。不能的话只能靠协议保证可靠了。

出0入0汤圆

发表于 2012-4-19 16:15:28 | 显示全部楼层
yangsen 发表于 2012-4-19 09:03
楼上,楼主用的是UART0,我测试了,的确会有溢出错误,并且导致下一个字节不能接收,有1~3%的可能出现(我 ...

改下寄存器名字么,这段程序用在产品上到现在暂时还没出过问题,可以参考下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-1 12:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表