KIMI: 根据您的描述和搜索结果,我分析这是典型的位时序和波特率切换(BRS)配置不匹配 问题。外部/内部环回模式能成功,因为它们不依赖真实的ACK应答,而正常模式需要严格的总线时序同步。 错误码分析 lasterrorcode = 5:仲裁阶段发生Bit0Error (发送'1'但回读为'0') datalasterrcode = 7:数据阶段NoChange (无新错误) 这表明仲裁阶段就出现ACK失败或总线冲突 ,数据阶段根本未执行。外部环回模式绕过了ACK检查,所以能正常工作 。 核心原因与解决方案 1. 主从设备波特率配置不一致 这是最常见的原因。虽然您提到"有变速",但很可能是: 主设备和从设备的BRS相关参数不匹配 仲裁阶段波特率相同,但数据阶段波特率差异大 检查清单: 比较主从设备的以下参数(需完全一致): NominalPrescaler, NominalSyncJumpWidth, NominalTimeSeg1, NominalTimeSeg2(仲裁阶段) DataPrescaler, DataSyncJumpWidth, DataTimeSeg1, DataTimeSeg2(数据阶段,CAN FD BRS模式) 建议先用FDCAN_FRAME_FD_NO_BRS 模式测试,排除BRS影响 2. 从设备ACK响应问题 正常模式下,发送方需要收到ACK才能认为成功。可能原因: 从设备过滤器配置错误 ,丢弃了主设备消息 从设备未正确启动 (未调用HAL_FDCAN_Start()) 从设备接收中断未使能 或接收FIFO未配置 验证方法: c复制 // 在从设备上配置宽松的过滤器接收所有消息 sFilterConfig.IdType = FDCAN_STANDARD_ID; sFilterConfig.FilterType = FDCAN_FILTER_RANGE; // 或FDCAN_FILTER_DISABLE sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig); 3. 总线物理层问题 虽然60Ω终端电阻正常,但需确认: CAN_H和CAN_L电压 :隐性时约2.5V,显性时CAN_H≈3.5V, CAN_L≈1.5V 是否存在短路或虚接 :环回模式可能掩盖接触不良 共地问题 :主从设备GND必须可靠连接 4. GPIO和时钟配置 根据STM32H723参考手册,检查: 引脚复用功能 :FDCAN_TX/RX是否配置为GPIO_AF9_FDCAN1 引脚速度 :必须设置为GPIO_SPEED_FREQ_VERY_HIGH FDCAN时钟源 :确保hfdcan1.Init.NominalPrescaler计算基于正确的时钟频率 调试步骤建议 简化测试 : 主从设备都配置为经典CAN模式 (FDCAN_FRAME_CLASSIC),波特率500kbps 确认经典CAN模式正常后,再切换到CAN FD模式 逐步排查 : 使用FDCAN_MODE_BUS_MONITORING 模式监控总线 读取PSR(Protocol Status Register)寄存器,查看LEC和DLEC详细状态 代码配置示例 : c复制 // 确保主从设备使用完全相同的配置 hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS; // 或先尝试FDCAN_FRAME_FD_NO_BRS hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; hfdcan1.Init.AutoRetransmission = ENABLE; // 必须使能自动重传 hfdcan1.Init.TransmitPause = DISABLE; hfdcan1.Init.ProtocolException = ENABLE; 总结 :问题根源在于正常模式需要真实的总线握手和时序匹配 。先统一主从配置,从经典CAN模式开始验证,再逐步启用CAN FD和BRS功能。
所在话题
参与活动
-
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16



