关于8962的CAN中断

2019-03-24 13:04发布

请问各位。我的程序进入CAN中断后用CANIntStatus (CAN0_BASE, CANI_INT_STS_CAUSE) 去读,怎么总是返回“0”呢 ?看了很多 文档,不是说应该返回1-32或者0X800吗? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
ZHANGXUEJIE
2019-03-25 06:21
配置:
tCANBitClkParms  pClkParms1;
//配置控制器为50K的操作速率,CAN系统时钟为8M,波特率是参照zlg的
pClkParms1.uSyncPropPhase1Seg=11;
pClkParms1.uPhase2Seg=4;
pClkParms1.uSJW=2;
pClkParms1.uQuantumPrescaler=10;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);//使能片内外设D端口
SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);//使能所选CAN控制器外设
GPIOPinTypeCAN(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);//设置所选GPIO端口的指定管脚为CAN功能

CANInit(CAN0_BASE);//初始化CAN控制器
CANBitTimingSet(CAN0_BASE,&pClkParms1);//配置控制器波特率
CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);//使能单独的CAN控制器中断源。
IntEnable(INT_CAN0);//使能一个片内外设的中断
CANEnable(CAN0_BASE);//使能CAN模块
zCANMsgObject1.ulMsgID=0x1F000001;
zCANMsgObject1.ulMsgIDMask=0X00000000;//接收任意ID的扩展帧
zCANMsgObject1.ulFlags=MSG_OBJ_EXTENDED_ID|MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_EXT_FILTER;  //仅使用扩展标识符,使能接收完成中断,使能基于扩展标识符的报文过滤
zCANMsgObject1.ulMsgLen=8;
zCANMsgObject1.pucMsgData=zCANMsg1data;
CANMessageSet(CAN0_BASE, 1, &zCANMsgObject1, MSG_OBJ_TYPE_RX);//完成接受报文设置

下面是接收中断:
void canISRHandler(void)
{tCANIntStsReg ZeIntStsReg;
unsigned long ZulStatus;
#if OS_CRITICAL_METHOD ==3
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
ZeIntStsReg=CAN_INT_STS_CAUSE;
OSIntNesting++;
OS_EXIT_CRITICAL();
for (;;)
{
   ZulStatus=CANIntStatus (CAN0_BASE, ZeIntStsReg);//获取中断寄存器 CANINT
   if (ZulStatus==0x0000)
      {break;}//处理完全部中断
   if(ZulStatus==CAN_INT_INTID_STATUS)//如果是状态中断
      {
        ZulStatus = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);//读主控制器状态
        if (ZulStatus==CAN_STATUS_BUS_OFF)
        {
          xx[0]=0x55;
          OSMboxPost(yx_off,&xx);//发总线关闭消息
         }
      }
   else if(ZulStatus==1)
      {
        CANMessageGet(CAN0_BASE,1,&zCANMsgObject1,0 );//接收报文1数据
        xx[0]=0x01;
        OSMboxPost(yx_rx,xx);//发收到报文1消息
      }
           
   CANIntClear(CAN0_BASE, 1);
}
OSIntExit();
}

现在的问题是,设置:zCANMsgObject1.ulMsgIDMask=0X00000000后,可以接收到报文,但是当执行ZulStatus=CANIntStatus (CAN0_BASE, ZeIntStsReg)后,返回的应该是个已经设置的有效报文编号。有时ZulStatus=1,这个应该是正确的,因为设置了报文1的;有时ZulStatus=16,显然这个数值不对,根本就没有数值过报文16.
请问大家怎么会返回16呢?

一周热门 更多>

相关问题

    相关文章