31 #include <string_view>
42 template<auto Context>
51 return HAL_FDCAN_Start(Context) == HAL_OK;
67 return HAL_CAN_Start(Context) == HAL_OK;
74 return HAL_CAN_Stop(Context) == HAL_OK;
86 static void read(
u32 &
id,
u32 &extendedId,
u32 ×tamp, std::array<u8, 8> &data) {
87 FDCAN_RxHeaderTypeDef rxHeader = {0};
88 while (HAL_CAN_GetRxFifoFillLevel(Context, FDCAN_RX_FIFO0) == 0);
89 HAL_CAN_GetRxMessage(Context, FDCAN_RX_FIFO0, &rxHeader, data.data());
90 if (rxHeader.IdType == FDCAN_STANDARD_ID) {
91 id = rxHeader.Identifier;
94 extendedId = rxHeader.Identifier;
96 timestamp = rxHeader.RxTimestamp;
108 FDCAN_TxHeaderTypeDef txHeader = {0};
109 constexpr
size_t Size =
sizeof(T);
111 std::array<u8, Size> data;
112 std::memcpy(data.data(), &packet.
data, Size);
115 txHeader.IdType = FDCAN_EXTENDED_ID;
118 txHeader.Identifier = packet.
id;
119 txHeader.IdType = FDCAN_STANDARD_ID;
122 txHeader.DataLength = Size;
124 HAL_CAN_AddTxMessage(Context, &txHeader,
const_cast<u8*
>(data.data()), &pTxMailbox);
125 while (HAL_CAN_GetTxMailboxesFreeLevel(Context) != 3);