8static bool operator==(
const SPI_InitTypeDef& lhs, 
const SPI_InitTypeDef& rhs) {
 
    9    return memcmp(&lhs,&rhs,
sizeof(SPI_InitTypeDef)) == 0;
 
 
   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);
 
 
  352    return spiPort.reserveCsPin(csPin);
 
 
static bool operator==(const SPI_InitTypeDef &lhs, const SPI_InitTypeDef &rhs)
virtual bool updateCSPin(OutputPin &csPin)
virtual void beginSpiTransfer(SPIPort *port)
SPIDevice(SPIPort &port, OutputPin csPin)
virtual SPIConfig * getSpiConfig()
virtual void endSpiTransfer(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)
SPI_InitTypeDef peripheral