导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→帮我看看并行通讯程序。。。。。。

* 90495: 帮我看看并行通讯程序。。。。。。

   bossren 
bossren发表的帖子 

 帮我看看并行通讯程序。。。。。。
我用三根信号线Ready_U4、RD、WR作为两片单片机的联络信号(当然数据线是直接相连的),主机首先检查Ready_U4信号线是否为低(即是否申请了发送数据),如果发现Ready_U4信号线为低,则认为从机申请了发送数据,即进入接收数据状态与从机进行通讯,否则置Ready_U4为低,向从机申请发送数据。从机也是这样使用Ready_U4信号线的。

当主机接收从机的数据时,首先置RD=0,并查询WR,当从机回复WR=0时意味着从机已经将数据送到端口线上了,于是主机从端口线上读数据,并置RD=1,从机判断主机回复的RD=1时即进入下一个数据的发送。

当主机向从机发送数据时,首先置Ready_U4为低电平表明有数据要发送,然后等待从机发送回复信号WR=0,收到回复信号后,将数据写入端口,并等待从机回复WR=1取走数据,并开始下一个数据的发送。

具体程序为:
主机部分:
while(1){
   Ready_U4 = 1;
   if(!Ready_U4)   //如果从机申请了发送数据,则接收数据
   {
      i=0;
      do{
         RD = 0;    //应答从机,通知从机准备好数据
         WR = 1;
         while(WR){}   //等待从机回复  
         P2 = 0xFF;
         data_buf[i] = P2;//取走数据
         i++;
         RD = 1;    //回复从机数据已经取走
         WR = 1;
         while(!WR){}   //等待从机应答
         Ready_U4 = 1;
      }while(Ready_U4 == 0); //如果从机还有数据发送则继续
      f_newdata = 1;  //接收到新数据标志  
   }
   else
   { //否则申请发送数据,将接收到的数据发送给仿真计算机
      if(f_newdata)   //将新接收到的数据发送给仿真计算机
      {
         f_newdata =0;
         Ready_U4 = 0; //表示数据准备好,等待仿真CPU查询并向仿真CPU发送数据
         for(i=0;i  <22;i++){
            WR = 1;  
            while(WR){};   //等待从机应答
            P2 = data_buf[i];//发送数据
            RD = 0;//通知从机数据可以取走了
            WR = 1;
            while(!WR){};//等待从机取走数据后的应答
            RD = 1;//准备发下一数据
         };
         Ready_U4 = 1;  //数据发完
      }
   }
}


从机部分:
while(1){
   if(seek_header == 3) //如果串行口接收完一组串行数据
   {
      seek_header = 0;
      frame_header = 0x00;
      N_send = 0;
      Ready_U4 = 1;//查询主机看看是否有发送数据请求
      if(Ready_U4)   //若无则请求发送数据
      {
         Ready_U4 = 0; //同时向主控CPU传送数据
         for(i=0;i  <22;i++){
            RD = 1;
            while(RD){};//等待主机回复
            P1 = Recv_buf[i]; //发送数据
            Recv_buf[i] = 0;   //清空接收数组
            WR = 0;
            RD = 1;
            while(!RD){};  //等待主机取走数据后的回复
            WR = 1;//继续下一数据的发送
         };
         Ready_U4 = 1;//数据发完
      }
   }
   Ready_U4  = 1;
   if(!Ready_U4)  //查询主控CPU是否有发送数据请求
   {
      i=0;//如有,则接收数据
      do{
         WR = 0;//回应准备好
         RD = 1;
         while(RD){;} //等待对方数据准备好握手信号
         P1 = 0xFF;
         Recv_buf[i] = P1; //接收数据
         i++;
         RD = 1;//回应数据已接收
         WR = 1;
         while(!RD){;}  //等待对方应答
         Ready_U4 = 1;
      }while(Ready_U4 == 0);//数据传送完则退出
   }
}


我现在的问题是:第一次循环时是正确的,可两个或者三个循环后就死了,程序死在从机的某一个地方(我的仿真器不支持keil C,只好写片后在系统板上运行,也不知道死在哪里了)。请高手指点迷津。这里想补充一句:从机里还运行着串行中断服务程序,谢谢!!!

发表时间:2006年3月22日21:07:35

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:求教:函数调用自身,编译时提示:递规没有返回值(附程序 )函数调用自身,编译时提示:递规没
[下一篇帖子]:救命啊救命啊~~~ 大虾们帮个忙啊