中级会员
 
- 积分
- 205
- 金钱
- 205
- 注册时间
- 2026-1-29
- 在线时间
- 20 小时
|
问题原因分析
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)的干扰。 |
|