无法在环回模式下退出STM32F429IGT上bxCAN的睡眠模式

无法在环回模式下退出STM32F429IGT上bxCAN的睡眠模式,stm32,can-bus,hal,stm32cubeide,Stm32,Can Bus,Hal,Stm32cubeide,简而言之,当睡眠位手动复位时,SLAK位不会复位。详情如下: 我正在尝试在创建网络之前,在环回模式下实现成功的传输。在阅读了大量文档之后,我曾经让它在某一点上工作过,但现在我有了一个新问题。(可悲的是,我不记得我改变了什么,也许是在玩计时游戏) 在将外围设备设置为环回并提供相干位定时值后(因此我可能已经使用了它们,但它们恢复正常),我使用Cube生成代码。这意味着流应该首先退出睡眠模式,进入初始化模式,进行设置,退出初始化模式,然后启动正常模式。根据参考手册: 如果软件在bxCAN运行时通过设置

简而言之,当睡眠位手动复位时,SLAK位不会复位。详情如下:

我正在尝试在创建网络之前,在环回模式下实现成功的传输。在阅读了大量文档之后,我曾经让它在某一点上工作过,但现在我有了一个新问题。(可悲的是,我不记得我改变了什么,也许是在玩计时游戏)

在将外围设备设置为环回并提供相干位定时值后(因此我可能已经使用了它们,但它们恢复正常),我使用Cube生成代码。这意味着流应该首先退出睡眠模式,进入初始化模式,进行设置,退出初始化模式,然后启动正常模式。根据参考手册:

如果软件在bxCAN运行时通过设置INRQ位请求进入初始化模式 睡眠模式,它还必须清除睡眠位。[…]清除睡眠位后,一旦bxCAN同步,睡眠模式即退出 使用CAN总线[…]。睡眠模式已退出 一旦硬件清除了SLAK位

要同步,bxCAN会等待CAN总线空闲,这意味着11 CANRX上已监测到连续隐性位

根据维基

0数据位编码显性状态,1数据位编码隐性状态

所以

检查多维数据集生成的代码这正是正在发生的事情。我在这里粘贴了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*/
    }
CAN_MSR的休眠位被重置,并等待硬件重置CAN_MSR的SLAK位。CAN_TIMEOUT_值设置为10,基本上为11个隐性位提供了适应时间

这就是我被困的地方。松弛不会重置。。。我试图删除
if((HAL\u GetTick()-tickstart)>CAN\u TIMEOUT\u VALUE)
,以便MCU无限期地等待SLAK重置。没有帮助

查看CAN_MSR RX寄存器,给出RX上的当前值,同时等待SLACK更改,我注意到它始终为0。因此,我尝试将GPIOs设置为RX和TX的上拉和下拉,但我认为这没有效果,因为在环回模式下,bxCAN的RX与GPIOs隔离:)这也意味着,问题不应该出现在硬件方面(比如布线和其他东西,外部的东西,而不是内部硬件)。这让我相信在全局HAL_Init()或MX_GPIO_Init()或其他东西的过程中出现了问题,但由于它是由多维数据集生成的,我没有更改任何内容,因此我不认为它会对SLAK不消失产生影响

我的想法可能是做一个软件重置,在一些事情上,但我不知道这条路会把我带到哪里,因为关闭电源和在芯片上都不能解决问题