65 CAN_FilterTypeDef can_filter = {};
67 can_filter.FilterIdHigh = 0;
68 can_filter.FilterIdLow = 0;
69 can_filter.FilterMode = CAN_FILTERMODE_IDMASK;
70 can_filter.FilterScale = CAN_FILTERSCALE_32BIT;
71 can_filter.FilterMaskIdHigh = 0;
72 can_filter.FilterMaskIdLow = 0;
73 can_filter.FilterFIFOAssignment = fifo_;
74 can_filter.FilterActivation = ENABLE;
76 if (id_ == STM32_CAN1)
78 can_filter.FilterBank = 0;
79 can_filter.SlaveStartFilterBank = 14;
82 else if (id_ == STM32_CAN2)
84 can_filter.FilterBank = 14;
85 can_filter.SlaveStartFilterBank = 14;
88 else if (id_ == STM32_CAN3)
90 can_filter.FilterBank = 3;
95 if (id_ == STM32_CAN1)
97 can_filter.FilterBank = 0;
98 can_filter.SlaveStartFilterBank = 14;
101 else if (id_ == STM32_CAN2)
103 can_filter.FilterBank = 14;
104 can_filter.SlaveStartFilterBank = 14;
105 fifo_ = CAN_RX_FIFO1;
108 if (id_ == STM32_CAN1)
110 can_filter.FilterBank = 0;
111 can_filter.SlaveStartFilterBank = 14;
112 fifo_ = CAN_RX_FIFO0;
119 return ErrorCode::FAILED;
121 can_filter.FilterFIFOAssignment = fifo_;
123 if (HAL_CAN_ConfigFilter(hcan_, &can_filter) != HAL_OK)
125 return ErrorCode::FAILED;
128 if (HAL_CAN_Start(hcan_) != HAL_OK)
130 return ErrorCode::FAILED;
133 if (fifo_ == CAN_RX_FIFO0)
135 HAL_CAN_ActivateNotification(hcan_, CAN_IT_RX_FIFO0_MSG_PENDING);
139 HAL_CAN_ActivateNotification(hcan_, CAN_IT_RX_FIFO1_MSG_PENDING);
142 HAL_CAN_ActivateNotification(hcan_, CAN_IT_ERROR);
143 HAL_CAN_ActivateNotification(hcan_, CAN_IT_TX_MAILBOX_EMPTY);
145 return ErrorCode::OK;
150 CAN_TxHeaderTypeDef txHeader;
152 txHeader.DLC =
sizeof(pack.data);
157 txHeader.IDE = CAN_ID_STD;
158 txHeader.RTR = CAN_RTR_DATA;
161 txHeader.IDE = CAN_ID_EXT;
162 txHeader.RTR = CAN_RTR_DATA;
165 txHeader.IDE = CAN_ID_STD;
166 txHeader.RTR = CAN_RTR_REMOTE;
169 txHeader.IDE = CAN_ID_EXT;
170 txHeader.RTR = CAN_RTR_REMOTE;
175 txHeader.TransmitGlobalTime = DISABLE;
177 if (HAL_CAN_AddTxMessage(hcan_, &txHeader, pack.data, &txMailbox) != HAL_OK)
179 if (tx_queue_.
Push(pack) != ErrorCode::OK)
181 return ErrorCode::FULL;
185 return ErrorCode::OK;
194 while (HAL_CAN_GetRxMessage(hcan_, fifo_, &rx_buff_.header, rx_buff_.pack.data) ==
197 if (rx_buff_.header.IDE == CAN_ID_STD)
199 rx_buff_.pack.id = rx_buff_.header.StdId;
204 rx_buff_.pack.id = rx_buff_.header.ExtId;
208 if (rx_buff_.header.RTR == CAN_RTR_REMOTE)
230 if (tx_queue_.
Peek(tx_buff_.pack) == ErrorCode::OK)
232 tx_buff_.header.DLC =
sizeof(tx_buff_.pack.data);
233 switch (tx_buff_.pack.type)
236 tx_buff_.header.IDE = CAN_ID_STD;
237 tx_buff_.header.RTR = CAN_RTR_DATA;
240 tx_buff_.header.IDE = CAN_ID_EXT;
241 tx_buff_.header.RTR = CAN_RTR_DATA;
244 tx_buff_.header.IDE = CAN_ID_STD;
245 tx_buff_.header.RTR = CAN_RTR_REMOTE;
248 tx_buff_.header.IDE = CAN_ID_EXT;
249 tx_buff_.header.RTR = CAN_RTR_REMOTE;
252 tx_buff_.header.StdId =
254 tx_buff_.header.ExtId =
256 tx_buff_.header.TransmitGlobalTime = DISABLE;
258 if (HAL_CAN_AddTxMessage(hcan_, &tx_buff_.header, tx_buff_.pack.data, &txMailbox) ==