eric2013 发表于 2023-10-24 08:29:50

STM32F4使用HAL库双CAN通信出现错误Wait initialisation acknowledge解决办法




准备给V5和V6板子板载的双CAN移植CANopen协议栈,发现板载的CAN1和CAN2连接后,CAN的初始化都过不去,直接卡死在这个里面了:

/* 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)
    {
      /* Update error code */
      hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;

      /* Change CAN state */
      hcan->State = HAL_CAN_STATE_ERROR;

      return HAL_ERROR;
    }
}

经过不断测试,发现要提前将CAN1和CAN2的引脚状态配置好才可以正常初始化:


/*
*********************************************************************************************************
*        函 数 名: HAL_CAN_MspInit
*        功能说明: 配置CAN gpio
*        形    参: hcan
*        返 回 值: 无
*********************************************************************************************************
*/
void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan)
{
        GPIO_InitTypeDef   GPIO_InitStruct;

        /*##-1- Enable peripherals and GPIO Clocks #################################*/
        /* CAN1 Periph clock enable */
        __HAL_RCC_CAN1_CLK_ENABLE();
        __HAL_RCC_CAN2_CLK_ENABLE();
        /* Enable GPIO clock ****************************************/
        CAN1_TX_GPIO_CLK_ENABLE();
        CAN1_RX_GPIO_CLK_ENABLE();

        /*##-2- Configure peripheral GPIO ##########################################*/
        /* CAN1 TX GPIO pin configuration */
        GPIO_InitStruct.Pin = CAN1_TX_PIN;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Alternate =CAN1_TX_AF;

        HAL_GPIO_Init(CAN1_TX_GPIO_PORT, &GPIO_InitStruct);

        /* CAN1 RX GPIO pin configuration */
        GPIO_InitStruct.Pin = CAN1_RX_PIN;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Alternate =CAN1_RX_AF;

        HAL_GPIO_Init(CAN1_RX_GPIO_PORT, &GPIO_InitStruct);

        /*##-3- Configure the NVIC #################################################*/
        /* NVIC configuration for CAN1 Reception complete interrupt */
        HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 1, 0);
        HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
       
        HAL_NVIC_SetPriority(CAN1_TX_IRQn, 1, 0);
        HAL_NVIC_EnableIRQ(CAN1_TX_IRQn);

        /*##-1- Enable peripherals and GPIO Clocks #################################*/
        /* CAN1 Periph clock enable */
        __HAL_RCC_CAN1_CLK_ENABLE();
        __HAL_RCC_CAN2_CLK_ENABLE();
        /* Enable GPIO clock ****************************************/
        CAN2_TX_GPIO_CLK_ENABLE();
        CAN2_RX_GPIO_CLK_ENABLE();

        /*##-2- Configure peripheral GPIO ##########################################*/
        /* CAN1 TX GPIO pin configuration */
        GPIO_InitStruct.Pin = CAN2_TX_PIN;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Alternate =CAN2_TX_AF;

        HAL_GPIO_Init(CAN2_TX_GPIO_PORT, &GPIO_InitStruct);

        /* CAN1 RX GPIO pin configuration */
        GPIO_InitStruct.Pin = CAN2_RX_PIN;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Alternate =CAN2_RX_AF;

        HAL_GPIO_Init(CAN2_RX_GPIO_PORT, &GPIO_InitStruct);

        /*##-3- Configure the NVIC #################################################*/
        /* NVIC configuration for CAN1 Reception complete interrupt */
        HAL_NVIC_SetPriority(CAN2_RX1_IRQn, 1, 0);
        HAL_NVIC_EnableIRQ(CAN2_RX1_IRQn);
       
        HAL_NVIC_SetPriority(CAN2_TX_IRQn, 1, 0);
        HAL_NVIC_EnableIRQ(CAN2_TX_IRQn);
}


页: [1]
查看完整版本: STM32F4使用HAL库双CAN通信出现错误Wait initialisation acknowledge解决办法