13bool isSpiInitialized[SPI_TOTAL_COUNT + 1] = {
true,
false,
false,
false,
false,
false,
false };
17 if (driver == &
SPID1) {
22 if (driver == &
SPID2) {
27 if (driver == &SPID3) {
32 if (driver == &SPID4) {
37 if (driver == &SPID5) {
42 if (driver == &SPID6) {
46 criticalError(
"SPI AF not available");
54 if (
device == SPI_DEVICE_1) {
65 criticalError(
"SPI1 not available in this binary");
68 if (
device == SPI_DEVICE_2) {
78 criticalError(
"SPI2 not available in this binary");
81 if (
device == SPI_DEVICE_3) {
91 criticalError(
"SPI3 not available in this binary");
94 if (
device == SPI_DEVICE_4) {
103 criticalError(
"SPI4 not available in this binary");
106 if (
device == SPI_DEVICE_5) {
107#if STM32_SPI_USE_SPI5
115 criticalError(
"SPI5 not available in this binary");
118 if (
device == SPI_DEVICE_6) {
119#if STM32_SPI_USE_SPI6
127 criticalError(
"SPI6 not available in this binary");
134 int sckMode,
int mosiMode,
int misoMode) {
142 efiSetPadMode(
"SPI CLK ", sck, PAL_MODE_ALTERNATE(
getSpiAf(driver)) | sckMode | PAL_STM32_OSPEED_HIGHEST);
144 efiSetPadMode(
"SPI MOSI", mosi, PAL_MODE_ALTERNATE(
getSpiAf(driver)) | mosiMode | PAL_STM32_OSPEED_HIGHEST);
150 efiSetPadMode(
"SPI MISO", miso, PAL_MODE_ALTERNATE(
getSpiAf(driver)) | misoMode | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUPDR_PULLUP);
156 spiConfig->ssport = port;
157 spiConfig->sspad =
pin;
162#ifdef _CHIBIOS_RT_CONF_VER_6_1_
163 spiConfig->end_cb =
nullptr;
165 spiConfig->data_cb =
nullptr;
166 spiConfig->error_cb =
nullptr;
175#if STM32_SPI_USE_SPI1
176 if (spip == &
SPID1) {
181#if STM32_SPI_USE_SPI2
182 if (spip == &
SPID2) {
187#if STM32_SPI_USE_SPI3
188 if (spip == &SPID3) {
193#if STM32_SPI_USE_SPI4
194 if (spip == &SPID4) {
199#if STM32_SPI_USE_SPI5
200 if (spip == &SPID5) {
205#if STM32_SPI_USE_SPI6
206 if (spip == &SPID6) {
225int spiCalcClockDiv(SPIDriver *spip, SPIConfig *spiConfig,
unsigned int clk)
233 if (baseClock == 0) {
238 int div = (baseClock + clk - 1) / clk;
240 spiConfig->cr1 &= ~SPI_CR1_BR_Msk;
242 spiConfig->cr1 |= SPI_BaudRatePrescaler_2;
243 }
else if (div <= 4) {
244 spiConfig->cr1 |= SPI_BaudRatePrescaler_4;
245 }
else if (div <= 8) {
246 spiConfig->cr1 |= SPI_BaudRatePrescaler_8;
247 }
else if (div <= 16) {
248 spiConfig->cr1 |= SPI_BaudRatePrescaler_16;
249 }
else if (div <= 32) {
250 spiConfig->cr1 |= SPI_BaudRatePrescaler_32;
251 }
else if (div <= 64) {
252 spiConfig->cr1 |= SPI_BaudRatePrescaler_64;
253 }
else if (div <= 128) {
254 spiConfig->cr1 |= SPI_BaudRatePrescaler_128;
256 spiConfig->cr1 |= SPI_BaudRatePrescaler_256;
269#ifdef _CHIBIOS_RT_CONF_VER_6_1_
286#ifdef _CHIBIOS_RT_CONF_VER_6_1_
311#ifdef _CHIBIOS_RT_CONF_VER_6_1_
320 .cr1 = SPI_BaudRatePrescaler_2,
326#ifdef _CHIBIOS_RT_CONF_VER_6_1_
335 .cr1 = SPI_BaudRatePrescaler_8,
void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode)
ioportid_t getHwPort(const char *msg, brain_pin_e brainPin)
ioportmask_t getHwPin(const char *msg, brain_pin_e brainPin)
static constexpr engine_configuration_s * engineConfiguration
uint32_t ioportmask_t
Digital I/O port sized unsigned type.
GPIO_TypeDef * ioportid_t
Port Identifier.
SPIDriver SPID1
SPI0 driver identifier.
SPIDriver SPID2
SPI1 driver identifier.
brain_pin_e getSckPin(spi_device_e device)
brain_pin_e getMosiPin(spi_device_e device)
brain_pin_e getMisoPin(spi_device_e device)
int spiCalcClockDiv(SPIDriver *, SPIConfig *, unsigned int)
int spiGetBaseClock(SPIDriver *spip)
static int getSpiAf(SPIDriver *driver)
void initSpiModule(SPIDriver *driver, brain_pin_e sck, brain_pin_e miso, brain_pin_e mosi, int sckMode, int mosiMode, int misoMode)
void initSpiCsNoOccupy(SPIConfig *spiConfig, brain_pin_e csPin)
bool isSpiInitialized[SPI_TOTAL_COUNT+1]
void turnOnSpi(spi_device_e device)
void initSpiCs(SPIConfig *spiConfig, brain_pin_e csPin)