8static bool operator==(
const SPI_InitTypeDef& lhs,
const SPI_InitTypeDef& rhs) {
9 return memcmp(&lhs,&rhs,
sizeof(SPI_InitTypeDef)) == 0;
14SPIPort::SPIPort(SPI_HandleTypeDef &hspi,
const std::vector<OutputPin>& csPins,uint32_t baseclk,
bool allowReconfigure)
73 if(config ==
nullptr ||
hspi.Init == *config){
95 HAL_SPI_Transmit_DMA(&this->
hspi,
const_cast<uint8_t*
>(buf),size);
109 HAL_SPI_TransmitReceive_DMA(&this->
hspi,
const_cast<uint8_t*
>(txbuf),rxbuf,size);
123 HAL_SPI_Receive_DMA(&this->
hspi,buf,size);
134 HAL_SPI_Transmit_IT(&this->
hspi,
const_cast<uint8_t*
>(buf),size);
144 HAL_SPI_TransmitReceive_IT(&this->
hspi,
const_cast<uint8_t*
>(txbuf),rxbuf,size);
154 HAL_SPI_Receive_IT(&this->
hspi,buf,size);
163 HAL_SPI_Transmit(&this->
hspi,
const_cast<uint8_t*
>(buf),size,timeout);
172 HAL_SPI_Receive(&this->
hspi,buf,size,timeout);
181 HAL_SPI_TransmitReceive(&this->
hspi,
const_cast<uint8_t*
>(txbuf),rxbuf,size,timeout);
187 bool isIsr =
inIsr();
190 BaseType_t taskWoken = 0;
192 portYIELD_FROM_ISR(taskWoken);
200 bool isIsr =
inIsr();
203 BaseType_t taskWoken = 0;
205 portYIELD_FROM_ISR(taskWoken);
237 if (
hspi->Instance != this->hspi.Instance) {
251 if (
hspi->Instance != this->hspi.Instance) {
264 if (
hspi->Instance != this->hspi.Instance) {
278 if (
hspi->Instance != this->hspi.Instance) {
292 std::vector<std::pair<uint32_t,float>> distances;
293#if defined(SPI_BAUDRATEPRESCALER_2)
294 distances.push_back({SPI_BAUDRATEPRESCALER_2,(
baseclk/2.0)});
296#if defined(SPI_BAUDRATEPRESCALER_4)
297 distances.push_back({SPI_BAUDRATEPRESCALER_4,(
baseclk/4.0)});
299#if defined(SPI_BAUDRATEPRESCALER_8)
300 distances.push_back({SPI_BAUDRATEPRESCALER_8,(
baseclk/8.0)});
302#if defined(SPI_BAUDRATEPRESCALER_16)
303 distances.push_back({SPI_BAUDRATEPRESCALER_16,(
baseclk/16.0)});
305#if defined(SPI_BAUDRATEPRESCALER_32)
306 distances.push_back({SPI_BAUDRATEPRESCALER_32,(
baseclk/32.0)});
308#if defined(SPI_BAUDRATEPRESCALER_64)
309 distances.push_back({SPI_BAUDRATEPRESCALER_64,(
baseclk/64.0)});
311#if defined(SPI_BAUDRATEPRESCALER_128)
312 distances.push_back({SPI_BAUDRATEPRESCALER_128,(
baseclk/128.0)});
314#if defined(SPI_BAUDRATEPRESCALER_256)
315 distances.push_back({SPI_BAUDRATEPRESCALER_256,(
baseclk/256.0)});
318 std::pair<uint32_t,float> bestVal = distances[0];
319 float bestDist = INFINITY;
320 for(
auto& val : distances){
321 if(std::abs(clock-val.second) < bestDist){
322 bestDist = abs(clock-val.second);
static bool operator==(const SPI_InitTypeDef &lhs, const SPI_InitTypeDef &rhs)
void write(bool state) const
virtual bool updateCSPin(OutputPin &csPin)
virtual void beginSpiTransfer(SPIPort *port)
SPIDevice(SPIPort &port, OutputPin csPin)
virtual void spiTxCompleted(SPIPort *port)
virtual SPIConfig * getSpiConfig()
virtual void endSpiTransfer(SPIPort *port)
virtual void spiRequestError(SPIPort *port)
virtual void spiRxCompleted(SPIPort *port)
virtual void spiTxRxCompleted(SPIPort *port)
void transmitReceive(const uint8_t *txbuf, uint8_t *rxbuf, uint16_t size, SPIDevice *device, uint16_t timeout)
void transmit_IT(const uint8_t *buf, uint16_t size, SPIDevice *device)
std::vector< OutputPin > & getCsPins()
SPIDevice * current_device
bool isPinFree(OutputPin pin)
void takeExclusive(bool exclusive)
bool reserveCsPin(OutputPin pin)
std::pair< uint32_t, float > getClosestPrescaler(float clock)
std::vector< OutputPin > & getFreeCsPins()
std::vector< OutputPin > freePins
SPI_HandleTypeDef * getPortHandle()
void receive(uint8_t *buf, uint16_t size, SPIDevice *device, int16_t timeout)
void transmitReceive_DMA(const uint8_t *txbuf, uint8_t *rxbuf, uint16_t size, SPIDevice *device)
void SpiError(SPI_HandleTypeDef *hspi) override
void SpiTxCplt(SPI_HandleTypeDef *hspi) override
void transmit(const uint8_t *buf, uint16_t size, SPIDevice *device, uint16_t timeout)
void receive_DMA(uint8_t *buf, uint16_t size, SPIDevice *device)
void transmitReceive_IT(const uint8_t *txbuf, uint8_t *rxbuf, uint16_t size, SPIDevice *device)
void transmit_DMA(const uint8_t *buf, uint16_t size, SPIDevice *device)
OutputPin * getCsPin(uint16_t idx)
std::vector< OutputPin > csPins
void SpiTxRxCplt(SPI_HandleTypeDef *hspi) override
void configurePort(SPI_InitTypeDef *config)
void receive_IT(uint8_t *buf, uint16_t size, SPIDevice *device)
bool freeCsPin(OutputPin pin)
volatile bool isTakenFlag
void SpiRxCplt(SPI_HandleTypeDef *hspi) override
cpp_freertos::BinarySemaphore semaphore
SPIPort(SPI_HandleTypeDef &hspi, const std::vector< OutputPin > &csPins, uint32_t baseclk, bool allowReconfigure=true)
bool GiveFromISR(BaseType_t *pxHigherPriorityTaskWoken)
bool TakeFromISR(BaseType_t *pxHigherPriorityTaskWoken)
bool Take(TickType_t Timeout=portMAX_DELAY)
SPI_InitTypeDef peripheral
bool cspol
CSPOL=true === active low.