OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 230|回复: 3

CAN总线从机如何管关掉接收广播功能

[复制链接]

1

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2020-4-16
在线时间
16 小时
发表于 5 天前 | 显示全部楼层 |阅读模式
1金钱
CAN总线从机我设置ID列表模式。但是发现能接受0000地址发送的东西。如何不接收0000地址发送的东西?列表模式本来只接收两个ID,0x19B和0x1BB。
sFilterConfig.FilterNumber = 0;                    /* 过滤器组0 */
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST;  /* 工作在列表模式 */
  sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT; /* 过滤器位宽为单个32位。*/
  /* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */

  sFilterConfig.FilterIdHigh         = 0x19B << 5;                                 /* 要过滤的ID高位 */
  sFilterConfig.FilterIdLow          = 0x1BB << 5; /* 要过滤的ID低位 */
  sFilterConfig.FilterMaskIdHigh     = 0;                        /* 过滤器高16位每位必须匹配 */
  sFilterConfig.FilterMaskIdLow      = 0;                        /* 过滤器低16位每位必须匹配 */
  sFilterConfig.FilterFIFOAssignment = 0;           /* 过滤器被关联到FIFO 0 */
  sFilterConfig.FilterActivation = ENABLE;          /* 使能过滤器 */
  sFilterConfig.BankNumber = 14;
  HAL_CAN_ConfigFilter(&hCAN, &sFilterConfig);

回复

使用道具 举报

0

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2026-1-29
在线时间
20 小时
发表于 5 天前 | 显示全部楼层
问题原因分析
ID移位错误
在STM32的CAN过滤器配置中,标准ID(11位)需左移3位对齐到寄存器的高11位。用户代码中使用<<5导致ID值计算错误,使得过滤器未能正确匹配目标ID。

BankNumber越界
若MCU的过滤器组总数不足14,设置BankNumber=14会导致配置失效,可能回退到默认模式(接收所有报文)。
解决方案
1. 修正ID移位位数
将FilterIdHigh和FilterIdLow的移位操作从<<5改为<<3:

            
sFilterConfig.FilterIdHigh  = (0x19B << 3);  // 正确移位:11位ID左移3位
sFilterConfig.FilterIdLow   = (0x1BB << 3);

      
2. 调整BankNumber为有效值
查阅MCU数据手册确认过滤器组数量(如14组对应编号0~13),将BankNumber设为有效值(如0):

      
sFilterConfig.BankNumber = 0;  // 根据实际硬件调整

      
3. 完整配置示例
  
sFilterConfig.FilterNumber = 0;               /* 过滤器组0 */
sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST; /* 列表模式 */
sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT; /* 16位位宽 */
sFilterConfig.FilterIdHigh  = (0x19B << 3);    /* 正确移位后的ID高位 */
sFilterConfig.FilterIdLow   = (0x1BB << 3);    /* 正确移位后的ID低位 */
sFilterConfig.FilterMaskIdHigh = 0;            /* 掩码全0(精确匹配) */
sFilterConfig.FilterMaskIdLow  = 0;
sFilterConfig.FilterFIFOAssignment = 0;        /* 关联到FIFO0 */
sFilterConfig.FilterActivation = ENABLE;       /* 使能过滤器 */
sFilterConfig.BankNumber = 0;                  /* 有效Bank号 */
if (HAL_CAN_ConfigFilter(&hCAN, &sFilterConfig) != HAL_OK) {
    // 初始化错误处理
}

      
4. 重启CAN控制器
配置完成后重新启动CAN外设以确保生效:

  
HAL_CAN_Start(&hCAN);

      
验证方法
使用CAN分析仪发送以下ID的报文:
0x000(应被过滤)
0x19B(应被接收)
0x1BB(应被接收)
其他ID(如0x200,应被过滤)
观察从机是否仅接收0x19B和0x1BB。
通过修正ID移位和BankNumber配置,可确保过滤器严格匹配目标ID,避免非法地址(如0x000)的干扰。
回复

使用道具 举报

1

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2020-4-16
在线时间
16 小时
 楼主| 发表于 5 天前 | 显示全部楼层
664929323 发表于 2026-4-27 14:23
问题原因分析
ID移位错误
在STM32的CAN过滤器配置中,标准ID(11位)需左移3位对齐到寄存器的高11位。用 ...

好像不是偶,移了3位,以后能接收的两个ID也接收不了了。但是还是能接收0000地址。我用的stm32f407
回复

使用道具 举报

17

主题

174

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1028
金钱
1028
注册时间
2014-4-7
在线时间
100 小时
发表于 前天 10:17 | 显示全部楼层
本帖最后由 亲亻尔嘴 于 2026-4-30 10:25 编辑

CAN_FMR寄存器的 CAN2SB位段 看下配置的对不对  14有没有给到相应的CAN模块


你左移了5bit 但是高16bit为0  所以 ID为0的也在列表中   就能收到ID为0的帧了

16bit的列表模式 CAN_FxR1和CAN_FxR2里一共定义了4个列表, 你这里把另外两个设置成了ID为0



在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-5-2 17:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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