lgs7

STM32H7的掩码过滤器FDCAN_FILTER_MASK的FilterID1和FilterID2解析

FDCAN下的掩码过滤器 (FDCAN_FILTER_MASK)

第一次写笔记,以方便自己理解的口头形式来表达,有错的请指出,欢迎互相交流学习

以扩展ID为例,标准ID也类似

FDCAN2_RXFilter.FilterType = FDCAN_FILTER_MASK;	// 掩码过滤器
FDCAN2_RXFilter.FilterID1 = 0x10262B27;  		// 要匹配的ID
FDCAN2_RXFilter.FilterID2 = 0x1FFFFFFF;  		// 掩码:所有29位都需要精确匹配

FilterID1(匹配ID)

​ 你的接收设备ID是什么,就直接写上去,例如DC-DC转换器的ID号是0x10262B27,则FilterID1 = 0x10262B27;又如锂电池的ID号是0x1410F41E,则FilterID1 = 0x1410F41E。

FilterID2(掩码)

掩码规则:

  • 掩码位 = 1:对应的ID位必须精确匹配
  • 掩码位 = 0:对应的ID位不关心(可以匹配0或1)

​ 如果掩码位是1,则对应要匹配的ID位就必须是一样的,例如当FilterID1 = 0x10262B27(即我们接收设备的ID号是0x10262B27),如果FilterID2 = 0x1FFFFFF0,那也就是说最后一位可以是任意数,也就是说我们可以接收到0x10262B2A,0x10262B21,0x10262B22,0x10262B26,0x10262B28等等为这些ID号设备的信息,当然也可以接收到匹配ID0x10262B27的信息。必须精确匹配 0x10262B2,最后一位可以是0~F的任何值。

扩展ID位分布: 29位 = 高25位(必须为10262B2) + 低4位(0~F)
要匹配的基础ID: 0x10262B27 = 0001 0000 0010 0110 0010 1011 0010 0111 (二进制)
掩码:          0x1FFFFFF0 = 0001 1111 1111 1111 1111 1111 1111 0000 (二进制)
                                                               ↑↑↑↑
                                                    		低4位不关心(0)

能接收的ID示例:

  • 0x10262B20 ✅
  • 0x10262B21 ✅
  • 0x10262B29 ✅
  • 0x10262B2F ✅
  • 0x10262B2B ✅

不能接收的ID示例:

  • 0x10262A20 ❌(第6字节B不匹配)
  • 0x10262C21 ❌(第6字节B不匹配)
  • 0x10272B29 ❌(第4字节6不匹配)

​ 又例如当FilterID1 = 0x10262B27(即我们接收设备的ID号是0x10262B27),如果FilterID2 = 0x1FFF0000,那也就是说最后四位可以是任意数,也就是说我们可以接收到和匹配ID后四位不一样的ID号设备,如0x10261A1A,0x10262A1A,等等为这些ID号设备的信息,当然也可以接收到匹配ID0x10262B27的信息。必须精确匹配 0x1026,最后一位可以是0000-FFFF的任何值。

扩展ID位分布: 29位 = 高13位(必须为1026) + 低16位(0000~FFFF)
要匹配的基础ID: 0x10260000 = 0001 0000 0010 0110 0000 0000 0000 0000
掩码:          0x1FFF0000 = 0001 1111 1111 1111 0000 0000 0000 0000
                                ↑↑↑↑ ↑↑↑↑ 			↑↑↑↑ ↑↑↑↑
                               高13位必须匹配   		低16位不关心

能接收的ID示例:

  • 0x10260000 ✅
  • 0x10260001 ✅
  • 0x1026ABCD ✅
  • 0x1026FFFF ✅
  • 0x10261234 ✅

不能接收的ID示例:

  • 0x10250000 ❌(高13位不匹配)
  • 0x10270000 ❌(高13位不匹配)
  • 0x10360000 ❌(高13位不匹配)

需要匹配多少个ID位就有多少位1

注意:8个字节是4位×8=32位,但是扩展ID是29位的,这里我方便描述,我直接统一写成字节形式,要知道这里第1个字节其实只有1位,因为后面7个字节共28位。

只接收一个ID

如果是只能接收一个ID号,FilterID1 = 要接收的ID号FilterID2 = 必须是0x1FFF FFFF

第8字节不匹配

第8字节可以是0~F任意值,FilterID1 = 要接收的ID号FilterID2 = 必须是0x1FFF FFF0

第7、8字节不匹配

第7、8字节可以是00~FF任意值,FilterID1 = 要接收的ID号FilterID2 = 必须是0x1FFF FF00

第6、7、8字节不匹配

第6、7、8字节可以是000~FFF任意值,FilterID1 = 要接收的ID号FilterID2 = 必须是0x1FFF F000

第5、6、7、8字节不匹配

第5、6、7、8字节可以是0000~FFFF任意值,FilterID1 = 要接收的ID号FilterID2 = 必须是0x1FFF 0000

第4、5、6、7、8字节不匹配

第4、5、6、7、8字节可以是0 0000~F FFFF任意值,FilterID1 = 要接收的ID号FilterID2 = 必须是0x1FF0 0000

第3、4、5、6、7、8字节不匹配

第3、4、5、6、7、8字节可以是00 0000~FF FFFF任意值,FilterID1 = 要接收的ID号FilterID2 = 必须是0x1F00 0000

第2、3、4、5、6、7、8字节不匹配

第2、3、4、5、6、7、8字节可以是000 0000~FFF FFFF任意值,FilterID1 = 要接收的ID号FilterID2 = 必须是0x1000 0000

第1、2、3、4、5、6、7、8字节不匹配(所有ID都可以接收)

第1、2、3、4、5、6、7、8字节可以是0000 0000~FFFF FFFF任意值,

FilterID1 = 0x0000 0000,要匹配的ID基准值为0;

FilterID2 = 必须是0x0000 0000,掩码,所有位都不需要匹配。

posted on 2025-12-01 11:00  林十五  阅读(0)  评论(0)    收藏  举报

导航