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,掩码,所有位都不需要匹配。
浙公网安备 33010602011771号