关于CAN总线节点接收过滤码的问题

2019-03-24 13:09发布

在配置CAN报文对象时会有关于节点接收过滤的设置
g_MsgObject.ulMsgID
g_MsgObject.ulMsgIDMask
g_MsgObject.ulFlags

对于11位的id, 例如从0x3F8 到0x3FF, 设置IDMask为0x3F8就可以实现过滤接收0x3F8 到0x3FF的id
 
可是问题是如何设置ulMsgID和ulMsgIDMask使CAN控制器只接收一组29位的ulMsgID(例如只接收从0x0f800000 到 0x0f87ffff的id)?

我试过用0x1fffffff做IDMask, 还是不能成功接收。

请大家赐教啊!  谢谢



此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
永远的不知
1楼-- · 2019-03-24 15:19
可以这样理解,ID掩码相应的位为1的情况下,该位就会参与仲裁,否则不参与仲裁。也就是说,如果配置时报文对象的ID掩码为1的位,接收到的报文的ID就会和你配置的报文对象存储器的ID比较如果ID掩码设置为0则不会关心。根据这个原则来配置你的接收报文的报文对象存储器的属性,相信你很容易就配置成功了。
还有一点就是如果CAN接收到一个报文,如果没有计算好ID和掩码,你想用2#报文对象存储器接收一个报文,但是1#报文对象存储器也能验证通过,这样2#报文对象存储器就不会收到报文了。
Study_Stellaris
2楼-- · 2019-03-24 16:38
 精彩回答 2  元偷偷看……
tekkon
3楼-- · 2019-03-24 16:48
恩 工作模式基本上就是
if((incomingMsgID & MsgIDMask) ==  MsgID)
{
  接受这个MsgID
  中断服务函数
  。。。

}


有没有什么方式来准确的计算MsgIDMask?   按理说0x1FFFFFF应该工作, 可是接收不到。

后来发现对于29位的ID, 只用考虑CANIFMask2这个寄存器。我用了0x1FFF0000 可以收到。不知道对不对?

我需要配置6组(也就是6个报文对象)29位的MsgID ,除了用MsgIDMask,还有没有别的方式来实现单个报文对象多个MsgID?

觉得TI在CAN filter配置方面的资料很少。。。


Study_Stellaris
4楼-- · 2019-03-24 20:47
原帖由 tekkon 于 2011-11-11 11:11 发表
我需要配置6组(也就是6个报文对象)29位的MsgID ,除了用MsgIDMask,还有没有别的方式来实现单个报文对象多个MsgID?

这个具体怎么讲?
tekkon
5楼-- · 2019-03-25 01:20
 精彩回答 2  元偷偷看……
tekkon
6楼-- · 2019-03-25 04:51
恩  谢谢你们俩  MASK部分很明了了。。。  

“还有一点就是如果CAN接收到一个报文,如果没有计算好ID和掩码,你想用2#报文对象存储器接收一个报文,但是1#报文对象存储器也能验证通过,这样2#报文对象存储器就不会收到报文了。”  能不能再解释一下?

一周热门 更多>

相关问题

    相关文章