13#if defined(STM32) && defined(HAL_SPI_MODULE_ENABLED)
16LinkedQueue<Stm32SpiSlave> Stm32SpiSlave::m_queue;
19: m_hwHandle{&hwHandle}
27 auto state = HAL_SPI_Init(m_hwHandle);
30 if (state == HAL_ERROR)
35 else if (state == HAL_BUSY)
40 else if (state == HAL_TIMEOUT)
51 auto state = HAL_SPI_DeInit(m_hwHandle);
54 if (state == HAL_ERROR)
59 else if (state == HAL_BUSY)
64 else if (state == HAL_TIMEOUT)
76 for (
auto& handle : m_queue)
78 if (handle.m_hwHandle == &hwHandle)
79 handle.onDataAvailable();
85 for (
auto& handle : m_queue)
87 if (handle.m_hwHandle == &hwHandle)
88 handle.onDataWritten();
94 for (
auto& handle : m_queue)
96 if (handle.m_hwHandle == &hwHandle)
97 handle.onReadWrittenHardware();
103 for (
auto& handle : m_queue)
105 if (handle.m_hwHandle == &hwHandle)
112 for (
auto& handle : m_queue)
114 if (handle.m_hwHandle == &hwHandle)
115 handle.onAbortedHardware();
121 __HAL_UNLOCK(m_hwHandle);
122 auto state = HAL_SPI_Transmit_IT(m_hwHandle,
const_cast<uint8_t*
>(data),
static_cast<uint16_t
>(dataSize));
125 if (state == HAL_ERROR)
130 else if (state == HAL_BUSY)
135 else if (state == HAL_TIMEOUT)
146 __HAL_UNLOCK(m_hwHandle);
147 auto state = HAL_SPI_Receive_IT(m_hwHandle, buffer,
static_cast<uint16_t
>(bufferSize));
150 if (state == HAL_ERROR)
155 else if (state == HAL_BUSY)
160 else if (state == HAL_TIMEOUT)
171 m_writeData =
const_cast<uint8_t*
>(writeData);
172 m_readBuffer = readBuffer;
173 m_writeDataSize = size;
175 __HAL_UNLOCK(m_hwHandle);
176 auto state = HAL_SPI_TransmitReceive_IT(m_hwHandle,
const_cast<uint8_t*
>(writeData), readBuffer, 1);
179 if (state == HAL_ERROR)
184 else if (state == HAL_BUSY)
189 else if (state == HAL_TIMEOUT)
201 __HAL_UNLOCK(m_hwHandle);
202 auto state = HAL_SPI_Abort(m_hwHandle);
205 if (state == HAL_ERROR)
210 else if (state == HAL_BUSY)
215 else if (state == HAL_TIMEOUT)
227 __HAL_UNLOCK(m_hwHandle);
228 auto state = HAL_SPI_Abort(m_hwHandle);
231 if (state == HAL_ERROR)
236 else if (state == HAL_BUSY)
241 else if (state == HAL_TIMEOUT)
262 if (m_writeDataSize != 0)
281 m_hwHandle->Init.DataSize = SPI_DATASIZE_8BIT;
283 m_hwHandle->Init.DataSize = SPI_DATASIZE_16BIT;
291 switch (transmission)
294 m_hwHandle->Init.CLKPolarity = SPI_POLARITY_LOW;
295 m_hwHandle->Init.CLKPhase = SPI_PHASE_1EDGE;
298 m_hwHandle->Init.CLKPolarity = SPI_POLARITY_LOW;
299 m_hwHandle->Init.CLKPhase = SPI_PHASE_2EDGE;
302 m_hwHandle->Init.CLKPolarity = SPI_POLARITY_HIGH;
303 m_hwHandle->Init.CLKPhase = SPI_PHASE_1EDGE;
306 m_hwHandle->Init.CLKPolarity = SPI_POLARITY_HIGH;
307 m_hwHandle->Init.CLKPhase = SPI_PHASE_2EDGE;
315 m_hwHandle->Init.Direction = SPI_DIRECTION_2LINES;
318 m_hwHandle->Init.Direction = SPI_DIRECTION_1LINE;
321 m_hwHandle->Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
Class for representing errors. Every error should have a unique source code. As a user feel encourage...
void connect(SlotBase< Arguments... > &slot)
Connect a method to the signal.
@ WriteOnlyWires
CLK and MOSI pins used (no master receive)
@ ReadOnlyWires
CLK and MISO pins used (no master write)
@ FullDuplexWires
CLK, MISO and MOSI pins used.
@ HalfDuplexWires
CLK, MISO / MOSI pins used (MISO and MOSI pin is shared)
@ Mode2
POL is high, PHA is low.
@ Mode0
POL is low, PHA is low.
@ Mode1
POL is low, PHA is high.
@ Mode3
POL is high, PHA is high.
void onError(Error thrown)
Error routine, emits the error signal.
void setBusy(bool busy)
Sets the flag m_isBusy.
void onReadWrittenHardware()
static void systemIsrWrittenAndRead(SPI_HandleTypeDef &hwHandle)
Handles the global receive transmit complete callback.
static void systemIsrError(SPI_HandleTypeDef &hwHandle)
Handles the global error callback.
static void systemIsrAbort(SPI_HandleTypeDef &hwHandle)
Handles the global abort callback.
static void systemIsrRead(SPI_HandleTypeDef &hwHandle)
Handles the global receive complete callback.
void writeReadHardware(const uint8_t writeData[], uint8_t readBuffer[], size_t size) override
Accesses the spi hardware in order to perform a full duplex read/write.
Stm32SpiSlave(SPI_HandleTypeDef &hwHandle)
Constructor.
void readHardware(uint8_t buffer[], size_t bufferSize) override
Accesses the spi hardware in order to read bufferSize bytes and stores them in buffer.
void writeHardware(const uint8_t data[], size_t dataSize) override
Accesses the spi hardware in order to write dataSize bytes of data.
static void systemIsrWritten(SPI_HandleTypeDef &hwHandle)
Handles the global transmit complete callback.
void setFormatHardware(uint8_t bits, TransmissionMode transmission, WireMode wire) override
Configures the hardware for insuring the given configuration.
void stopWriteHardware() override
void stopReadHardware() override
@ StopWriteHardware_HalError
@ StopReadHardware_HalError
@ WriteReadHardware_HalBusy
@ StopWriteHardware_HalTimeout
@ ReadHardware_HalTimeout
@ StopWriteHardware_HalBusy
@ WriteReadHardware_HalTimeout
@ WriteHardware_HalTimeout
@ SetFormatHardware_BitsNotSupported
@ StopReadHardware_HalTimeout
@ WriteReadHardware_HalError
@ StopReadHardware_HalBusy