cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F373CCT and CAN bus

serg2
Associate
Posted on July 07, 2016 at 19:24

Hello.

I have CAN bus with three devices USB2CAN Adapter and two Controllers with STM32F373CCT. When only Adapter and one Controller is connected to CAN bus everything is correctly working. But if I have connected second Controller to CAN bus in few minutes receiving message from CAN will be frozen at one of the Controllers. But if I have commented Error_Handler_CAN() in HAL_CAN_RxCpltCallback the transmitting will be continue normally work.

PS

Unfortunately reinitialisation of the CAN module in Error_Handler_CAN() don't froze receiving.

Receiving interrupt handler:

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* CanHandle)

{

if((hcan.pRxMsg->StdId == 0x480) && (NewDataFromCAN == 0))

{

BUF_Data[0] = hcan.pRxMsg->Data[0];

BUF_Data[1] = hcan.pRxMsg->Data[1];

BUF_Data[2] = hcan.pRxMsg->Data[2];

BUF_Data[3] = hcan.pRxMsg->Data[3];

BUF_Data[4] = hcan.pRxMsg->Data[4];

BUF_Data[5] = hcan.pRxMsg->Data[5];

BUF_Data[6] = hcan.pRxMsg->Data[6];

BUF_Data[7] = hcan.pRxMsg->Data[7];//hcan.pRxMsg->Data[6];

// HAL_CAN_Transmit(&hcan, 100);//100

NewDataFromCAN = 1;

}

if(Error_Code = HAL_CAN_Receive_IT(&hcan, CAN_FIFO0) != HAL_OK)

{

/* Reception Error */

Error_Handler_CAN();

}

}

The function

HAL_CAN_Receive_IT is returning error code 0x01

Initialising of the CAN module:

...

MX_CAN_Init();

...

CAN_FilterConfTypeDef canFilterConfig;

canFilterConfig.FilterNumber = 0;

canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

canFilterConfig.FilterIdHigh = 0x0000;

canFilterConfig.FilterIdLow = 0x0000;

canFilterConfig.FilterMaskIdHigh = 0x0000 <<

5

;

canFilterConfig.FilterMaskIdLow

=

0x0000

;

canFilterConfig.FilterFIFOAssignment

=

0

;

canFilterConfig.FilterActivation

=

ENABLE

;

canFilterConfig.BankNumber

=

1

;

HAL_CAN_ConfigFilter(&hcan, &canFilterConfig);

HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);

/*##Configure Transmission process #####################################*/

hcan.pTxMsg->StdId = (MB_number == 1) ? 0x400 : 0x401;//0x321;

hcan.pTxMsg->ExtId = 0x01;

hcan.pTxMsg->RTR = CAN_RTR_DATA;

hcan.pTxMsg->IDE = CAN_ID_STD;

hcan.pTxMsg->DLC = 8;

Error handler for CAN receiving:

void Error_Handler_CAN(void)

{

/* USER CODE BEGIN Error_Handler */

/* User can add his own implementation to report the HAL error return state */

SPI_Data[0] = 0xFF;

SPI_Data[1] = 0xFF;

HAL_CAN_DeInit(&hcan);

while(SPI_Data[0] != 0)

{

HAL_SPI_Transmit(&hspi2, ((uint8_t*)&SPI_Data[0]),1,1000);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET); // SPI strob

for(My_i=0; My_i<

10

; My_i++){__NOP();}

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);

SPI_Data[0] >>= 1;

SPI_Data[1] = Error_Code;

HAL_Delay(1500);

}

MX_CAN_Init();

My_CAN_FilterConf();

/* USER CODE END Error_Handler */

}

#stm32f373cct-can

1 REPLY 1
Amel NASRI
ST Employee
Posted on July 13, 2016 at 15:19

Hirozenko.serge,

I suggest you review the functionHAL_CAN_RxCpltCallback. You have to use ''CanHandle'' there (instead of hcan). Then, the check of HAL_CAN_Receive_IT is wrongly written. Please refer to the exampleSTM32Cube_FW_F3_V1.5.0\Projects\STM32373C_EVAL\Examples\CAN\CAN_Networking. You find there an implementation similar to what you need:

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();
}
}

-Mayla-

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.