26#include <interfaces/delays.h>
31#ifndef USE_MOCK_PERIPHERALS
34#include <utils/TestUtils/FakeSpiTypedef.h>
35using SPIType = Boardcore::FakeSpiTypedef;
91#ifdef _ARCH_CORTEXM7_STM32F7
164 uint8_t
read()
override;
171 uint16_t
read16()
override;
178 uint32_t
read24()
override;
185 uint32_t
read32()
override;
193 void read(uint8_t* data,
size_t size)
override;
201 void read16(uint16_t* data,
size_t size)
override;
208 void write(uint8_t data)
override;
215 void write16(uint16_t data)
override;
222 void write24(uint32_t data)
override;
229 void write32(uint32_t data)
override;
237 void write(
const uint8_t* data,
size_t size)
override;
245 void write16(
const uint16_t* data,
size_t size)
override;
253 uint8_t
transfer(uint8_t data)
override;
285 void transfer(uint8_t* data,
size_t size)
override;
293 void transfer16(uint16_t* data,
size_t size)
override;
298 bool firstConfigApplied =
false;
330#ifndef _ARCH_CORTEXM7_STM32F7
336inline void SPIBus::set8bitRXNE() { spi->CR2 |= SPI_CR2_FRXTH; }
340 spi->CR2 &= ~SPI_CR2_DS;
350 spi->CR1 &= ~SPI_CR1_SSM;
357 spi->CR1 &= ~SPI_CR1_SSI;
363 spi->CR1 &= ~SPI_CR1_LSBFIRST;
366 spi->CR1 |=
static_cast<uint32_t
>(bitOrder);
372 spi->CR1 &= ~SPI_CR1_BR;
375 spi->CR1 |=
static_cast<uint32_t
>(divider);
385 spi->CR1 &= ~(SPI_CR1_CPOL | SPI_CR1_CPHA);
388 spi->CR1 |=
static_cast<uint32_t
>(mode);
401 while ((spi->SR & SPI_SR_TXE) == 0)
403 while ((spi->SR & SPI_SR_BSY) > 0)
409 while ((spi->SR & SPI_SR_RXNE) != 0)
416 if (!firstConfigApplied || newConfig != config)
420 firstConfigApplied =
true;
475 for (
size_t i = 0; i < nBytes; i++)
482 assert(nBytes % 2 == 0);
484 uint16_t temp[2] = {0};
485 for (
size_t i = 0; i < nBytes / 2; i++)
488 temp[0] =
static_cast<uint16_t
>(
read());
490 temp[1] =
static_cast<uint16_t
>(
read());
493 data[i] = temp[0] << 8 | temp[1];
507 for (
size_t i = 0; i < nBytes; i++)
514 assert(nBytes % 2 == 0);
516 for (
size_t i = 0; i < nBytes / 2; i++)
519 write(
static_cast<uint8_t
>(data[i] >> 8));
521 write(
static_cast<uint8_t
>(data[i]));
541 while ((spi->SR & SPI_SR_TXE) == 0)
545 *(
volatile uint8_t*)&spi->DR =
static_cast<uint8_t
>(data);
548 while ((spi->SR & SPI_SR_TXE) == 0)
550 while ((spi->SR & SPI_SR_BSY) > 0)
554 while ((spi->SR & SPI_SR_RXNE) == 0)
558 return static_cast<uint8_t
>(spi->DR);
563 uint16_t temp[2] = {0};
565 temp[0] =
static_cast<uint16_t
>(
transfer(
static_cast<uint8_t
>(data >> 8)));
567 temp[1] =
static_cast<uint16_t
>(
transfer(
static_cast<uint8_t
>(data)));
569 return temp[0] << 8 | temp[1];
574 uint32_t temp[3] = {0};
576 temp[0] =
static_cast<uint32_t
>(
transfer(
static_cast<uint8_t
>(data >> 16)));
577 temp[1] =
static_cast<uint32_t
>(
transfer(
static_cast<uint8_t
>(data >> 8)));
579 temp[2] =
static_cast<uint32_t
>(
transfer(
static_cast<uint8_t
>(data)));
581 return temp[0] << 16 | temp[1] << 8 | temp[2];
586 uint32_t temp[4] = {0};
588 temp[0] =
static_cast<uint32_t
>(
transfer(
static_cast<uint8_t
>(data >> 24)));
589 temp[1] =
static_cast<uint32_t
>(
transfer(
static_cast<uint8_t
>(data >> 16)));
590 temp[2] =
static_cast<uint32_t
>(
transfer(
static_cast<uint8_t
>(data >> 8)));
592 temp[3] =
transfer(
static_cast<uint8_t
>(data));
594 return temp[0] << 24 | temp[1] << 16 | temp[2] << 8 | temp[3];
599 for (
size_t i = 0; i < nBytes; i++)
606 assert(nBytes % 2 == 0);
608 uint16_t temp[2] = {0};
610 for (
size_t i = 0; i < nBytes / 2; i++)
613 static_cast<uint16_t
>(
transfer(
static_cast<uint8_t
>(data[i] >> 8)));
615 static_cast<uint16_t
>(
transfer(
static_cast<uint8_t
>(data[i])));
616 data[i] = temp[0] << 8 | temp[1];
Driver for STM32 low level SPI peripheral.
uint32_t transfer32(uint32_t data) override
Full duplex transmission of 32 bits on the bus.
SPIBus(SPIType *spi)
Delete copy/move contructors/operators.
uint8_t transfer(uint8_t data) override
Full duplex transmission of 8 bits on the bus.
uint32_t read32() override
Reads 32 bits from the bus.
void configure(SPIBusConfig newConfig) override
Configures and enables the bus with the provided configuration.
void setBitOrder(SPI::Order bitOrder)
void enableRxDMARequest()
void disable()
Disables the peripheral.
void write16(uint16_t data) override
Writes 16 bits to the bus.
void write(uint8_t data) override
Writes 8 bits to the bus.
void setMasterConfiguration()
void setClockDiver(SPI::ClockDivider divider)
void setMode(SPI::Mode mode)
void enable()
Enables the peripheral.
SPIType * getSpi()
Retrieve the pointer to the peripheral currently used.
void enableTxDMARequest()
void setSlaveConfiguration()
SPIBus(const SPIBus &)=delete
void disableInternalSlaveSelection()
void disableTxDMARequest()
SPIBus & operator=(SPIBus &&)=delete
uint16_t transfer16(uint16_t data) override
Full duplex transmission of 16 bits on the bus.
uint8_t read() override
Reads 8 bits from the bus.
void enableInternalSlaveSelection()
void write32(uint32_t data) override
Writes 32 bits to the bus.
void write24(uint32_t data) override
Writes 24 bits to the bus.
void disableRxDMARequest()
void set8BitFrameFormat()
uint16_t read16() override
Reads 16 bits from the bus.
void enableSoftwareSlaveManagement()
uint32_t transfer24(uint32_t data) override
Full duplex transmission of 24 bits on the bus.
void disableSoftwareSlaveManagement()
void select(GpioType cs) override
See SPIBusInterface::select().
void deselect(GpioType cs) override
See SPIBusInterface::deselect().
uint32_t read24() override
Reads 24 bits from the bus.
SPIBus & operator=(const SPIBus &)=delete
void reset()
Resets the peripheral configuration.
Interface for low level access of a SPI bus as a master.
bool enablePeripheralClock(void *peripheral)
Enables a peripheral clock source from the APB1 and APB2 peripheral buses.
ClockDivider
SPI Clock divider.
This file includes all the types the logdecoder script will decode.
SPI Bus configuration for a specific slave.
unsigned int csHoldTimeUs
unsigned int csSetupTimeUs
How long to hold cs after the end of a tranmission (us)
SPI::Mode mode
MSBit or LSBit first.
SPI::ClockDivider clockDivider
< Peripheral clock division