chenjunt 发表于 2022-4-13 20:56

初始化不成功

用的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 发表于 2022-4-13 20:58

补充下:端口的配置:
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 发表于 2022-4-13 21:00


zhaoxqi 发表于 2022-4-13 21:02

先测试下CAN的回环,通的话在机对机发送

jlyuan 发表于 2022-4-13 21:04

也可以使用CAN分析仪来检测,看下报文

llljh 发表于 2022-4-13 21:06

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

supernan 发表于 2022-4-13 21:08

楼主的问题解决了么?我也遇到一样的问题,用的是STM32F413的芯片

chenjunt 发表于 2022-4-13 21:10

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

koala889 发表于 2022-4-14 09:50

一般用软件配置的,问题不大,该是哪里没设置好
页: [1]
查看完整版本: 初始化不成功