Solved
[SOLVED] CAN callback never call
I'm working on an STM32L431 and I never be call on HAL_CAN_RxFifo0MsgPendingCallback. I have set a break point in this function but the debugger never stop on it.
In my program:
- I have generated the code using CubeMx and I set NVIC on CAN1: Tx, RX0, RX1 and SCE
- The cubeMx init is:
void MX_CAN1_Init(void)
{
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 5;
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_13TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
hcan1.Init.TimeTriggeredMode = DISABLE;
hcan1.Init.AutoBusOff = ENABLE;
hcan1.Init.AutoWakeUp = DISABLE;
hcan1.Init.AutoRetransmission = DISABLE;
hcan1.Init.ReceiveFifoLocked = DISABLE;
hcan1.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK)
{
Error_Handler();
}
}- I have disable CAN filters
- I already call HAL_CAN_ActivateNotification w/o any error returned:
(HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING)- Please see my CAN init:
void canDriver_init( ){
// First of all enable the CAN
HAL_GPIO_WritePin(EN_CAN_GPIO_Port, EN_CAN_Pin, GPIO_PIN_RESET);
CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterIdHigh = 0x320 << 5;
sFilterConfig.FilterIdLow = 0;
sFilterConfig.FilterMaskIdHigh = 0xFFF << 5;
sFilterConfig.FilterMaskIdLow = 0;
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
sFilterConfig.FilterBank = 0;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterActivation = DISABLE;
sFilterConfig.SlaveStartFilterBank = 14;
if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
{
/* Filter configuration Error */
Error_Handler();
}
/* Start the CAN peripheral */
if (HAL_CAN_Start(&hcan1) != HAL_OK)
{
/* Start Error */
Error_Handler();
}
/* Activate CAN RX notification */
if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) {
/* Notification Error */
Error_Handler();
}
TxHeader.StdId = 0x320; /* Specify the remote CAN node address */
TxHeader.ExtId = 0x01; /* Not used here */
TxHeader.RTR = CAN_RTR_DATA; /* Data Frame type (Data or Commands) */
TxHeader.IDE = CAN_ID_STD; /* Standard frame but not Extended */
TxHeader.DLC = 2; /* Number of data size in bytes (from 0 to 8)*/
TxHeader.TransmitGlobalTime = DISABLE;
}My test:
- Send frame using my code
=> I already receive it in my CAN analyzer
- I set a breakpoint in HAL_CAN_RxFifo0MsgPendingCallback()
- Using a CAN analyzer I send CAN frame
=> but those frame never be received by the STM32 (I already see the hardware signal on the medium using an oscilloscope)
Thanks for your help
Regards
