CAN滤波器的疑问

[复制链接]
3189|5
 楼主| motor666 发表于 2012-5-23 09:31 | 显示全部楼层 |阅读模式
把CAN滤波器设置成屏蔽位模式 ,为什么还要设置CAN_FilterIdHigh和CAN_FilterIdLow两个参数,这两个参数是在标识符列表模式时起作用的吧,下面的初始化程序去掉这两行行不行?
CAN_FilterInitStructure.CAN_FilterNumber=14;

CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;


CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;

  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;

CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;


CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;


CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;


CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;


CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;


CAN_FilterInit(&CAN_FilterInitStructure);
sjnh 发表于 2012-5-23 14:54 | 显示全部楼层
屏蔽位:只表示这个位起屏蔽作用, 至于这一位是高过滤还是低过滤需要Filter指定

例如:只要求接收ID15=1的信息,则CAN_FilterIdLow=0x8000; CAN_FilterMaskIdLow=0x8000;
例如:只要求接收ID15=0的信息,则CAN_FilterIdLow=0x0000; CAN_FilterMaskIdLow=0x8000;
 楼主| motor666 发表于 2012-5-23 23:17 | 显示全部楼层
如此说来,设定CAN_FilterIdLow=0x8000;应该就可以了,为什么还要设定: CAN_FilterMaskIdLow=0x8000;呢
sjnh 发表于 2012-5-24 08:08 | 显示全部楼层
上面我没讲明白,我只用8位表示,这样输入方便,依次类推29位ID码:
如果Filter=0xF0, Mask=0x00,那么可以收到0xF0-0xFF共16个ID的信息。
还是Filter=0xF0, Mask=0xFF,那么只能收到0xF0这一个ID信息。
还是Filter=0xF0, Mask=0xF8,那么可以收到0xF8-0xFF共8个ID的信息。
还是Filter=0xF0, Mask=0xFC,那么可以收到0xFC-0xFF共4个ID的信息。
也就是说,Mask对应位=1时,接收到的信息ID对应位必须=Filter的对应位才能确认处理
               Mask对应位=0时,Filter对应位=1时,接收到的信息ID对应位必须=1才能确认处理
                                          Filter对应位=0时,接收到的信息ID对应位=0,=1都能确认处理
airwill 发表于 2012-5-24 09:08 | 显示全部楼层
CAN 的过滤器有两组过滤方式, 说起来真的好长一段话呢.
不如仔细去看看 STM32 的 datasheet 上的说明, 那里说得很详细了
 楼主| motor666 发表于 2012-5-24 21:19 | 显示全部楼层
sjnh讲得很明白,我理解是这样:过滤器有Filter和Mask两个组成的,两个都要事先指定。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

426

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部