打印
[应用相关]

初始化不成功

[复制链接]
411|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AN, CAN, ST, HC, TI
用的CubeMx配置的CAN模块,自动生存的代码。发现代码在如下位置,过不去,求助。

HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan)
{
  uint32_t status = CAN_INITSTATUS_FAILED;  /* Default init status */
  uint32_t tickstart = 0U;

  /* Check CAN handle */
  if(hcan == NULL)
  {
     return HAL_ERROR;
  }

  /* Check the parameters */
  assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TTCM));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.ABOM));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AWUM));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.NART));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.RFLM));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TXFP));
  assert_param(IS_CAN_MODE(hcan->Init.Mode));
  assert_param(IS_CAN_SJW(hcan->Init.SJW));
  assert_param(IS_CAN_BS1(hcan->Init.BS1));
  assert_param(IS_CAN_BS2(hcan->Init.BS2));
  assert_param(IS_CAN_PRESCALER(hcan->Init.Prescaler));

  if(hcan->State == HAL_CAN_STATE_RESET)
  {
    /* Allocate lock resource and initialize it */
    hcan->Lock = HAL_UNLOCKED;
    /* Init the low level hardware */
    HAL_CAN_MspInit(hcan);
  }

  /* Initialize the CAN state*/
  hcan->State = HAL_CAN_STATE_BUSY;

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

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

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

  /* Wait the acknowledge */
  while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
  {代码一直在这里执行,跳不出去。感觉是硬件没应答,在其他帖子中有看到说是电源不稳,会造成这种情况,我测了电源,确认电源没问题。不知道还有其他什么情况会导致这样。。。
    if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
    {
      hcan->State= HAL_CAN_STATE_TIMEOUT;
      /* Process unlocked */
      __HAL_UNLOCK(hcan);
      return HAL_TIMEOUT;
    }
  }

  /* Check acknowledge */
  if (HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
  {
    /* Set the time triggered communication mode */
    if (hcan->Init.TTCM == ENABLE)
    {
      SET_BIT(hcan->Instance->MCR, CAN_MCR_TTCM);
    }
    else
    {
      CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TTCM);
    }

    /* Set the automatic bus-off management */
    if (hcan->Init.ABOM == ENABLE)
    {
      SET_BIT(hcan->Instance->MCR, CAN_MCR_ABOM);
    }
    else
    {
      CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_ABOM);
    }

    /* Set the automatic wake-up mode */
    if (hcan->Init.AWUM == ENABLE)
    {
      SET_BIT(hcan->Instance->MCR, CAN_MCR_AWUM);
    }
    else
    {
      CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_AWUM);
    }

    /* Set the no automatic retransmission */
    if (hcan->Init.NART == ENABLE)
    {
      SET_BIT(hcan->Instance->MCR, CAN_MCR_NART);
    }
    else
    {
      CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_NART);
    }

    /* Set the receive FIFO locked mode */
    if (hcan->Init.RFLM == ENABLE)
    {
      SET_BIT(hcan->Instance->MCR, CAN_MCR_RFLM);
    }
    else
    {
      CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_RFLM);
    }

    /* Set the transmit FIFO priority */
    if (hcan->Init.TXFP == ENABLE)
    {
      SET_BIT(hcan->Instance->MCR, CAN_MCR_TXFP);
    }
    else
    {
      CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TXFP);
    }

    /* Set the bit timing register */
    WRITE_REG(hcan->Instance->BTR, (uint32_t)(hcan->Init.Mode           |
                                              hcan->Init.SJW            |
                                              hcan->Init.BS1            |
                                              hcan->Init.BS2            |
                                              (hcan->Init.Prescaler - 1U) ));

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

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

    /* Wait the acknowledge */
    while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
    {
      if((HAL_GetTick()-tickstart) > CAN_TIMEOUT_VALUE)
      {
         hcan->State= HAL_CAN_STATE_TIMEOUT;

       /* Process unlocked */
       __HAL_UNLOCK(hcan);

       return HAL_TIMEOUT;
      }
    }

    /* Check acknowledged */
    if(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
    {
      status = CAN_INITSTATUS_SUCCESS;
    }
  }

  if(status == CAN_INITSTATUS_SUCCESS)
  {
    /* Set CAN error code to none */
    hcan->ErrorCode = HAL_CAN_ERROR_NONE;

    /* Initialize the CAN state */
    hcan->State = HAL_CAN_STATE_READY;

    /* Return function status */
    return HAL_OK;
  }
  else
  {
    /* Initialize the CAN state */
    hcan->State = HAL_CAN_STATE_ERROR;

    /* Return function status */
    return HAL_ERROR;
  }
}

使用特权

评论回复
沙发
chenjunt|  楼主 | 2020-4-5 10:38 | 只看该作者
补充下:端口的配置:
void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(canHandle->Instance==CAN)
  {
  /* USER CODE BEGIN CAN_MspInit 0 */

  /* USER CODE END CAN_MspInit 0 */
    /* CAN clock enable */
    __HAL_RCC_CAN1_CLK_ENABLE();

    /**CAN GPIO Configuration   
    PA11     ------> CAN_RX
    PA12     ------> CAN_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_CAN;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN CAN_MspInit 1 */

  /* USER CODE END CAN_MspInit 1 */
  }
}

使用特权

评论回复
板凳
chenjunt|  楼主 | 2020-4-5 10:43 | 只看该作者

使用特权

评论回复
地板
pengf| | 2020-4-5 10:46 | 只看该作者
先测试下CAN的回环,通的话在机对机发送

使用特权

评论回复
5
houcs| | 2020-4-5 10:49 | 只看该作者
也可以使用CAN分析仪来检测,看下报文

使用特权

评论回复
6
yinxiangh| | 2020-4-5 10:54 | 只看该作者

我也遇到过这个问题 后来发现是晶振没有起振

使用特权

评论回复
7
kangzj| | 2020-4-5 10:58 | 只看该作者
楼主的问题解决了么?我也遇到一样的问题,用的是STM32F413的芯片

使用特权

评论回复
8
chenjunt|  楼主 | 2020-4-5 11:02 | 只看该作者

好的,我明天去单位试一下,多谢各位大侠了哈        

使用特权

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

本版积分规则

718

主题

7868

帖子

5

粉丝