lgs7

FDCAN的4种过滤器类型

FDCAN过滤器类型

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

1. FDCAN_FILTER_RANGE - 范围过滤器

这种过滤器定义一个ID范围,所有在这个范围内的标准ID或扩展ID都会被接收。

工作原理:

  • 配置一个起始ID和一个结束ID
  • 所有在 [起始ID, 结束ID] 范围内的消息都会被接收
// 配置接收ID从0x100到0x1FF的所有消息
filterConfig.IdType = FDCAN_STANDARD_ID;    // 标准ID
filterConfig.FilterIndex = 0;               // 过滤器索引
filterConfig.FilterType = FDCAN_FILTER_RANGE;
filterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
filterConfig.FilterID1 = 0x100;             // 起始ID
filterConfig.FilterID2 = 0x1FF;             // 结束ID

2. FDCAN_FILTER_DUAL - 双ID过滤器

一个过滤器槽可以匹配两个特定的ID。

工作原理:

  • 配置两个具体的ID
  • 只有完全匹配这两个ID之一的消息才会被接收
// 只接收ID为0x123和0x456的消息
filterConfig.FilterType = FDCAN_FILTER_DUAL;
filterConfig.FilterID1 = 0x123;             // 第一个ID
filterConfig.FilterID2 = 0x456;             // 第二个ID

3. FDCAN_FILTER_MASK - 掩码过滤器(最常用)

这是最灵活和常用的过滤器类型,类似于传统CAN的掩码模式。

工作原理

  • FilterID1 = 要匹配的ID(比较值)
  • FilterID2 = 掩码位(决定哪些位需要比较)
    • 1 = 必须匹配,该位必须匹配 FilterID1 的对应位
    • 0 = 不关心(任意值都可以)(可以是0或1)

标准ID的配置(11位)

配置规则:

  • 标准ID范围:0x000 ~ 0x7FF (11位)
  • FilterID1FilterID2 都使用11位
// 示例1:精确匹配单个ID 0x123
FilterID1 = 0x123;    // 要匹配的ID
FilterID2 = 0x7FF;    // 掩码:所有11位都必须匹配

// 示例2:匹配ID范围 0x120-0x12F(低4位任意)
FilterID1 = 0x120;    // 比较值
FilterID2 = 0x7F0;    // 掩码:高7位(12)必须匹配,低4位任意

// 示例3:匹配所有以0x10开头的ID(0x100-0x1FF)
FilterID1 = 0x100;    // 比较值  
FilterID2 = 0x700;    // 掩码:高3位(1)必须匹配,低8位任意

// 示例4:接收所有标准ID消息
FilterID1 = 0x000;    // 比较值(任意)
FilterID2 = 0x000;    // 掩码:所有位都不检查

怎么知道哪些是在匹配ID范围

标准ID结构: [高3位] [中间4位] [低4位]

先看FilterID2的取值,如果有全1的必须匹配(即高3为111,中间四位为1111,低4位为1111)

例如 0x7FF转换为二进制是 111 1111 1111(11位),很明显高3位,中间4位,低4位都是1,所以对应的FilterID1的高3位必须为001,中间四位必须为0010,低4位必须为0011,即0x123,只有一个匹配的ID(如果都要1则应该是按从左到右1-3递增,如果低四位不是1(如0x7F0),则是0x12x(后面的x表示任意数0-F),如果中间四位和低四位都不是1(如0x700),则是0x1xx(后面的x表示任意数0-F))

扩展ID的配置(29位)

配置规则:

  • 扩展ID范围:0x00000000 ~ 0x1FFFFFFF (29位)
  • FilterID1FilterID2 都使用29位
// 示例1:精确匹配单个扩展ID 0x12345678
FilterID1 = 0x12345678;    // 要匹配的扩展ID
FilterID2 = 0x1FFFFFFF;   // 掩码:所有29位都必须匹配

// 示例2:匹配扩展ID范围 0x1234000-0x1234FFF(低12位任意)
FilterID1 = 0x12340000;    // 比较值
FilterID2 = 0x1FFF0000;   // 掩码:高17位(1234)必须匹配,低12位任意

// 示例3:匹配所有以0x100开头的扩展ID
FilterID1 = 0x10000000;   // 比较值
FilterID2 = 0x1FF00000;   // 掩码:高9位(100)必须匹配,低20位任意

// 示例4:接收所有扩展ID消息
FilterID1 = 0x00000000;   // 比较值(任意)
FilterID2 = 0x00000000;   // 掩码:所有位都不检查

怎么知道哪些是在匹配ID范围(原理与标准ID类似)

具体看我另一个文章,链接:https://www.cnblogs.com/lgs7/p/19291993

4. FDCAN_FILTER_RANGE_NO_EIDM - 无EID掩码的范围过滤器

这是专门用于扩展ID的范围过滤器,忽略EIDM(扩展ID掩码)设置。

工作原理:

  • 类似于范围过滤器,但专门为扩展ID设计
  • 忽略EIDM寄存器的设置,使用完整的29位扩展ID进行比较
// 接收扩展ID从0x10000到0x1FFFF的所有消息
filterConfig.IdType = FDCAN_EXTENDED_ID;    // 扩展ID
filterConfig.FilterType = FDCAN_FILTER_RANGE_NO_EIDM;
filterConfig.FilterID1 = 0x10000;           // 起始扩展ID
filterConfig.FilterID2 = 0x1FFFF;           // 结束扩展ID

实际应用示例

FDCAN_FilterTypeDef filterConfig;

// 示例1:掩码过滤器 - 接收ID 0x100-0x103
filterConfig.FilterType = FDCAN_FILTER_MASK;
filterConfig.FilterIndex = 0;
filterConfig.FilterID1 = 0x100;             // 比较值
filterConfig.FilterID2 = 0x7FC;             // 掩码:匹配高9位,忽略低2位
                                            // 这样会匹配 0x100, 0x101, 0x102, 0x103

// 示例2:范围过滤器 - 接收ID 0x200-0x2FF
filterConfig.FilterType = FDCAN_FILTER_RANGE;
filterConfig.FilterID1 = 0x200;             // 起始ID
filterConfig.FilterID2 = 0x2FF;             // 结束ID

// 示例3:双ID过滤器 - 只接收0x123和0x456
filterConfig.FilterType = FDCAN_FILTER_DUAL;
filterConfig.FilterID1 = 0x123;
filterConfig.FilterID2 = 0x456;

// 配置过滤器
HAL_FDCAN_ConfigFilter(&hfdcan1, &filterConfig);
  • 精确匹配特定ID:使用 FDCAN_FILTER_DUAL
  • 匹配一组连续的ID:使用 FDCAN_FILTER_RANGE
  • 灵活的模式匹配:使用 FDCAN_FILTER_MASK(最常用)
  • 扩展ID的范围过滤:使用 FDCAN_FILTER_RANGE_NO_EIDM

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

导航