67 FDCAN_FilterTypeDef can_filter = {};
68 can_filter.IdType = FDCAN_STANDARD_ID;
69 can_filter.FilterType = FDCAN_FILTER_MASK;
70 can_filter.FilterID1 = 0x0000;
71 can_filter.FilterID2 = 0x0000;
74 if (id_ == STM32_FDCAN1)
76 can_filter.FilterConfig = FDCAN_RX_FIFO0;
77 can_filter.FilterIndex = 0;
79 else if (id_ == STM32_FDCAN2)
81 can_filter.FilterConfig = FDCAN_RX_FIFO0;
82 can_filter.FilterIndex = 1;
84 else if (id_ == STM32_FDCAN3)
86 can_filter.FilterConfig = FDCAN_RX_FIFO1;
87 can_filter.FilterIndex = 2;
91 if (id_ == STM32_FDCAN1)
93 can_filter.FilterConfig = FDCAN_RX_FIFO0;
94 can_filter.FilterIndex = 0;
96 else if (id_ == STM32_FDCAN2)
98 can_filter.FilterConfig = FDCAN_RX_FIFO1;
99 can_filter.FilterIndex = 1;
102 can_filter.FilterConfig = FDCAN_RX_FIFO0;
103 can_filter.FilterIndex = 0;
107 if (HAL_FDCAN_ConfigFilter(hcan_, &can_filter) != HAL_OK)
109 return ErrorCode::FAILED;
112 can_filter.IdType = FDCAN_EXTENDED_ID;
114 if (HAL_FDCAN_ConfigFilter(hcan_, &can_filter) != HAL_OK)
116 return ErrorCode::FAILED;
119 if (HAL_FDCAN_Start(hcan_) != HAL_OK)
121 return ErrorCode::FAILED;
124 if (can_filter.FilterConfig == FDCAN_RX_FIFO0)
126 HAL_FDCAN_ActivateNotification(hcan_, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
130 HAL_FDCAN_ActivateNotification(hcan_, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);
133 HAL_FDCAN_ActivateNotification(hcan_, FDCAN_IT_TX_FIFO_EMPTY, 0);
135 return ErrorCode::OK;
140 FDCAN_TxHeaderTypeDef header;
142 header.Identifier = pack.id;
147 header.IdType = FDCAN_STANDARD_ID;
148 header.TxFrameType = FDCAN_DATA_FRAME;
152 header.IdType = FDCAN_EXTENDED_ID;
153 header.TxFrameType = FDCAN_DATA_FRAME;
157 header.IdType = FDCAN_STANDARD_ID;
158 header.TxFrameType = FDCAN_REMOTE_FRAME;
162 header.IdType = FDCAN_EXTENDED_ID;
163 header.TxFrameType = FDCAN_REMOTE_FRAME;
167 header.DataLength = FDCAN_DLC_BYTES_8;
168 header.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
169 header.BitRateSwitch = FDCAN_BRS_OFF;
170 header.FDFormat = FDCAN_CLASSIC_CAN;
171 header.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
172 header.MessageMarker = 0x01;
174 if (HAL_FDCAN_AddMessageToTxFifoQ(hcan_, &header, pack.data) != HAL_OK)
176 if (tx_queue_.
Push(pack) != ErrorCode::OK)
178 return ErrorCode::FAILED;
182 return ErrorCode::OK;
186 FDCAN_DLC_BYTES_0, FDCAN_DLC_BYTES_1, FDCAN_DLC_BYTES_2, FDCAN_DLC_BYTES_3,
187 FDCAN_DLC_BYTES_4, FDCAN_DLC_BYTES_5, FDCAN_DLC_BYTES_6, FDCAN_DLC_BYTES_7,
188 FDCAN_DLC_BYTES_8, FDCAN_DLC_BYTES_12, FDCAN_DLC_BYTES_16, FDCAN_DLC_BYTES_20,
189 FDCAN_DLC_BYTES_24, FDCAN_DLC_BYTES_32, FDCAN_DLC_BYTES_48, FDCAN_DLC_BYTES_64,
193 0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64,
198 FDCAN_TxHeaderTypeDef header;
199 ASSERT(pack.len <= 64);
201 header.Identifier = pack.id;
206 header.IdType = FDCAN_STANDARD_ID;
207 header.TxFrameType = FDCAN_DATA_FRAME;
211 header.IdType = FDCAN_EXTENDED_ID;
212 header.TxFrameType = FDCAN_DATA_FRAME;
216 header.IdType = FDCAN_STANDARD_ID;
217 header.TxFrameType = FDCAN_REMOTE_FRAME;
221 header.IdType = FDCAN_EXTENDED_ID;
222 header.TxFrameType = FDCAN_REMOTE_FRAME;
228 header.DataLength = FDCAN_PACK_LEN_MAP[pack.len];
230 else if (pack.len <= 24)
232 header.DataLength = FDCAN_PACK_LEN_MAP[(pack.len - 9) / 4 + 1 + 8];
234 else if (pack.len < 32)
236 header.DataLength = FDCAN_DLC_BYTES_32;
238 else if (pack.len < 48)
240 header.DataLength = FDCAN_DLC_BYTES_48;
244 header.DataLength = FDCAN_DLC_BYTES_64;
247 header.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
248 header.BitRateSwitch = FDCAN_BRS_ON;
249 header.FDFormat = FDCAN_FD_CAN;
250 header.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
251 header.MessageMarker = 0x00;
253 if (HAL_FDCAN_AddMessageToTxFifoQ(hcan_, &header, pack.data) != HAL_OK)
255 if (tx_queue_fd_.
Push(pack) != ErrorCode::OK)
257 return ErrorCode::FAILED;
261 return ErrorCode::OK;
271 if (HAL_FDCAN_GetRxMessage(hcan_, fifo, &rx_buff_.header, rx_buff_.pack_fd.data) ==
274 if (rx_buff_.header.FDFormat == FDCAN_FD_CAN)
276 rx_buff_.pack_fd.id = rx_buff_.header.Identifier;
277 rx_buff_.pack_fd.type = (rx_buff_.header.IdType == FDCAN_EXTENDED_ID)
281 if (rx_buff_.header.RxFrameType != FDCAN_DATA_FRAME)
293 rx_buff_.pack_fd.len = rx_buff_.header.DataLength;
295 for (uint32_t i = 0; i < 16; i++)
297 if (rx_buff_.pack_fd.len == FDCAN_PACK_LEN_MAP[i])
299 rx_buff_.pack_fd.len = FDCAN_PACK_LEN_TO_INT_MAP[i];
308 rx_buff_.pack.id = rx_buff_.header.Identifier;
309 rx_buff_.pack.type = (rx_buff_.header.IdType == FDCAN_EXTENDED_ID)
313 if (rx_buff_.header.RxFrameType != FDCAN_DATA_FRAME)
325 memcpy(rx_buff_.pack.data, rx_buff_.pack_fd.data, 8);
338 if (tx_queue_fd_.
Peek(tx_buff_.pack_fd) == ErrorCode::OK)
340 tx_buff_.header.Identifier = tx_buff_.pack_fd.id;
341 switch (tx_buff_.pack_fd.type)
344 tx_buff_.header.IdType = FDCAN_STANDARD_ID;
345 tx_buff_.header.TxFrameType = FDCAN_DATA_FRAME;
349 tx_buff_.header.IdType = FDCAN_EXTENDED_ID;
350 tx_buff_.header.TxFrameType = FDCAN_DATA_FRAME;
354 tx_buff_.header.IdType = FDCAN_STANDARD_ID;
355 tx_buff_.header.TxFrameType = FDCAN_REMOTE_FRAME;
359 tx_buff_.header.IdType = FDCAN_EXTENDED_ID;
360 tx_buff_.header.TxFrameType = FDCAN_REMOTE_FRAME;
363 tx_buff_.header.DataLength = tx_buff_.pack_fd.len;
364 tx_buff_.header.FDFormat = FDCAN_FD_CAN;
365 tx_buff_.header.TxFrameType = FDCAN_DATA_FRAME;
366 tx_buff_.header.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
367 tx_buff_.header.MessageMarker = 0x00;
368 tx_buff_.header.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
369 tx_buff_.header.BitRateSwitch = FDCAN_BRS_ON;
371 if (HAL_FDCAN_AddMessageToTxFifoQ(hcan_, &tx_buff_.header, tx_buff_.pack_fd.data) ==
377 else if (tx_queue_.
Peek(tx_buff_.pack) == ErrorCode::OK)
379 tx_buff_.header.Identifier = tx_buff_.pack.id;
380 switch (tx_buff_.pack.type)
383 tx_buff_.header.IdType = FDCAN_STANDARD_ID;
384 tx_buff_.header.TxFrameType = FDCAN_DATA_FRAME;
388 tx_buff_.header.IdType = FDCAN_EXTENDED_ID;
389 tx_buff_.header.TxFrameType = FDCAN_DATA_FRAME;
393 tx_buff_.header.IdType = FDCAN_STANDARD_ID;
394 tx_buff_.header.TxFrameType = FDCAN_REMOTE_FRAME;
398 tx_buff_.header.IdType = FDCAN_EXTENDED_ID;
399 tx_buff_.header.TxFrameType = FDCAN_REMOTE_FRAME;
402 tx_buff_.header.DataLength = 8;
403 tx_buff_.header.FDFormat = FDCAN_CLASSIC_CAN;
404 tx_buff_.header.TxFrameType = FDCAN_DATA_FRAME;
405 tx_buff_.header.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
406 tx_buff_.header.MessageMarker = 0x00;
407 tx_buff_.header.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
408 tx_buff_.header.BitRateSwitch = FDCAN_BRS_OFF;
410 if (HAL_FDCAN_AddMessageToTxFifoQ(hcan_, &tx_buff_.header, tx_buff_.pack.data) ==