cancel
Showing results for 
Search instead for 
Did you mean: 

CAN ID/MASK Filter Setting

NASI
Senior

Hi,

I am using NUCLEO-F302R8 EV-board.

I want to configure the CAN as:

  • use all 3 transmit mailboxes with different mailbox ID
  • Filtering ID number for each mailbox
  • Receive three complete message for each FIFO with filter ID number

By following CAN setting, CAN IDs between 0x100 and 0x1FF is accepted.

 sFilterConfig.FilterBank = 0;

 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

 sFilterConfig.FilterIdHigh = 0x100 << 5; //11-bit ID in top bits;//

 sFilterConfig.FilterIdLow = 0x00;

 sFilterConfig.FilterMaskIdHigh = 0x700 << 5;//

 sFilterConfig.FilterMaskIdLow = 0x00;//

 sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;

 sFilterConfig.FilterActivation = ENABLE;

 sFilterConfig.SlaveStartFilterBank = 14;

I am able to get data when IDs are between 0x100 and 0x1FF in RFIFO0

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)

{

HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData);

}

My issue is, I can't transmit data from mailboxes1&2. Always mailbox0 is ready to send data.

Here is my CAN setting:

static void MX_CAN_Init(void)

{

hcan.Instance = CAN;

 hcan.Init.Prescaler = 2;

 hcan.Init.Mode = CAN_MODE_NORMAL;

 hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;

 hcan.Init.TimeSeg1 = CAN_BS1_13TQ;

 hcan.Init.TimeSeg2 = CAN_BS2_2TQ;

 hcan.Init.TimeTriggeredMode = DISABLE;

 hcan.Init.AutoBusOff = DISABLE;

 hcan.Init.AutoWakeUp = DISABLE;

 hcan.Init.AutoRetransmission = DISABLE;

 hcan.Init.ReceiveFifoLocked = DISABLE;

 hcan.Init.TransmitFifoPriority = DISABLE;

 if (HAL_CAN_Init(&hcan) != HAL_OK)

 {

  Error_Handler();

 }

 /* USER CODE BEGIN CAN_Init 2 */

 sFilterConfig.FilterBank = 0;

 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

 sFilterConfig.FilterIdHigh = 0x100 << 5;

 sFilterConfig.FilterIdLow = 0x00;

 sFilterConfig.FilterMaskIdHigh = 0x700 << 5;

 sFilterConfig.FilterMaskIdLow = 0x00;

 sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;//CAN_RX_FIFO0;

 sFilterConfig.FilterActivation = ENABLE;

 sFilterConfig.SlaveStartFilterBank = 14; //unnecessary

 if(HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)

 {/* Filter configuration Error */

 Error_Handler();

 }

 if(HAL_CAN_Start(&hcan) != HAL_OK)

 {

 Error_Handler();

 }

 if(HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)

 {

 Error_Handler();

 }

 if(HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO1_MSG_PENDING) != HAL_OK)

 {

 Error_Handler();

 }

 TxHeader0.DLC = 8;

 TxHeader0.ExtId = 0x00;

 TxHeader0.IDE = 0x400;

 TxHeader0.RTR = CAN_RTR_DATA;

 TxHeader0.StdId = 0x00;

 TxHeader0.TransmitGlobalTime = DISABLE;

 TxHeader1.DLC = 8;

 TxHeader1.ExtId = 0x00;

 TxHeader1.IDE = 0x300;

 TxHeader1.RTR = CAN_RTR_DATA;

 TxHeader1.StdId = 0x00;

 TxHeader1.TransmitGlobalTime = DISABLE;

 TxHeader2.DLC = 8;

 TxHeader2.ExtId = 0x00;

 TxHeader2.IDE = 0x100;

 TxHeader2.RTR = CAN_RTR_DATA;

 TxHeader2.StdId = 0x00;

 TxHeader2.TransmitGlobalTime = DISABLE;

 /* USER CODE END CAN_Init 2 */

}

And then:

while(1)

{

HAL_CAN_AddTxMessage(&hcan, &TxHeader0, TxData0, &TxMailbox0);

HAL_Delay(500);

HAL_CAN_AddTxMessage(&hcan, &TxHeader1, TxData1, &TxMailbox1);

HAL_Delay(500);

HAL_CAN_AddTxMessage(&hcan, &TxHeader2, TxData2, &TxMailbox2);

HAL_Delay(500);

}

Anyone have an idea?

Thank you.

0 REPLIES 0