semf
stm32spimaster.h
Go to the documentation of this file.
1
10#ifndef SEMF_HARDWAREABSTRACTION_STM32_STM32SPIMASTER_H_
11#define SEMF_HARDWAREABSTRACTION_STM32_STM32SPIMASTER_H_
12
16
17#if defined(STM32) && defined(HAL_SPI_MODULE_ENABLED)
19namespace semf
20{
24class Stm32SpiMaster : public SpiMasterHardware, public LinkedQueue<Stm32SpiMaster>::Node
25{
26public:
28 enum class ErrorCode : uint8_t
29 {
30 Init_HalError = 0,
31 Init_HalBusy,
32 Init_HalTimeout,
33 Deinit_HalError,
34 Deinit_HalBusy,
35 Deinit_HalTimeout,
36 SetFrequency_IsBusy,
37 SetFrequency_SpiClockIsZero,
38 IsrError_Isr,
39 SetFormatHardware_BitsNotSupported,
40 StopWriteHardware_HalError,
41 StopWriteHardware_HalBusy,
42 StopWriteHardware_HalTimeout,
43 StopReadHardware_HalError,
44 StopReadHardware_HalBusy,
45 StopReadHardware_HalTimeout,
46 Write_HalError,
47 Write_HalBusy,
48 Write_HalTimeout,
49 ReadNext_HalError,
50 ReadNext_HalBusy,
51 ReadNext_HalTimeout,
52 WriteReadNext_HalError,
53 WriteReadNext_HalBusy,
54 WriteReadNext_HalTimeout,
55 };
56
62 explicit Stm32SpiMaster(SPI_HandleTypeDef& hwHandle, uint32_t spiClockFrequencyHz = 0);
69 Stm32SpiMaster(SPI_HandleTypeDef& hwHandle, Gpio& chipSelectPin, uint32_t spiClockFrequencyHz = 0);
70 explicit Stm32SpiMaster(const Stm32SpiMaster& other) = delete;
71 virtual ~Stm32SpiMaster() = default;
72
79 void init() override;
86 void deinit() override;
92 void setFrequency(uint32_t hz) override;
102 static void systemIsrRead(SPI_HandleTypeDef& spi);
107 static void systemIsrWritten(SPI_HandleTypeDef& spi);
112 static void systemIsrWrittenAndRead(SPI_HandleTypeDef& spi);
117 static void systemIsrError(SPI_HandleTypeDef& spi);
122 static void systemIsrAbort(SPI_HandleTypeDef& spi);
127 void isrRead(SPI_HandleTypeDef& spi);
128 void isrWritten(SPI_HandleTypeDef& spi);
133 void isrWrittenAndRead(SPI_HandleTypeDef& spi);
139 void isrError(SPI_HandleTypeDef& spi);
144 void isrAborted(SPI_HandleTypeDef& spi);
145
146protected:
153 void writeHardware(const uint8_t data[], size_t dataSize) override;
154 void readHardware(uint8_t buffer[], size_t bufferSize) override;
155 void writeReadHardware(const uint8_t writeData[], uint8_t readBuffer[], size_t size) override;
160 void setFormatHardware(uint8_t bits, TransmissionMode transmission, WireMode wire) override;
167 void stopWriteHardware() override;
174 void stopReadHardware() override;
175
176private:
183 void readNext();
190 void writeReadNext();
191
193 SPI_HandleTypeDef* m_hwHandle;
195 const uint32_t m_spiClockFrequencyHz;
197 const uint8_t* m_writeData = nullptr;
199 uint8_t* m_readData = nullptr;
201 size_t m_dataSize = 0;
203 size_t m_dataIndex = 0;
205 Signal<> aborted;
207 SEMF_SLOT(m_abortedSlot, Signal<>, writeStopped, emitSignal);
209 static constexpr Error::ClassID kSemfClassId = Error::ClassID::Stm32SpiMaster;
210};
211} /* namespace semf */
212#endif
213#endif /* SEMF_HARDWAREABSTRACTION_STM32_STM32SPIMASTER_H_ */
ClassID
Semf class IDs.
Definition: error.h:28
Interface class for using a GPIO pin of the microcontroller.
Definition: gpio.h:23
LinkedQueue is an managed single linked queue implementation.
Definition: linkedqueue.h:38
Signal for lightweight signal/slot implementation. One signal can be connected to multiple slots and ...
Definition: signal.h:41
WireMode
Definition: spi.h:37
TransmissionMode
Definition: spi.h:29
Class for using SPI hardware in master mode.
SpiMasterHardware implementation for STM32.
void setFrequency(uint32_t hz) override
Sets the speed.
static void systemIsrWrittenAndRead(SPI_HandleTypeDef &spi)
System-wide interrupt service routine for spi receive and transmit.
void isrAborted(SPI_HandleTypeDef &spi)
handles the abort callback
void isrWrittenAndRead(SPI_HandleTypeDef &spi)
Interrupt service routine for spi object receive and transmit.
Stm32SpiMaster(SPI_HandleTypeDef &hwHandle, uint32_t spiClockFrequencyHz=0)
Constructor.
Stm32SpiMaster(const Stm32SpiMaster &other)=delete
void setFormatHardware(uint8_t bits, TransmissionMode transmission, WireMode wire) override
Configures the hardware for insuring the given configuration.
void writeReadHardware(const uint8_t writeData[], uint8_t readBuffer[], size_t size) override
Hardware will read and write data parallel.
void writeHardware(const uint8_t data[], size_t dataSize) override
Hardware will write data.
static void systemIsrError(SPI_HandleTypeDef &spi)
System-wide interrupt service routine for spi error.
void isrRead(SPI_HandleTypeDef &spi)
Interrupt service routine for spi object receive.
static void systemIsrWritten(SPI_HandleTypeDef &spi)
System-wide interrupt service routine for spi transmit.
static void systemIsrRead(SPI_HandleTypeDef &spi)
System-wide interrupt service routine for spi receive.
virtual ~Stm32SpiMaster()=default
void readHardware(uint8_t buffer[], size_t bufferSize) override
Hardware will read data.
static void systemIsrAbort(SPI_HandleTypeDef &spi)
System-wide interrupt service routine for spi abort.
void isrError(SPI_HandleTypeDef &spi)
Interrupt service routine for spi object error.
void isrWritten(SPI_HandleTypeDef &spi)
void init() override
static LinkedQueue< Stm32SpiMaster > * queue()
Get the list with all spi.
void stopReadHardware() override
void deinit() override
void stopWriteHardware() override