硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1278|回复: 5
收起左侧

[有问必答] CAN 滤波器配置

[复制链接]

6

主题

7

回帖

25

积分

新手上路

积分
25
发表于 2024-7-15 14:46:46 | 显示全部楼层 |阅读模式
        我想配置CAN的滤波器,接口上只接收固定一个CANID的数据,我按照如下配置,然而并没有滤掉其他的CANid的数据,???
       FDCAN1_RXFilter.IdType = FDCAN_EXTENDED_ID;
        FDCAN1_RXFilter.FilterIndex = 1;//0
        FDCAN1_RXFilter.FilterType = FDCAN_FILTER_MASK;//FDCAN_FILTER_MASK
        FDCAN1_RXFilter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
        FDCAN1_RXFilter.FilterID1 = 0x1870E1B5;
        FDCAN1_RXFilter.FilterID2 = 0x1FFFFFFF;
        if(HAL_FDCAN_ConfigFilter(&hfdcan1, &FDCAN1_RXFilter)!=HAL_OK)
        {
                Error_Handler();
        }

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117513
QQ
发表于 2024-7-15 16:40:20 | 显示全部楼层
供参考,比如如果你想要接收EXTID为0x20000到0x27FFF的消息,你可以设置滤波器的高16位(FilterIdHigh)和低16位(FilterIdLow)来匹配这个范围。

[C] 纯文本查看 复制代码
CAN_FilterInitTypeDef CAN_FilterInitStructure;

// 16位滤波器配置
CAN_FilterInitStructure.CAN_FilterNumber = 0; // 选择滤波器编号
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; // 标识符屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit; // 16位滤波器

// 根据需要接收的EXTID范围设置ID和掩码
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x20000 << 5) >> 16; // EXTID[17:15]设置为'001'
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; // 其他位设置为0
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x07FFF << 5) >> 16; // 掩码设置为'0011111111111111'
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; // 其他位设置为0

CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; // 分配到FIFO 0
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; // 激活滤波器

CAN_FilterInit(&CAN_FilterInitStructure);
回复

使用道具 举报

6

主题

7

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2024-7-15 17:58:23 | 显示全部楼层
eric2013 发表于 2024-7-15 16:40
供参考,比如如果你想要接收EXTID为0x20000到0x27FFF的消息,你可以设置滤波器的高16位(FilterIdHigh)和 ...

谢谢,如果我只想接收固定CANID为0X1870E1B1,该配置什么模式呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117513
QQ
发表于 2024-7-15 18:06:32 | 显示全部楼层
zhangtingxcy 发表于 2024-7-15 17:58
谢谢,如果我只想接收固定CANID为0X1870E1B1,该配置什么模式呢?

使用标识符列表模式
回复

使用道具 举报

6

主题

7

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2024-7-15 18:14:34 | 显示全部楼层
eric2013 发表于 2024-7-15 18:06
使用标识符列表模式

G474中没有这个配置,只有这4个配置
  */
#define FDCAN_FILTER_RANGE         ((uint32_t)0x00000000U) /*!< Range filter from FilterID1 to FilterID2                        */
#define FDCAN_FILTER_DUAL          ((uint32_t)0x00000001U) /*!< Dual ID filter for FilterID1 or FilterID2                       */
#define FDCAN_FILTER_MASK          ((uint32_t)0x00000002U) /*!< Classic filter: FilterID1 = filter, FilterID2 = mask            */
#define FDCAN_FILTER_RANGE_NO_EIDM ((uint32_t)0x00000003U) /*!< Range filter from FilterID1 to FilterID2, EIDM mask not applied */
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117513
QQ
发表于 2024-7-16 08:57:40 | 显示全部楼层
zhangtingxcy 发表于 2024-7-15 18:14
G474中没有这个配置,只有这4个配置
  */
#define FDCAN_FILTER_RANGE         ((uint32_t)0x00000000U ...

你这个配置跟H7的CANFD一模一样,看这期视频,看完就全会了

BSP视频教程第26期:CAN/CANFD/CANopen专题,CANFD整个运行机制精讲,图文并茂,配合综合实战演练(2023-05-15)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=119189
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 09:10 , Processed in 0.040336 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表