feat(canfd): 修复CAN发送问题。实现CANFD发送完成中断处理和通道健康检查

- 添加CANFD发送完成中断处理函数,确保只有MTFNERR置位时才计数发送成功
- 新增通道健康检查功能,防止病态通道被持续重发的测试帧反复推回BUS_OFF
- 重构CANFD配置结构体,添加TX中断配置项并修正GPIO映射设置
- 移除原有的软件发送队列机制,改为直接硬件发送模式
- 更新项目配置文件中的CANFD源文件路径命名

fix(canfd): 修复CANFD发送计数和错误处理逻辑

- 修正发送计数只在硬件MTFNERR确认后增加,而非请求进入邮箱时
- 改进错误日志输出,添加详细的错误类型和通道状态信息
- 优化总线恢复机制,通过收发器静默-唤醒协助硬件自动恢复
- 添加条件编译开关控制启动时自检和回环测试功能
This commit is contained in:
cbb
2026-07-11 17:52:05 +08:00
parent 3691cf2aba
commit 10989939e9
9 changed files with 361 additions and 265 deletions
+15 -7
View File
@@ -73,6 +73,12 @@ constexpr uint8_t CONFIG_SPI_APP_OTA_BOOT_ACK_ERROR = 0xE2U;
constexpr uint32_t CONFIG_SPI_READY_PORT = GPIOB;
/** @brief SPI Ready 握手输出引脚。 */
constexpr uint32_t CONFIG_SPI_READY_PIN = GPIO_PIN_6;
/** @brief ESP32 硬件复位控制端口(PC9 接 ESP32 EN/RESET)。 */
constexpr uint32_t CONFIG_ESP32_RESET_PORT = GPIOC;
/** @brief ESP32 硬件复位控制引脚。 */
constexpr uint32_t CONFIG_ESP32_RESET_PIN = GPIO_PIN_9;
/* ============================================================
* CAN-FD 位时序配置(三路 CAN0/CAN1/CAN2 共用)
* 时钟链: SYSCLK=180MHz → AHB=/1=180MHz(RCU_MODIFY_UP 强制)
@@ -108,6 +114,11 @@ constexpr uint32_t CONFIG_CAN_DATA_BS2 = CAN_BT_BS2_1TQ;
* @note 保留 #define:canfd.cpp 中用 #if 做编译期分支。 */
#define CONFIG_CAN_FD_BRS_ENABLE 1U
/** @brief 启动时向物理总线发送 classic/FD/BRS 探测帧;正常固件默认关闭。 */
#define CONFIG_CAN_STARTUP_BUS_TEST_ENABLE 0
/** @brief 启动时切换控制器到内部回环执行自检;正常固件默认关闭。 */
#define CONFIG_CAN_STARTUP_LOOPBACK_TEST_ENABLE 0
/** @brief CAN0 通道使能开关:true=启用初始化/收发/自测,false=完全禁用。 */
constexpr bool CONFIG_CAN_CH0_ENABLE = true;
/** @brief CAN1 通道使能开关。 */
@@ -121,11 +132,6 @@ constexpr uint32_t CONFIG_CAN_RX_FILTER_ID = CONFIG_CAN_STATUS_ID;
constexpr uint32_t CONFIG_CAN_RX_FILTER_MASK = 0x7FFU;
/** @brief 单次 CAN 接收解析任务最多消费的软件队列帧数。 */
constexpr uint32_t CONFIG_CAN_RX_PARSE_BUDGET = 48U;
/** @brief CAN 状态载荷中调试标识字符 0~3。 */
constexpr uint8_t CONFIG_CAN_STATUS_TAG0 = 0x43U;
constexpr uint8_t CONFIG_CAN_STATUS_TAG1 = 0x41U;
constexpr uint8_t CONFIG_CAN_STATUS_TAG2 = 0x4EU;
constexpr uint8_t CONFIG_CAN_STATUS_TAG3 = 0x46U;
/** @brief 用户调度定时器实例。 */
constexpr uint32_t CONFIG_SCHED_TIMER_INSTANCE = TIMER2;
@@ -151,8 +157,10 @@ constexpr uint32_t CONFIG_TASK_PERIOD_VREF_SAMPLE_TICKS = 5U;
constexpr uint32_t CONFIG_TASK_PERIOD_TEMP_SAMPLE_TICKS = 10U;
/** @brief 调度基准节拍:10ms 计数周期,单位 100us tick。 */
constexpr uint32_t CONFIG_TASK_PERIOD_CAN_RX_TICKS = 100U;
/** @brief 调度基准节拍:CAN 发送/状态灯周期,单位 100us tick。 */
constexpr uint32_t CONFIG_TASK_PERIOD_CAN_TX_TICKS = 1000U;
/** @brief 调度基准节拍:CAN 周期发送任务周期,10 tick = 1ms。 */
constexpr uint32_t CONFIG_TASK_PERIOD_CAN_TX_TICKS = 10U;
/** @brief 调度基准节拍:状态灯任务周期,1000 tick = 100ms。 */
constexpr uint32_t CONFIG_TASK_PERIOD_STATUS_LED_TICKS = 1000U;
/** @brief 调度基准节拍:心跳/诊断打印周期,单位 100us tick。 */
constexpr uint32_t CONFIG_TASK_PERIOD_HEARTBEAT_TICKS = 10000U;