AnsweredAssumed Answered

HAL_CAN_Transmit timeout error

Question asked by armani.pejman on Nov 14, 2015
Latest reply on Dec 29, 2017 by David Pekin
Hello, I'm trying to communicate with a STM32f4x9 EVAL board and a STM32F429-Discovery board via CAN Bus,

I am using MCP2551 transceiver IC for Discovery board, I know that CAN1 is being used by LCD and CAN2 is used by USB OTG.
So I de-soldered the C53 (4k7 uf) capacitor of Discovery board (according to a video on YouTube),
I have tested everything, wirings, HAL configs for CAN, etc..

But I'm getting timeout when I call the HAL_CAN_Transmit function.
I am using pure STMCube examples (STM32F4x9_EVAL\Examples\CAN\CAN_Networking), I re-configured the same example for Discovery board, using CAN2 instead of CAN1.

Here is my wiring schematic:
CANBusSchematic.jpg


I did not touch the Eval example, but here is my code for Discovery board:

bool CANWorker::init_HAL_CAN()
{
    // Placed in MCP file:
    GPIO_InitTypeDef   GPIO_InitStruct;
 
    /*##-1- Enable peripherals and GPIO Clocks #################################*/
    /* CAN2 Periph clock enable */
    CANx_CLK_ENABLE();
    /* Enable GPIO clock ****************************************/
    CANx_GPIO_CLK_ENABLE();
 
    /*##-2- Configure peripheral GPIO ##########################################*/
    /* CAN2 TX GPIO pin configuration */
    GPIO_InitStruct.Pin = CANx_TX_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Alternate =  CANx_TX_AF;
 
    HAL_GPIO_Init(CANx_TX_GPIO_PORT, &GPIO_InitStruct);
 
    /* CAN2 RX GPIO pin configuration */
    GPIO_InitStruct.Pin = CANx_RX_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Alternate =  CANx_RX_AF;
 
    HAL_GPIO_Init(CANx_TX_GPIO_PORT, &GPIO_InitStruct);
 
    /*##-3- Configure the NVIC #################################################*/
    /* NVIC configuration for CAN2 Reception complete interrupt */
    HAL_NVIC_SetPriority(CANx_RX_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(CANx_RX_IRQn);
 
 
 
 
    CAN_FilterConfTypeDef sFilterConfig;
    static CanTxMsgTypeDef TxMessage;
    static CanRxMsgTypeDef RxMessage;
 
    /*##-1- Configure the CAN peripheral #######################################*/
    _canHandle.Instance = CAN2;
    _canHandle.pTxMsg = &TxMessage;
    _canHandle.pRxMsg = &RxMessage;
 
    _canHandle.Init.TTCM = DISABLE;
    _canHandle.Init.ABOM = DISABLE;
    _canHandle.Init.AWUM = DISABLE;
    _canHandle.Init.NART = DISABLE;
    _canHandle.Init.RFLM = DISABLE;
    _canHandle.Init.TXFP = DISABLE;
    _canHandle.Init.Mode = CAN_MODE_NORMAL;
    _canHandle.Init.SJW = CAN_SJW_1TQ;
    _canHandle.Init.BS1 = CAN_BS1_6TQ;
    _canHandle.Init.BS2 = CAN_BS2_8TQ;
    _canHandle.Init.Prescaler = 2;
 
    if(HAL_CAN_Init(&_canHandle) != HAL_OK)
    {
        /* Initialization Error */
        Error_Handler();
        return false;
    }
 
    /*##-2- Configure the CAN Filter ###########################################*/
    sFilterConfig.FilterNumber = 14;
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    sFilterConfig.FilterIdHigh = 0x0000;
    sFilterConfig.FilterIdLow = 0x0000;
    sFilterConfig.FilterMaskIdHigh = 0x0000;
    sFilterConfig.FilterMaskIdLow = 0x0000;
    sFilterConfig.FilterFIFOAssignment = 0;
    sFilterConfig.FilterActivation = ENABLE;
    sFilterConfig.BankNumber = 14;
 
    if(HAL_CAN_ConfigFilter(&_canHandle, &sFilterConfig) != HAL_OK)
    {
        /* Filter configuration Error */
        Error_Handler();
        return false;
    }
 
    /*##-3- Configure Transmission process #####################################*/
    _canHandle.pTxMsg->StdId = 0x321;
    _canHandle.pTxMsg->ExtId = 0x01;
    _canHandle.pTxMsg->RTR = CAN_RTR_DATA;
    _canHandle.pTxMsg->IDE = CAN_ID_STD;
    _canHandle.pTxMsg->DLC = 2;
 
    return true;
}

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* CanHandle)
{
    if ((CanHandle->pRxMsg->StdId == 0x321)&&(CanHandle->pRxMsg->IDE == CAN_ID_STD) && (CanHandle->pRxMsg->DLC == 2))
    {
        LED_Display(CanHandle->pRxMsg->Data[0]);
        ubKeyNumber = CanHandle->pRxMsg->Data[0];
    }
 
    /* Receive */
    if(HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0) != HAL_OK)
    {
        /* Reception Error */
        //Error_Handler();
    }
}

CANWorker::CANWorker ()
{
    init_HAL_CAN();
    BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO);
 
 
    /*##-2- Start the Reception process and enable reception interrupt #########*/
    if(HAL_CAN_Receive_IT(&_canHandle, CAN_FIFO0) != HAL_OK)
    {
        /* Reception Error */
        Error_Handler();
    }
 
    /* Infinite loop */
    while(1)
    {
        while(BSP_PB_GetState(BUTTON_KEY) == KEY_PRESSED)
        {
            if(ubKeyNumber == 0x4)
            {
                ubKeyNumber = 0x00;
            }
            else
            {
                LED_Display(++ubKeyNumber);
 
                /* Set the data to be transmitted */
                _canHandle.pTxMsg->Data[0] = ubKeyNumber;
                _canHandle.pTxMsg->Data[1] = 0xAD;
 
                /*##-3- Start the Transmission process ###############################*/
                if(HAL_CAN_Transmit(&_canHandle, 1000) != HAL_OK)
                {
                    /* Transmition Error */
                    Error_Handler();
                }
                HAL_Delay(10);
 
                while(BSP_PB_GetState(BUTTON_KEY) != KEY_NOT_PRESSED)
                {
                }
            }
        }
    }
}


But the "HAL_CAN_Transmit" returns timeout, waiting for TransmitMailbox to be sent  (Following codes are from : stm32f4xx_hal_can.c
/* Check End of transmission flag */
   while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox)))
   {
     /* Check for the Timeout */
     if(Timeout != HAL_MAX_DELAY)
     {
      if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
      {
        hcan->State = HAL_CAN_STATE_TIMEOUT;
        /* Process unlocked */
        __HAL_UNLOCK(hcan);
        return HAL_TIMEOUT;
       }
     }
   }


What am I doing wrong? It's not because I use a MCP2551 and the EVAL board is using HVD230 transceiver instead, right?

It seems that the other not does not ACK the sent frame, am I right? What causes this?

Outcomes