AnsweredAssumed Answered

STMF303 CAN Normal Mode

Question asked by MK.ShaSha on Dec 22, 2015
Latest reply on Dec 22, 2015 by peacock.jack.003

Hello!

I have already coded for CAN Loopback mode and it works.
However, when I changed the mode to CAN Normal Mode, I am unable to hit Receive Handler, but I can hit transmit Handler.

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_CAN_Init();

  CanTxMsgTypeDef TxMsg = {
  .StdId = 0x321,
.ExtId = 0x01,  
    .IDE = CAN_ID_STD,
    .RTR = CAN_RTR_DATA,
    .DLC = 1,
  };
  CanRxMsgTypeDef RxMsg;

  hcan.pTxMsg = &TxMsg;
  hcan.pRxMsg = &RxMsg;
 
   CAN_FilterConfTypeDef CAN_FilterConfig = {
    .BankNumber = 0,
    .FilterActivation = ENABLE,
    .FilterScale = CAN_FILTERSCALE_16BIT,
    .FilterMode = CAN_FILTERMODE_IDMASK,
    .FilterNumber = 0,
    .FilterFIFOAssignment = 0,
    .FilterMaskIdLow = (0x7FF << 5),
    .FilterMaskIdHigh = (0x400 << 5),
    .FilterIdLow = (CAN_ID << 5),
    .FilterIdHigh = (2047 << 5),
  };
    HAL_CAN_ConfigFilter(&hcan, &CAN_FilterConfig);

  HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);
 
 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET); //CAN initialisation over
 
  hcan.pTxMsg->Data[0]++;
HAL_CAN_Transmit_IT(&hcan); //transmit interrupt hits after this
 HAL_Delay(10);
 
  uint32_t i = 0;
  while((i < 0xFFF))
  {
    i++;
  }

  while (1)
  {
 
  }

}

void USB_LP_CAN_RX0_IRQHandler(void)
{

 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
  HAL_CAN_IRQHandler(&hcan);

}

 

void USB_HP_CAN_TX_IRQHandler(void)
{
 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
  HAL_CAN_IRQHandler(&hcan);
}

void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan)
{
   uint32_t timeout = 500;
  HAL_StatusTypeDef status;

  status = HAL_CAN_Receive_IT(hcan, CAN_FIFO0);
  if(HAL_OK != status){
    while(1);
  }
}

I have also put the following in HAL_CAN_MspInit function:
    HAL_NVIC_SetPriority(USB_LP_CAN_RX0_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USB_LP_CAN_RX0_IRQn);
  HAL_NVIC_SetPriority(USB_HP_CAN_TX_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(USB_HP_CAN_TX_IRQn);

Is it a sequencing issue? I am not sure why receive handler is not getting it (i.e. USB_LP_CAN_RX0_IRQHandler cannot be hit). Please help! Any help is appreciated! Thank you!

Outcomes