ST意法半导体
直播中

周臻庸

8年用户 910经验值
私信 关注
[问答]

使用STM32H7的FDCAN通讯,为什么CAN1会收到CAN2的帧ID,CAN2也会收到CAN1的?

使用STM32H7的FDCAN通讯,请问为什么CAN1会收到CAN2的帧ID,CAN2也会收到CAN1的?

回帖(2)

马丹丹

2025-3-15 16:38:01
上传帧ID的这部分程序应该没有问题,是外部影响吗?
举报

王璐

2025-3-21 17:54:50

在STM32H7中使用FDCAN时,CAN1和CAN2互相收到对方帧ID的问题通常由以下原因导致。请按以下步骤排查和解决:




1. 硬件连接问题




  • 总线交叉连接

    若CAN1和CAN2的物理线路(CAN_H/CAN_L)被错误连接到了同一总线,或存在短路,会导致两个控制器共享报文。

    解决:检查PCB或线缆,确保CAN1和CAN2的物理总线独立(除非设计需要共享总线)。




  • 终端电阻配置错误

    CAN总线两端需接120Ω终端电阻。如果多个节点未正确配置终端电阻,可能导致信号反射和报文冲突。

    解决:确保每条CAN总线(CAN1和CAN2)的两端各有一个120Ω电阻。






2. 软件配置问题




  • 过滤器(Filter)未正确设置

    每个FDCAN实例的过滤器如果未配置或配置为接收所有ID,会接收总线上所有报文。

    解决:  




    1. 为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);


    2. 启用过滤器并禁用默认接收:
      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的接收数据
         }
    }





3. 时钟或引脚配置错误




  • 时钟源配置错误

    确保CAN1和CAN2使用独立的时钟源或分频正确,避免因时钟干扰导致异常。
    解决:检查RCC配置,确认CAN1和CAN2的时钟源(如PLL1Q)和频率正确。




  • 引脚复用冲突

    若CAN1和CAN2的TX/RX引脚被错误复用到同一物理引脚,会导致信号串扰。

    解决:检查CubeMX或引脚配置表,确保CAN1和CAN2的TX/RX引脚独立且无冲突。






4. 总线其他节点干扰



  • 其他节点发送相同ID

    若总线上有其他节点发送了与CAN1/CAN2相同ID的报文,可能被误认为是对方发送的数据。

    解决:使用CAN分析仪抓取总线报文,确认ID来源。




5. 验证步骤




  1. 最小化测试

    断开CAN1和CAN2的物理连接,仅保留一个发送节点和一个接收节点,观察是否仍存在交叉接收。




  2. 过滤器全屏蔽测试

    将过滤器配置为屏蔽所有ID(如FilterID2 = 0x7FF),逐步放开过滤范围,定位问题ID。




  3. 寄存器检查

    通过调试器查看FDCAN寄存器(如FDCAN_RXF0SFDCAN_NDAT1等),确认接收报文的来源和过滤状态。






总结


问题通常源于硬件连接错误过滤器配置不当。优先检查物理线路和过滤器设置,再逐步排查软件逻辑和时钟配置。通过隔离测试和逐步启用功能,可快速定位问题根源。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分