3427|9

337

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

关于8962的CAN中断 [复制链接]

请问各位。我的程序进入CAN中断后用CANIntStatus (CAN0_BASE, CANI_INT_STS_CAUSE) 去读,怎么总是返回“0”呢 ?看了很多 文档,不是说应该返回1-32或者0X800吗?

最新回复

是的。有时也感到悲凉。  详情 回复 发表于 2012-12-21 10:00

点评

对,应该先进入挂起中断。  详情 回复 发表于 2012-12-17 15:27
 
点赞 关注

回复
举报

101

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

回复 楼主 ZHANGXUEJIE 的帖子

对,应该先进入挂起中断。

点评

我的问题是它既然进入了中断,怎么会总返回\"0\".应该是1-32或者是0X8000啦  详情 回复 发表于 2012-12-18 00:01
 
 

回复

337

帖子

0

TA的资源

纯净的硅(初级)

板凳
 

回复 沙发 benbending 的帖子

我的问题是它既然进入了中断,怎么会总返回"0".应该是1-32或者是0X8000啦

点评

报文配置如何?  详情 回复 发表于 2012-12-18 12:20
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

4
 

回复 板凳 ZHANGXUEJIE 的帖子

报文配置如何?

点评

配置: tCANBitClkParms pClkParms1; //配置控制器为50K的操作速率,CAN系统时钟为8M,波特率是参照zlg的 pClkParms1.uSyncPropPhase1Seg=11; pClkParms1.uPhase2Seg=4; pClkParms1.uSJW=2; pClkParms1.  详情 回复 发表于 2012-12-18 15:45
 
 
 

回复

337

帖子

0

TA的资源

纯净的硅(初级)

5
 

回复 4楼 benbending 的帖子

配置:
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呢?

点评

返回值可以是16(即为0x10),原因是: 请注意can.h中的定义 #define CAN_STATUS_RXOK 0x00000010。 其实中断的写法的问题而已,有时可以直接配置接收中断和发送中断,不管报文号的。:) 个人看法,仅供  详情 回复 发表于 2012-12-19 10:37
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

6
 

回复 5楼 ZHANGXUEJIE 的帖子

返回值可以是16(即为0x10),原因是:
请注意can.h中的定义
#define CAN_STATUS_RXOK         0x00000010。
其实中断的写法的问题而已,有时可以直接配置接收中断和发送中断,不管报文号的。
个人看法,仅供参考。

点评

谢谢! 另外,我把ulMsgIDMask=0X00000000改为ulMsgIDMask=0X1FFFFFF1了,ulMsgID=0x1F000001。为什么对发来的任意ID报文还能够发生中断呢?不是说经过报文虑波后对ID不符合的报文不与理睬吗?  详情 回复 发表于 2012-12-19 11:19
 
 
 

回复

337

帖子

0

TA的资源

纯净的硅(初级)

7
 

回复 6楼 benbending 的帖子

谢谢!
另外,我把ulMsgIDMask=0X00000000改为ulMsgIDMask=0X1FFFFFF1了,ulMsgID=0x1F000001。为什么对发来的任意ID报文还能够发生中断呢?不是说经过报文虑波后对ID不符合的报文不与理睬吗?

点评

这个也不是很清楚,不好意思。不过,我调试的时候也跟你的情况一样,但我们不考虑这个暂时。  详情 回复 发表于 2012-12-20 09:15
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

8
 

回复 7楼 ZHANGXUEJIE 的帖子

这个也不是很清楚,不好意思。不过,我调试的时候也跟你的情况一样,但我们不考虑这个暂时。

点评

发现比较关键,有用的东西这里都不能够得到解释  详情 回复 发表于 2012-12-20 20:44
 
 
 

回复

337

帖子

0

TA的资源

纯净的硅(初级)

9
 

回复 8楼 benbending 的帖子

发现比较关键,有用的东西这里都不能够得到解释

点评

是的。有时也感到悲凉。:Cry:  详情 回复 发表于 2012-12-21 10:00
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(高级)

10
 

回复 9楼 ZHANGXUEJIE 的帖子

是的。有时也感到悲凉。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表