专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
关于8962的CAN中断
2019-03-24 13:04
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
4255
9
1511
请问各位。我的程序进入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呢?
加载中...
查看其它9个回答
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
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呢?
一周热门 更多>