10#ifndef SEMF_HARDWAREABSTRACTION_STM32_STM32CAN_H_
11#define SEMF_HARDWAREABSTRACTION_STM32_STM32CAN_H_
16#if defined(STM32) && defined(HAL_CAN_MODULE_ENABLED)
37 SetFilter_IndexOutOfBounds,
38 SetFilter_MessageIdInvalid,
39 SetFilter_MessageIdMaskInvalid,
40 EnterDeepPowerDownMode_SleepStateReadyListeningHalError,
41 EnterDeepPowerDownMode_SleepStateReadyListeningHalBusy,
42 EnterDeepPowerDownMode_SleepStateReadyListeningHalTimeout,
43 EnterDeepPowerDownMode_InitStateResetSleepPendingHalError,
44 EnterDeepPowerDownMode_InitStateResetSleepPendingHalBusy,
45 EnterDeepPowerDownMode_InitStateResetSleepPendingHalTimeout,
46 EnterDeepPowerDownMode_StartStateResetSleepPendingHalError,
47 EnterDeepPowerDownMode_StartStateResetSleepPendingHalBusy,
48 EnterDeepPowerDownMode_StartStateResetSleepPendingHalTimeout,
49 EnterDeepPowerDownMode_SleepStateResetSleepPendingHalError,
50 EnterDeepPowerDownMode_SleepStateResetSleepPendingHalBusy,
51 EnterDeepPowerDownMode_SleepStateResetSleepPendingHalTimeout,
52 ReleaseDeepPowerDownMode_WakeupStateSleepActiveHalError,
53 ReleaseDeepPowerDownMode_WakeupStateSleepActiveHalBusy,
54 ReleaseDeepPowerDownMode_WakeupStateSleepActiveHalTimeout,
55 ReleaseDeepPowerDownMode_InitStateResetSleepPendingHalError,
56 ReleaseDeepPowerDownMode_InitStateResetSleepPendingHalBusy,
57 ReleaseDeepPowerDownMode_InitStateResetSleepPendingHalTimeout,
58 ReleaseDeepPowerDownMode_StartStateResetSleepPendingHalError,
59 ReleaseDeepPowerDownMode_StartStateResetSleepPendingHalBusy,
60 ReleaseDeepPowerDownMode_StartStateResetSleepPendingHalTimeout,
61 ReleaseDeepPowerDownMode_StartStateError,
62 ReleaseDeepPowerDownMode_StartStateInvalid,
63 IsrRead_NullpointerReadBuffer,
64 IsrRead_FifoIdInvalid,
69 WriteHardware_InvalidMessageId,
70 WriteHardware_HalError,
71 WriteHardware_HalBusy,
72 WriteHardware_HalTimeout,
73 WriteHardware_NotStarted,
74 RequestHardware_InvalidMessageId,
75 RequestHardware_HalError,
76 RequestHardware_HalBusy,
77 RequestHardware_HalTimeout,
78 RequestHardware_NotStarted,
80 Start_HalNotInitialized,
87 explicit Stm32Can(CAN_HandleTypeDef& hwHandle);
105 void setReadBuffer(uint8_t buffer[],
size_t bufferSize)
override;
135 void setFilter(uint32_t filterBank, uint32_t
messageId, uint32_t messageIdMask)
override;
177 static void systemIsrRead(CAN_HandleTypeDef& can, uint8_t fifoId);
199 void isrRead(CAN_HandleTypeDef& can, uint8_t fifoId);
205 void isrWritten(CAN_HandleTypeDef& can, uint8_t mailboxId);
210 void isrError(CAN_HandleTypeDef& can);
221 void writeHardware(
const uint8_t data[],
size_t dataSize)
override;
236 CAN_HandleTypeDef* m_hwHandle =
nullptr;
238 static const uint8_t m_numOfFilterBanks = 28;
240 CAN_TxHeaderTypeDef m_txHeader;
242 CAN_RxHeaderTypeDef m_rxHeader;
244 uint32_t m_usedTxMailbox = 0;
246 const uint8_t* m_writeData =
nullptr;
248 size_t m_writeDataSize = 0;
250 size_t m_writeDataIndex = 0;
252 uint8_t m_requestData[8] = {0};
254 uint8_t* m_readData =
nullptr;
256 size_t m_readDataSize = 0;
258 uint32_t m_messageIdWrite = 0;
260 uint32_t m_messageIdRead = 0;
262 bool m_isStarted =
false;
264 static constexpr Error::ClassID kSemfClassId = Error::ClassID::Stm32Can;
LinkedQueue is an managed single linked queue implementation.
Class for using CAN with Stm32.
virtual ~Stm32Can()=default
Stm32Can(const Stm32Can &other)=delete
uint32_t messageId() const override
Returns the message ID for reading data. Use this function after reading the data via read-function.
static void systemIsrWritten(CAN_HandleTypeDef &can, uint8_t mailboxId)
System-wide interrupt service routine for can transmit.
void stopWrite() override
void isrWritten(CAN_HandleTypeDef &can, uint8_t mailboxId)
Sending a readyWritten signal.
void setReadBuffer(uint8_t buffer[], size_t bufferSize) override
Sets the read buffer for having the possibility to handle the received data.
void requestHardware() override
void setFrequency(uint32_t hz) override
Sets the speed.
Stm32Can(CAN_HandleTypeDef &hwHandle)
Constructor.
void setFilter(uint32_t filterBank, uint32_t messageId, uint32_t messageIdMask) override
Sets a message hardware receive filter.
void writeHardware(const uint8_t data[], size_t dataSize) override
Hardware will write data.
static void systemIsrError(CAN_HandleTypeDef &can)
System-wide interrupt service routine for can error.
void setMessageId(uint32_t id) override
Sets the message ID for writing data. Use this function before writing the data via write-function.
void releaseDeepPowerDownMode()
Go to active mode.
void start()
Hardware driver will be started.
void stop()
Hardware driver will be stopped.
static LinkedQueue< Stm32Can > * queue()
Get the list with all cans.
void isrRead(CAN_HandleTypeDef &can, uint8_t fifoId)
Saves a received message and sends a readyRead or readyRequested signal.
void enterDeepPowerDownMode()
Go to deep power down mode.
void isrError(CAN_HandleTypeDef &can)
Sending a error signal.
bool isStarted() const
Get the state of the start of the CAN driver.
static void systemIsrRead(CAN_HandleTypeDef &can, uint8_t fifoId)
System-wide interrupt service routine for can receive.