对于can通信过滤器的理解

以前没有接触过CAN通信,最近接触CAN通信,要调试F0芯片上的can通信,发送调试好了,接收总是只能接收固定id的数据,

这主要和过滤器有关,通过对过滤器的设置可以过滤特定的canid的数据,也可以接收任意canid的数据,具体设置方法如下:

  CAN_FilterTypeDef  sFilterConfig;
  sFilterConfig.FilterBank = 0; //过滤器0
  sFilterConfig.FilterMode =  CAN_FILTERMODE_IDLIST; //设为列表模式    
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//滤波器位宽为单个32位    
		
  sFilterConfig.FilterIdHigh = 0x0000;   //基本ID放入到STID中  
  sFilterConfig.FilterIdLow  = 0x0000;    		
  sFilterConfig.FilterMaskIdHigh = 0;//这里设置接收任意ID的CAN数据
  sFilterConfig.FilterMaskIdLow  = 0;//0表示接收来自发送端任意ID的数据 
  sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //接收到的报文放入到FIFO0中 
 
  sFilterConfig.FilterActivation = ENABLE; //激活过滤器
  sFilterConfig.SlaveStartFilterBank  = 0; 
  HAL_Status=HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);

使用过滤器0,当将FilterMode 设置为列表模式的时候,屏蔽寄存器FiterMask也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符FilterId相同, 所以列表模式下是过滤特定的ID模式,

如果将FilterMode设置为CAN_FILTERMODE_IDMASK模式,FilterMaskId设置为0时,表示不过滤,可以接收任意的canid数据,

当filterMaskId不为0时,则表示过滤 对应MaskID 为1的bit必须与FilterID中的bit位相同的canid才能接收过来。

比如filterid=0x10101010, maskid=0x0000ffff, 则只有id=0x xxxx 1010的数据才能接收,xxxx可以不用与filterid的高2字节相同,可以任意。

 

参考文章:http://blog.sina.com.cn/s/blog_8806edc50102wex0.html

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值