61 CAN_FilterTypeDef can_filter = {};
63 can_filter.FilterIdHigh = 0;
64 can_filter.FilterIdLow = 0;
65 can_filter.FilterMode = CAN_FILTERMODE_IDMASK;
66 can_filter.FilterScale = CAN_FILTERSCALE_32BIT;
67 can_filter.FilterMaskIdHigh = 0;
68 can_filter.FilterMaskIdLow = 0;
69 can_filter.FilterFIFOAssignment = fifo_;
70 can_filter.FilterActivation = ENABLE;
72 if (id_ == STM32_CAN1)
74 can_filter.FilterBank = 0;
75 can_filter.SlaveStartFilterBank = 14;
78 else if (id_ == STM32_CAN2)
80 can_filter.FilterBank = 14;
81 can_filter.SlaveStartFilterBank = 14;
84 else if (id_ == STM32_CAN3)
86 can_filter.FilterBank = 3;
91 if (id_ == STM32_CAN1)
93 can_filter.FilterBank = 0;
94 can_filter.SlaveStartFilterBank = 14;
97 else if (id_ == STM32_CAN2)
99 can_filter.FilterBank = 14;
100 can_filter.SlaveStartFilterBank = 14;
101 fifo_ = CAN_RX_FIFO1;
104 if (id_ == STM32_CAN1)
106 can_filter.FilterBank = 0;
107 can_filter.SlaveStartFilterBank = 14;
108 fifo_ = CAN_RX_FIFO0;
115 return ErrorCode::FAILED;
117 can_filter.FilterFIFOAssignment = fifo_;
119 if (HAL_CAN_ConfigFilter(hcan_, &can_filter) != HAL_OK)
121 return ErrorCode::FAILED;
124 if (HAL_CAN_Start(hcan_) != HAL_OK)
126 return ErrorCode::FAILED;
129 if (fifo_ == CAN_RX_FIFO0)
131 HAL_CAN_ActivateNotification(hcan_, CAN_IT_RX_FIFO0_MSG_PENDING);
135 HAL_CAN_ActivateNotification(hcan_, CAN_IT_RX_FIFO1_MSG_PENDING);
138 HAL_CAN_ActivateNotification(hcan_, CAN_IT_ERROR);
139 HAL_CAN_ActivateNotification(hcan_, CAN_IT_TX_MAILBOX_EMPTY);
141 return ErrorCode::OK;
146 CAN_TxHeaderTypeDef txHeader;
148 txHeader.DLC =
sizeof(pack.data);
153 txHeader.IDE = CAN_ID_STD;
154 txHeader.RTR = CAN_RTR_DATA;
157 txHeader.IDE = CAN_ID_EXT;
158 txHeader.RTR = CAN_RTR_DATA;
161 txHeader.IDE = CAN_ID_STD;
162 txHeader.RTR = CAN_RTR_REMOTE;
165 txHeader.IDE = CAN_ID_EXT;
166 txHeader.RTR = CAN_RTR_REMOTE;
170 return ErrorCode::FAILED;
174 txHeader.TransmitGlobalTime = DISABLE;
176 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 if (rx_buff_.header.StdId == 2046)
203 rx_buff_.pack.id = rx_buff_.header.StdId;
208 rx_buff_.pack.id = rx_buff_.header.ExtId;
212 if (rx_buff_.header.RTR == CAN_RTR_REMOTE)
223 OnMessage(rx_buff_.pack,
true);
233 if (tx_queue_.
Peek(tx_buff_.pack) == ErrorCode::OK)
235 tx_buff_.header.DLC =
sizeof(tx_buff_.pack.data);
236 switch (tx_buff_.pack.type)
239 tx_buff_.header.IDE = CAN_ID_STD;
240 tx_buff_.header.RTR = CAN_RTR_DATA;
243 tx_buff_.header.IDE = CAN_ID_EXT;
244 tx_buff_.header.RTR = CAN_RTR_DATA;
247 tx_buff_.header.IDE = CAN_ID_STD;
248 tx_buff_.header.RTR = CAN_RTR_REMOTE;
251 tx_buff_.header.IDE = CAN_ID_EXT;
252 tx_buff_.header.RTR = CAN_RTR_REMOTE;
258 tx_buff_.header.StdId =
260 tx_buff_.header.ExtId =
262 tx_buff_.header.TransmitGlobalTime = DISABLE;
264 if (HAL_CAN_AddTxMessage(hcan_, &tx_buff_.header, tx_buff_.pack.data, &txMailbox) ==