举报
在STM32H7中使用FDCAN时,CAN1和CAN2互相收到对方帧ID的问题通常由以下原因导致。请按以下步骤排查和解决:
总线交叉连接
若CAN1和CAN2的物理线路(CAN_H/CAN_L)被错误连接到了同一总线,或存在短路,会导致两个控制器共享报文。
解决:检查PCB或线缆,确保CAN1和CAN2的物理总线独立(除非设计需要共享总线)。
终端电阻配置错误
CAN总线两端需接120Ω终端电阻。如果多个节点未正确配置终端电阻,可能导致信号反射和报文冲突。
解决:确保每条CAN总线(CAN1和CAN2)的两端各有一个120Ω电阻。
过滤器(Filter)未正确设置
每个FDCAN实例的过滤器如果未配置或配置为接收所有ID,会接收总线上所有报文。
解决:
为CAN1和CAN2分别配置独立的过滤器范围。例如:
// CAN1的过滤器配置(仅接收ID=0x100~0x1FF)
FDCAN_FilterTypeDef filter;
filter.IdType = FDCAN_STANDARD_ID;
filter.FilterIndex = 0;
filter.FilterType = FDCAN_FILTER_MASK;
filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
filter.FilterID1 = 0x100; // 目标ID
filter.FilterID2 = 0x7F0; // 掩码(0x7F0表示匹配ID的低4位)
HAL_FDCAN_ConfigFilter(&hfdcan1, &filter);
// CAN2的过滤器配置(仅接收ID=0x200~0x2FF)
filter.FilterID1 = 0x200;
filter.FilterID2 = 0x7F0;
HAL_FDCAN_ConfigFilter(&hfdcan2, &filter);HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE);
HAL_FDCAN_ConfigGlobalFilter(&hfdcan2, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE);接收FIFO或缓冲区未正确关联
确保接收中断和处理函数区分CAN1和CAN2的FIFO。例如:
// 在中断处理中明确检查CAN实例
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) {
if (hfdcan->Instance == FDCAN1) {
// 处理CAN1的接收数据
} else if (hfdcan->Instance == FDCAN2) {
// 处理CAN2的接收数据
}
}时钟源配置错误
确保CAN1和CAN2使用独立的时钟源或分频正确,避免因时钟干扰导致异常。
解决:检查RCC配置,确认CAN1和CAN2的时钟源(如PLL1Q)和频率正确。
引脚复用冲突
若CAN1和CAN2的TX/RX引脚被错误复用到同一物理引脚,会导致信号串扰。
解决:检查CubeMX或引脚配置表,确保CAN1和CAN2的TX/RX引脚独立且无冲突。
最小化测试:
断开CAN1和CAN2的物理连接,仅保留一个发送节点和一个接收节点,观察是否仍存在交叉接收。
过滤器全屏蔽测试:
将过滤器配置为屏蔽所有ID(如FilterID2 = 0x7FF),逐步放开过滤范围,定位问题ID。
寄存器检查:
通过调试器查看FDCAN寄存器(如FDCAN_RXF0S、FDCAN_NDAT1等),确认接收报文的来源和过滤状态。
问题通常源于硬件连接错误或过滤器配置不当。优先检查物理线路和过滤器设置,再逐步排查软件逻辑和时钟配置。通过隔离测试和逐步启用功能,可快速定位问题根源。
举报
更多回帖