[STM32F4] 无法在环回模式下退出STM32F429IGT的bxCAN睡眠模式

[复制链接]
SocialButterfly 发表于 2025-8-26 22:23 | 显示全部楼层 |阅读模式
当手动重置SLEEP位时,SLAK位不会重置。详情如下:

在尝试组建网络之前,我在环回模式下实现成功传输。但现在遇到了新问题。

在为外设设置环回模式并提供协调的位时序值(可能曾调整过但这些值现已恢复正常)后,我使用Cube生成代码。这意味着流程应首先退出睡眠模式,进入初始化模式,进行设置,退出初始化模式,然后开始正常模式。根据参考手册:

如果软件在bxCAN处于睡眠模式时通过设置INRQ位请求进入初始化模式,则必须同时清除SLEEP位。 清除SLEEP位后,一旦bxCAN与CAN总线同步,就会退出睡眠模式。当SLAK位被硬件清除后,睡眠模式即被退出。

并且为了同步,bxCAN会等待CAN总线空闲,这意味着在CANRX上监测到11个连续的隐性位。

根据数据位0编码为显性状态,而数据位1编码为隐性状态。

因此检查由Cube生成的代码,这正是正在发生的情况。我从stm32f4xx_hal_can.c中粘贴了关键部分如下:
HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan)
{
   [...]

  /* Exit from sleep mode */
   CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);

  /* Get tick */
   tickstart = HAL_GetTick();

  /* Check Sleep mode leave acknowledge */
   while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
  {
    if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
    {
      [...]
      /*Error*/
    }
  }

  /* Request initialisation */
  SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);

  /* Get tick */
  tickstart = HAL_GetTick();

  /* Wait initialisation acknowledge */
  while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)
  {
    if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
    {
      [...]
      /*Error*/
    }
  }
}


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

本版积分规则

43

主题

43

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部