打印
[ZLG-ARM]

LPC2366 ucos ii 中CAN中断不能退出

[复制链接]
4050|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丁丁上路|  楼主 | 2011-3-17 22:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 丁丁上路 于 2011-3-17 22:10 编辑

在使用LPC2366,跑的是ucosii操作系统,用查询CAN接收正常,但用中断接收时,却不能退出中断服务程序,不知道是什么原因,大家帮我看看是哪里需要修改?

中断服务程序
void CANIntPrg(void)
{
       unsigned char j;
       unsigned int CAN32reg,mes;
       unsigned int regaddr;
       uint8 Data[20];
       for(j=0;j<2;j++)    //最大CAN通道数为2,分别检测两个通道的中断
      {
               regaddr = (unsigned long)(&CAN1ICR)+j*CANOFFSET; //  CAN1ICR
              CAN32reg=RGE(regaddr);
  
             if(((CAN32reg&(1<<0))!= 0)) //RI 接收中断
            {
                      CAN32reg &= ~(0x01);
                      RGE(regaddr) = CAN32reg;
   
            if(j==0)
            {
                       CANRCV(j, &MessageCAN0);                         //收到CAN0中断,接收帧
                      MessageDetailT.LEN=MessageCAN0.LEN;
                      MessageDetailT.FF=MessageCAN0.FF;
                      MessageDetailT.CANID=MessageCAN0.CANID;
                      MessageDetailT.DATAA=MessageCAN0.DATAA;   
                      MessageDetailT.DATAB=MessageCAN0.DATAB;

                     regaddr = (unsigned long)(&CAN1CMR)+j*CANOFFSET;   
                     mes=RGE(regaddr);
                     mes |= (1<<2);            //释放接收缓冲区
                     RGE(regaddr)=mes;
         }
   
         else if(j==1)
         {
                    CANRCV(j, &MessageCAN1);                         //收到CAN1中断,接收帧
                    MessageDetailT.LEN=MessageCAN1.LEN;
                    MessageDetailT.FF=MessageCAN1.FF;
                    MessageDetailT.CANID=MessageCAN1.CANID;
                    MessageDetailT.DATAA=MessageCAN1.DATAA;   
                    MessageDetailT.DATAB=MessageCAN1.DATAB;
                    regaddr = (unsigned long)(&CAN1CMR)+j*CANOFFSET;   
                    mes=RGE(regaddr);
                    mes |= (1<<2);            //释放接收缓冲区
                    RGE(regaddr)=mes;
         }
   

  }
  // 根据需要添加
  if((CAN32reg&(1<<1))!= 0) // TI1 第一发送缓冲区发送完成中断
  {
   CAN32reg &= ~(1<<1);
   RGE(regaddr) = CAN32reg;
  }
  
  if((CAN32reg&(1<<9))!= 0) // TI2 第二发送缓冲区发送完成中断
  {
   CAN32reg &= ~(1<<9);
   RGE(regaddr) = CAN32reg;
  }
  
  if((CAN32reg&(1<<10))!= 0) // TI3 第三发送缓冲区发送完成中断
  {
   CAN32reg &= ~(1<<10);
   RGE(regaddr) = CAN32reg;
  }
  if(((CAN32reg&(1<<7))!= 0) || ((CAN32reg&(1<<6))!= 0)) // BEI 总线错误中断
  {
   Enter_SWRst(j);
   regaddr = (unsigned long)(&CAN1GSR)+j*CANOFFSET;   
   mes=RGE(regaddr);
   mes &=0x00ff;            
   RGE(regaddr)=mes;     //总线错误清除处理
   Quit_SWRst(j);
  }
  if((CAN32reg&(1<<6))!= 0) // ALI 仲裁丢失中断
  {
   CAN32reg &= ~(1<<6);
   RGE(regaddr) = CAN32reg;
  }
  if((CAN32reg&(1<<3))!= 0)
  {
   //添加用户代码
   CAN32reg &= ~(1<<3);
   RGE(regaddr) = CAN32reg;
   
  }
  
}
VICVectAddr = 0;
}


我看资料是需要清零接收中断标志及释放接收缓冲,这两个步骤都有,但还是不能退出中断。

相关帖子

沙发
丁丁上路|  楼主 | 2011-3-17 22:09 | 只看该作者
仿真的时候,数据接收缓冲区能接收到正确的数据,当接收到数据时,接收中断能置位,而且当读出CAN接收缓冲区内数据和释放接收缓冲区时,中断标志也清零了。可就是不能退出中断,麻烦帮忙看看是哪里有问题?

谢谢

使用特权

评论回复
板凳
丁丁上路|  楼主 | 2011-3-17 22:12 | 只看该作者
仿真的时候还发现一个问题,就是执行

             regaddr = (unsigned long)(&CAN1CMR)+j*CANOFFSET;   
                    mes=RGE(regaddr);
                    mes |= (1<<2);            //释放接收缓冲区
             RGE(regaddr)=mes;
后,CAN1CMR和CAN2CMR寄存器的值依然是零,不知是仿真时看到的数据不对,还是我的操作有问题

使用特权

评论回复
地板
杜_U_ME| | 2011-7-29 18:29 | 只看该作者
是你的寄存器没有设置对

使用特权

评论回复
5
rulu| | 2011-8-1 13:07 | 只看该作者
我感觉仿真挺难的呢

使用特权

评论回复
6
rulu| | 2011-8-1 13:07 | 只看该作者
谁有关于仿真的资料呀 分享下吧 先谢谢了

使用特权

评论回复
7
6217996| | 2013-1-8 22:27 | 只看该作者
中断子程序名前面的 _irq 没有删除吧

使用特权

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

本版积分规则

25

主题

105

帖子

0

粉丝