[技术问答] 赛元7250M 的UART通信,官方能给个正确的DEMO程序吗

[复制链接]
394|8
 楼主 | 2019-9-6 16:29 | 显示全部楼层 |阅读模式
本帖最后由 tanik 于 2019-9-9 09:52 编辑

这个是赛元官方的DEMO程序,复制到keil,编译后烧录到7250M中,然后用串口助手进行收发,数据不正确
bit flag;
bit RI_FLAG=0;

void IOinit(void )
{        
        P1CON |=0X08;             //P13设置为输出        
        P1CON &=0XFB;             //P12设置为输入        
        P1PH  &=0XF7;           //P13上拉电阻关闭
        P1PH  |=0X04;           //P12上拉电阻打开
        P13=1;
        P12=1;
}

void init_uart_mode1(void)
{
   SCON=0X50;   //方式1,允许接收数据
   PCON |=0X80; //方式1
   T2CON=0x00;  //使用定时器1作UART时钟
   TMOD=0X20;   //定时器1  8位自动重载
   TMCON=0X02;  //定时器1  4分频
   TL1=217;               
   TH1=217;                //UART 波特率9600;
   TR1=0;
   ET1=1;
   TR1=1;
   EUART=1;
}

void timer1()interrupt 3                //Timer1向量号 3
{
}

unsigned char i;
void uart()interrupt 4
{        
        if(TI)
        {
                TI=0;                           //中断进来要把TI清0
        }
        if(RI)                                   //接收中断
        {
                RI=0;                           //中断进来要把RI清0        
                i=SBUF;                          //把SBUF 数据赋值给i        
                RI_FLAG=1;
                flag=1;                        //收完一帧数据时则进行发送
        }
}

void main()
{
//        WDTCON  = 0x10;                                //清看门狗,500ms溢出
        EA=1;                       //开总中断;
        IOinit();
        init_uart_mode1();
        P21PM;
        P26PM;
        P27PM;
    P1CON = 0XFF;
        led2 = 1;
        while(1)
        {
        WDTCON |= 0x10;                        //清看门狗               
                if(RI_FLAG)                            //接收中断
                {
                        RI_FLAG=0;
                        i=SBUF;                        //把SBUF 数据赋值给i               
                        flag=1;                        //收完一帧数据时则进行发送
                }        

                if(flag==1)
                {
                        EUART=0;                     //发送数据之前要把串口中断关掉
                        flag=0;                             //让接收下一数据时置1
                        SBUF=i;                      //把i数据发送到SBUF中
                        while(!TI);                    //等待发送完成
                        EUART=1;                     //打开中断进行下一个数据的接收
                }
        }
}
请问各位大佬,啥原因?

QQ图片2.png
QQ图片.png

使用特权

评论回复
| 2019-9-6 17:37 | 显示全部楼层
TX、RX要设为输入带上拉

使用特权

评论回复
| 2019-9-6 17:51 | 显示全部楼层
另外程序中并没有分频

使用特权

评论回复
 楼主 | 2019-9-6 17:52 | 显示全部楼层
赛元MCU3 发表于 2019-9-6 17:37
TX、RX要设为输入带上拉

设置为:P12IH; P13IH;?

使用特权

评论回复
 楼主 | 2019-9-6 17:59 | 显示全部楼层
赛元MCU3 发表于 2019-9-6 17:51
另外程序中并没有分频

TMCON=0X02;  //定时器1  4分频

使用特权

评论回复
| 2019-9-6 18:53 | 显示全部楼层
tanik 发表于 2019-9-6 17:59
TMCON=0X02;  //定时器1  4分频

t1.png

使用特权

评论回复
 楼主 | 2019-9-8 16:32 | 显示全部楼层
这个是赛元发的资料中的DEMO原程序,未改一字。按照上面描述的问题,能给出一个正确的DEMO程序吗?

使用特权

评论回复
| 2019-9-9 11:30 | 显示全部楼层
tanik 发表于 2019-9-8 16:32
这个是赛元发的资料中的DEMO原程序,未改一字。按照上面描述的问题,能给出一个正确的DEMO程序吗? ...

/*****************************************************
*函数名称:void Uart0_Init(void)
*函数功能:Uart0中断初始化
*入口参数:void
*出口参数:void
*****************************************************/
void Uart0_Init(void)    //选择Timer2作为波特率信号发生器
{
        P1CON &= 0XF3;
        P1PH |= 0X0C;         //RX为带上拉输入;
       
        SCON  = 0X50;    //设置通信方式为模式一,允许接收
        PCON |= 0X80;
       
        TMCON |= 0X04;   //1T不分频
        T2MOD = 0X00;
        T2CON = 0X30;    //T2为波特率控制器
       
        RCAP2H = 0xFF;
        RCAP2L = 0xD9;  //9600波特率
       
        TR2 = 1;
        EUART = 1;     //开启Uart0中断
        EA = 1;
       
}

接收程序供参考

使用特权

评论回复
 楼主 | 2019-9-9 13:57 | 显示全部楼层
此部分烧录到7250M,编译后测试OK。 谢谢!

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表