硬汉嵌入式论坛

 找回密码
 立即注册
查看: 96|回复: 5
收起左侧

[CAN/FDCAN] FDCAN 打电切的时候进入bus-OFF,can卡死

[复制链接]

7

主题

11

回帖

32

积分

新手上路

积分
32
发表于 3 天前 | 显示全部楼层 |阅读模式
FDCAN2接了8M线 1Mbits ,5个从机。打电切的时候FDCAN2会进入bus-off。MCU其他CAN及功能正常运行。
myCanError =HAL FDCAN GetError(&hfdcan2);
myCanErrorstate = HAL FDCAN GetState(&hfdcan2);
调试得出myCanError = 204; //0x0204
#define HAL_FDCAN_ERROR_FIFO_FULL       ((uint32_t)0x00000200U)
  HAL_FDCAN_STATE_BUSY       = 0x02U, /*!< FDCAN process is ongoing              */
CAN总线通信没坏,但 MCU 没来得及取数据,导致接收队列满、状态卡在 BUSY。
MCU没有卡死,重启FDCAN倒是能继续正常工作,
初始化代码为CUBE IDE的默认的

static void MX_FDCAN2_Init(void)
{

  /* USER CODE BEGIN FDCAN2_Init 0 */

  /* USER CODE END FDCAN2_Init 0 */

  /* USER CODE BEGIN FDCAN2_Init 1 */

  /* USER CODE END FDCAN2_Init 1 */
  hfdcan2.Instance = FDCAN2;
  hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
  hfdcan2.Init.AutoRetransmission = DISABLE;
  hfdcan2.Init.TransmitPause = DISABLE;
  hfdcan2.Init.ProtocolException = DISABLE;
  hfdcan2.Init.NominalPrescaler = 8;
  hfdcan2.Init.NominalSyncJumpWidth = 1;
  hfdcan2.Init.NominalTimeSeg1 = 14;
  hfdcan2.Init.NominalTimeSeg2 = 5;
  hfdcan2.Init.DataPrescaler = 8;
  hfdcan2.Init.DataSyncJumpWidth = 1;
  hfdcan2.Init.DataTimeSeg1 = 14;
  hfdcan2.Init.DataTimeSeg2 = 5;
  hfdcan2.Init.StdFiltersNbr = 1;
  hfdcan2.Init.ExtFiltersNbr = 0;
  hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN FDCAN2_Init 2 */

  /* USER CODE END FDCAN2_Init 2 */

}
只用了FIFO中断0  中断1无法跳转。
// FIFO 0 接收中断       
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)//void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
        FDCAN_RxHeaderTypeDef RxHeader;
        uint8_t RxData[8] =        { 0 };
        struct CANCommandData command_data;
        BaseType_t pxHigherPriorityTaskWoken;
        if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
        {
                if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData)        != HAL_OK)
                {
                        //Error_Handler();
                        return;
                }

                if (hfdcan == &hfdcan1)               
                {
                        // 处理固定的id数据
                        if (RxHeader.Identifier == TABLE_ENCODER_RX_CAN_ID)
                        {       
                                if ((RxData[0] == ENCODER_HEADER)&& (RxData[1] == ENCODER_CMD_READ_TURNS))
                                {
................................








有无办法不重启FDCAN通过软件解决。增强稳定性。增大FIFO的大小?









回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 3 天前 | 显示全部楼层
复位CANFD是最好的解决办法。
回复

使用道具 举报

7

主题

11

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 3 天前 | 显示全部楼层
eric2013 发表于 2025-11-18 15:30
复位CANFD是最好的解决办法。

之前测试了出问题复位FDCAN是能解决,有没有不复位就能解决的思路方向?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 3 天前 | 显示全部楼层
沉思静学 发表于 2025-11-18 15:57
之前测试了出问题复位FDCAN是能解决,有没有不复位就能解决的思路方向?

没有发现更好的处理办法。
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 3 天前 | 显示全部楼层
进入bus off就等于设备离线,这时候最好的办法就是重启can,或者你可以开启bus off的自恢复,但是这个方法无法手动控制can的恢复,一般无法实现快慢恢复的逻辑,要实现快慢恢复的逻辑还是得重启can。
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 3 天前 | 显示全部楼层
提高canfd的稳定性可以试试增加第二采样点
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-11-21 22:26 , Processed in 0.042551 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表