本帖最后由 丁丁上路 于 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;
}
我看资料是需要清零接收中断标志及释放接收缓冲,这两个步骤都有,但还是不能退出中断。 |