打印
[STM32F1]

STM32 HAL库下CAN丢帧问题经验分享

[复制链接]
1186|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 紫阳真人 于 2021-6-30 11:28 编辑

先说结论:CubeMX配置的自动重传功能,与生成的HAL库下的代码逻辑相反;
以下是问题分析过程:
在快速收发报文的情况下,STM32F103CBT6出现了发送失败的问题,本来应该是接收到0x7F0则返回0x7F1,接收到0x7F8则返回0x7F9。实际中,连续接收到0x7F0、0x7F8则只能返回0x7F1,丢失0x7F9,尝试增加接收buffer无效。下图是正常收发波形,可以看到7F9距离接收接收到的帧非常近:


下面我们增加发送数量到4帧,则接收不到0x7F9,疑似在第三帧与7F0仲裁失败,就发不出来了。

于是审查相关配置:
CubeMX里面是使能自动重发的:

生成相关代码中NART是使能的,这就有问题了,NART是no automatic retransmission,则与想要的结果正好相反:
void MX_CAN_Init(uint8_t baudrate)
{
  g_hcan.Instance = CAN1;
  g_hcan.Init.Prescaler = baudrate;/*12-BAUDRATE_250KBPS6-BAUDRATE_500KBPS*/
  g_hcan.Init.Mode = CAN_MODE_NORMAL;
  g_hcan.Init.SJW = CAN_SJW_1TQ;
  g_hcan.Init.BS1 = CAN_BS1_6TQ;
  g_hcan.Init.BS2 = CAN_BS2_5TQ;
  g_hcan.Init.TTCM = DISABLE;
  g_hcan.Init.ABOM = DISABLE;
  g_hcan.Init.AWUM = ENABLE;
  g_hcan.Init.NART = ENABLE;/*自动重发配置*/
  g_hcan.Init.RFLM = DISABLE;
  g_hcan.Init.TXFP = DISABLE;
  if (HAL_CAN_Init(&g_hcan) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}
以下代码在HAL_CAN_Init(CAN_HandleTypeDef* hcan)里:
/* Set the no automatic retransmission */
    if (hcan->Init.NART == ENABLE)
    {
      SET_BIT(tmp_mcr, CAN_MCR_NART);
    }
    else
    {
      CLEAR_BIT(tmp_mcr, CAN_MCR_NART);
    }
于是更改初始化配置g_hcan.Init.NART = ENABLE;为DISABLE,问题解决。

使用特权

评论回复
沙发
sadicy| | 2021-7-1 09:56 | 只看该作者
恩?可能楼主不说,我也理解错了这个使能

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:必须有所突破

76

主题

528

帖子

10

粉丝