发新帖我要提问
123
返回列表
打印
[应用相关]

STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法

[复制链接]
楼主: 東南博士
手机看帖
扫描二维码
随时随地手机跟帖
41
東南博士|  楼主 | 2018-9-17 14:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
16位宽掩码模式
如下图所示:



如上图所示,在16位宽的掩码模式下,CAN_FxR1的低16位是作为验证码,对应的16位屏蔽码为CAN_FxR1的高16位,同样的,CAN_FxR2的低16位是作为验证码,对应与CAN_FxR2的高16位为屏蔽码。于是,其示例代码如下:

使用特权

评论回复
42
東南博士|  楼主 | 2018-9-17 14:58 | 只看该作者
static void CANFilterConfig_Scale16_IdMask(void)
{
  CAN_FilterConfTypeDef  sFilterConfig;
  uint16_t StdIdArray1[10] ={0x7D1,0x7D2,0x7D3,0x7D4,0x7D5,        //定义第一组标准CAN ID
                          0x7D6,0x7D7,0x7D8,0x7D9,0x7DA};
  uint16_t StdIdArray2[10] ={0x751,0x752,0x753,0x754,0x755,        //定义第二组标准CAN ID
                          0x756,0x757,0x758,0x759,0x75A};
  uint16_t      mask,tmp,i,num;
  
  sFilterConfig.FilterNumber = 5;                                        //使用过滤器5
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;                        //配置为掩码模式
  sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;                //设为16位宽
  
  //配置第一个过滤对
  sFilterConfig.FilterIdLow =StdIdArray1[0]<<5;                        //设置第一个验证码
  mask =0x7ff;
  num =sizeof(StdIdArray1)/sizeof(StdIdArray1[0]);
  for(i =0; i<num; i++)                                                        //计算第一个屏蔽码
  {
    tmp =StdIdArray1[i] ^ (~StdIdArray1[0]);
    mask &=tmp;
  }
  sFilterConfig.FilterMaskIdLow =(mask<<5)|0x10;    //只接收数据帧
  
  //配置第二个过滤对
  sFilterConfig.FilterIdHigh = StdIdArray2[0]<<5;        //设置第二个验证码
  mask =0x7ff;
  num =sizeof(StdIdArray2)/sizeof(StdIdArray2[0]);
  for(i =0; i<num; i++)                                        //计算第二个屏蔽码
  {
    tmp =StdIdArray2[i] ^ (~StdIdArray2[0]);
    mask &=tmp;
  }
  sFilterConfig.FilterMaskIdHigh = (mask<<5)|0x10;  //只接收数据帧
  

  sFilterConfig.FilterFIFOAssignment = 0;                //通过的CAN 消息放入到FIFO0中
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.BankNumber = 14;
  
if(HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

使用特权

评论回复
43
東南博士|  楼主 | 2018-9-17 14:58 | 只看该作者
在实际的应用中,我们需要根据需求的实际情况来决定使用何种过滤配置,STM32F4的bxCAN提供了28个过滤器,在配置之前,我们需要先将那些需要通过的CANID进行整理,若数量少,则使用列表模式,精准,若只有标准CAN ID,则可以考虑使用16位宽模式,若需求中的CAN ID过多,则可以考虑使用多个过滤器,部分使用列表模式,部分使用掩码模式,CAN ID值相近的可以归纳成一组,使用掩码模式进行过滤。但使用掩码模式的同时,我们也需要意识到,也有可能部分不期望的CAN ID也会通过过滤器,掩码放得越宽,带进其他CAN ID的几率就越大,这点我们需要格外注意,视情况进行应用判断和处理。另外,对于相近的CAN ID,我们可以提前计算好屏蔽码,直接在代码中填入,而不是在代码中临时计算,这样可以提高软件效率,大家视情况而定。

使用特权

评论回复
44
看不清的天空| | 2018-12-13 12:08 | 只看该作者
楼主总结的真好,全面且细致,看手册确实有点迷糊,学习到了。
祝楼主工作顺利,身体健康,事事顺利!!!

使用特权

评论回复
45
東南博士|  楼主 | 2019-1-8 13:45 | 只看该作者
谢谢!
若需求中的CAN ID过多,则可以考虑使用多个过滤器
CAN 还是很有可能 代替更多的 串口应用的!

使用特权

评论回复
46
刺客儿| | 2020-7-31 14:23 | 只看该作者
好贴,看完了,收藏一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则