AnsweredAssumed Answered

STM32F103 CAN IT won't retrigger

Question asked by Bastien Clergue on Jun 5, 2018
Latest reply on Jun 5, 2018 by Bastien Clergue

Hello everyone, 

 

I am having a little issue with my STM32F103RBT6 code. I am trying to make the Receive CAN IT work.

The problem I am facing is that it is working for a small amount of time and then just stops (either it's because of the overflow I don't know how to deal with or because the IT just won't retrigger).

 

My code is looking like this : 

 

in main : 

 

int flag2 = 0;

 

 

while (1)
{

 

 

 

   if(!flag2) //  RECEIVE

   {

      HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);

      flag2 = 1;

   }

 

   


   for(cpt_for = 0; cpt_for<CAN_nb_trames_Rx_cc ; cpt_for++) // Receive test
   { // This is for me to see if the received messages are what I was expecting
      TxMessage.DLC = CAN_Tab_RxMessages[cpt_for].DLC;
      TxMessage.Data[0] = CAN_Tab_RxMessages[cpt_for].Data[0];
      TxMessage.Data[1] = CAN_Tab_RxMessages[cpt_for].Data[1];
      TxMessage.Data[2] = CAN_Tab_RxMessages[cpt_for].Data[2];
      TxMessage.Data[3] = CAN_Tab_RxMessages[cpt_for].Data[3];
      TxMessage.Data[4] = CAN_Tab_RxMessages[cpt_for].Data[4];
      TxMessage.Data[5] = CAN_Tab_RxMessages[cpt_for].Data[5];
      TxMessage.Data[6] = CAN_Tab_RxMessages[cpt_for].Data[6];
      TxMessage.Data[7] = CAN_Tab_RxMessages[cpt_for].Data[7];
      TxMessage.ExtId = CAN_Tab_RxMessages[cpt_for].ExtId;
      TxMessage.IDE = CAN_Tab_RxMessages[cpt_for].IDE;
      TxMessage.RTR = CAN_Tab_RxMessages[cpt_for].RTR;
      TxMessage.StdId = CAN_Tab_RxMessages[cpt_for].StdId;
      hcan.pTxMsg = &TxMessage;
      HAL_CAN_Transmit(&hcan, 100);
   }

}

 

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *hcan)

{
   CAN_Tab_RxMessages[hcan->pRxMsg->FMI]=*(hcan->pRxMsg);
   flag2 = 0;

}

 

 

 

 

When I compile and implement it, it works perfectly when I try to receive just one CAN frame. But if I try to receive 2 at the same time it will stop. By reducing the speed of the frames I try to receive (should be 1 every 10ms but I tried 1 every 1 second), it works. However, if I send these 2 frames (that I am supposed to receive) at the same time, my µC won't receive them anymore, and if I dive into the registers, I can see that the Receive interrupt is not active anymore (hence it is not in interrupt mode). In the end, when I tried to receive two frames that were coming at a higher speed (1 every 10 ms), the issue I was facing was that the overflow bit was set in the CAN register and I don't really know how to deal witht this issue either.

 

If you have any idea on how I can fix it !

 

 

 

 

In advance thanks !

 

 

PS : On a side note, I am also looking for a board with a STM32F4 on it (I'm interested in its 2 CAN) where the 2 CAN inputs/outputs are available (for example in the discovery board, one is connected to the USB, which doesn't suit me). So if anyone knows a board that could fit my needs !

Outcomes