打印

多机通信谁做过?有个中断小问题请教!

[复制链接]
1629|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gang544043963|  楼主 | 2013-6-4 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从机第一次可以进入中断接收数据,第二次没有进入中断。经过测试,中断确实进入过一次。中断程序如下,求助

void ssio(void) interrupt 4                         //串行口中断函数,选择1组工作寄存器
{   

uchar a;
RI=0;
ES=0;                                               //准备接收
if(SBUF!=SLAVE){ES=1;goto reti;}                      //接收地址不是本机地址,则返回
SM2=0;                                                    //是本机地址,sm2清零,为接收数据命令做准备
SBUF=SLAVE;                                               //发应答地址给主机
while(TI!=1);TI=0;     
while(RI!=1);RI=0;                                      //接收主机送来的命令
if(RB8==1) {SM2=1;ES=1;goto reti;}                        //复位命令,从机复位返回
a=SBUF;          
//从机接收命令,则准备接收数据                                                  //不是复位命令,取出命令
if(a==0x01)                                             
    {  
    if(rrdy==1)                                           //判断从机是否接收就绪
        {SBUF=0X01;                                       //就绪,则发送接收就绪命令
         while(TI!=1);TI=0;
         sre();                                           //接收数据
            
        }
    else
       {SBUF=0X00;SM2=1;ES=1;goto reti;}                  //未就绪,则发送未就绪信号,返回
    }
//从机发送命令,则准备发送就绪
else
  {if(a==0x02)                                            
      {  
        if(trdy==1)                                        //判断从机是否发送就绪
         {SBUF=0X02;                                      //就绪,则发送发送就绪标志
          while(TI!=1);TI=0;
          str();
         }
      else
         {SBUF=0X00;SM2=1;ES=1;goto reti;}                //未就绪,则发送未就绪信号,返回
      }
   else                                                   //不是合法命令,则发ERR=1标志
      {SBUF=0x80;
      while(TI!=1);TI=0;
      SM2=1;ES=1;
      }
   }
   ES=1;        //开中断
   reti:;
}
void str(void)                                       //发送函数
{
trdy=0;
SBUF=0x01;
while(TI!=1);TI=0;
SM2=1;
ES=1;
}
void sre(void)                                    //接收函数
{
    rrdy=0;
    while(RI!=1);RI=0;
    receiv=SBUF;
    dis();                         //显示接收到的数据
    while(RI!=1);RI=0;

SM2=1;
ES=1;
}

相关帖子

沙发
gang544043963|  楼主 | 2013-6-4 20:11 | 只看该作者
我想的是,可能是中断设置问题,但一直没查出来

使用特权

评论回复
板凳
ayb_ice| | 2013-6-5 07:50 | 只看该作者
你这
中断中直接RI=0,不妥吧,而且中断里查询发送

这程序结构,一个字乱

使用特权

评论回复
地板
wh6ic| | 2013-6-5 09:05 | 只看该作者
reti: 这一行往上移一下就行,你前面关了中断,这个出口没开中断

使用特权

评论回复
5
歼飞2012| | 2013-6-15 12:32 | 只看该作者
跟着楼主头像来的 我是飞思卡尔新手

使用特权

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

本版积分规则

个人签名:初学者

11

主题

89

帖子

1

粉丝