关于8962的CAN中断

2019-03-24 13:04发布

请问各位。我的程序进入CAN中断后用CANIntStatus (CAN0_BASE, CANI_INT_STS_CAUSE) 去读,怎么总是返回“0”呢 ?看了很多 文档,不是说应该返回1-32或者0X800吗? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
benbending
1楼-- · 2019-03-24 20:43
对,应该先进入挂起中断。
ZHANGXUEJIE
2楼-- · 2019-03-24 23:46
 精彩回答 2  元偷偷看……
benbending
3楼-- · 2019-03-25 05:05
报文配置如何?
ZHANGXUEJIE
4楼-- · 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呢?
benbending
5楼-- · 2019-03-25 10:12
 精彩回答 2  元偷偷看……
ZHANGXUEJIE
6楼-- · 2019-03-25 10:28
谢谢!
另外,我把ulMsgIDMask=0X00000000改为ulMsgIDMask=0X1FFFFFF1了,ulMsgID=0x1F000001。为什么对发来的任意ID报文还能够发生中断呢?不是说经过报文虑波后对ID不符合的报文不与理睬吗?

一周热门 更多>

相关问题

    相关文章