2020-10-09 05:28 AM
Hi,
I am using NUCLEO-F302R8 EV-board.
I want to configure the CAN as:
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.