diff --git a/src/main/drivers/bus_spi.c b/src/main/drivers/bus_spi.c index 89e44f9fb8..bed9c2a5dd 100644 --- a/src/main/drivers/bus_spi.c +++ b/src/main/drivers/bus_spi.c @@ -80,10 +80,9 @@ void spiInitDevice(SPIDevice device) IOInit(IOGetByTag(spi->mosi), OWNER_SPI_MOSI, RESOURCE_INDEX(device)); #if defined(STM32F3) || defined(STM32F4) - IOConfigGPIOAF(IOGetByTag(spi->sck), SPI_IO_AF_CFG, spi->sckAF); - IOConfigGPIOAF(IOGetByTag(spi->miso), SPI_IO_AF_CFG, spi->misoAF); - IOConfigGPIOAF(IOGetByTag(spi->mosi), SPI_IO_AF_CFG, spi->mosiAF); - + IOConfigGPIOAF(IOGetByTag(spi->sck), SPI_IO_AF_CFG, spi->af); + IOConfigGPIOAF(IOGetByTag(spi->miso), SPI_IO_AF_CFG, spi->af); + IOConfigGPIOAF(IOGetByTag(spi->mosi), SPI_IO_AF_CFG, spi->af); #endif #if defined(STM32F10X) IOConfigGPIO(IOGetByTag(spi->sck), SPI_IO_AF_SCK_CFG); diff --git a/src/main/drivers/bus_spi_hal.c b/src/main/drivers/bus_spi_hal.c index 3ba5031d1d..4c3964b524 100644 --- a/src/main/drivers/bus_spi_hal.c +++ b/src/main/drivers/bus_spi_hal.c @@ -17,6 +17,7 @@ #include #include +#include #include @@ -113,7 +114,7 @@ void spiInitDevice(SPIDevice device) IOInit(IOGetByTag(spi->miso), OWNER_SPI_MISO, RESOURCE_INDEX(device)); IOInit(IOGetByTag(spi->mosi), OWNER_SPI_MOSI, RESOURCE_INDEX(device)); -#if defined(STM32F3) || defined(STM32F4) || defined(STM32F7) +#if defined(STM32F7) if(spi->leadingEdge == true) IOConfigGPIOAF(IOGetByTag(spi->sck), SPI_IO_AF_SCK_CFG_LOW, spi->sckAF); else @@ -121,6 +122,14 @@ void spiInitDevice(SPIDevice device) IOConfigGPIOAF(IOGetByTag(spi->miso), SPI_IO_AF_MISO_CFG, spi->misoAF); IOConfigGPIOAF(IOGetByTag(spi->mosi), SPI_IO_AF_CFG, spi->mosiAF); #endif +#if defined(STM32F3) || defined(STM32F4) + if(spi->leadingEdge == true) + IOConfigGPIOAF(IOGetByTag(spi->sck), SPI_IO_AF_SCK_CFG_LOW, spi->af); + else + IOConfigGPIOAF(IOGetByTag(spi->sck), SPI_IO_AF_SCK_CFG_HIGH, spi->af); + IOConfigGPIOAF(IOGetByTag(spi->miso), SPI_IO_AF_MISO_CFG, spi->af); + IOConfigGPIOAF(IOGetByTag(spi->mosi), SPI_IO_AF_CFG, spi->af); +#endif #if defined(STM32F10X) IOConfigGPIO(IOGetByTag(spi->sck), SPI_IO_AF_SCK_CFG); IOConfigGPIO(IOGetByTag(spi->miso), SPI_IO_AF_MISO_CFG); @@ -246,7 +255,6 @@ bool spiTransfer(SPI_TypeDef *instance, uint8_t *out, const uint8_t *in, int len return true; } - void spiSetDivisor(SPI_TypeDef *instance, uint16_t divisor) { SPIDevice device = spiDeviceByInstance(instance); @@ -254,39 +262,11 @@ void spiSetDivisor(SPI_TypeDef *instance, uint16_t divisor) { } - switch (divisor) { - case 2: - spiDevice[device].hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - break; - - case 4: - spiDevice[device].hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; - break; - - case 8: - spiDevice[device].hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; - break; - - case 16: - spiDevice[device].hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; - break; - - case 32: - spiDevice[device].hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; - break; - - case 64: - spiDevice[device].hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; - break; - - case 128: - spiDevice[device].hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; - break; - - case 256: - spiDevice[device].hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; - break; - } + spiDevice[device].hspi.Init.BaudRatePrescaler = (uint8_t []) { + SPI_BAUDRATEPRESCALER_2, SPI_BAUDRATEPRESCALER_4, + SPI_BAUDRATEPRESCALER_8, SPI_BAUDRATEPRESCALER_16, + SPI_BAUDRATEPRESCALER_32, SPI_BAUDRATEPRESCALER_64, + SPI_BAUDRATEPRESCALER_128, SPI_BAUDRATEPRESCALER_256}[ffs(divisor) - 1]; if (HAL_SPI_Init(&spiDevice[device].hspi) == HAL_OK) { diff --git a/src/main/drivers/bus_spi_impl.h b/src/main/drivers/bus_spi_impl.h index b2373293fe..fe9ed35598 100644 --- a/src/main/drivers/bus_spi_impl.h +++ b/src/main/drivers/bus_spi_impl.h @@ -25,7 +25,9 @@ typedef struct spiPinDef_s { ioTag_t pin; +#ifdef STM32F7 uint8_t af; +#endif } spiPinDef_t; typedef struct spiHardware_s { @@ -34,6 +36,9 @@ typedef struct spiHardware_s { spiPinDef_t sckPins[MAX_SPI_PIN_SEL]; spiPinDef_t misoPins[MAX_SPI_PIN_SEL]; spiPinDef_t mosiPins[MAX_SPI_PIN_SEL]; +#ifndef STM32F7 + uint8_t af; +#endif rccPeriphTag_t rcc; #if defined(USE_HAL_DRIVER) uint8_t dmaIrqHandler; @@ -47,9 +52,13 @@ typedef struct SPIDevice_s { ioTag_t sck; ioTag_t miso; ioTag_t mosi; +#ifdef STM32F7 uint8_t sckAF; uint8_t misoAF; uint8_t mosiAF; +#else + uint8_t af; +#endif rccPeriphTag_t rcc; volatile uint16_t errorCount; bool leadingEdge; diff --git a/src/main/drivers/bus_spi_pinconfig.c b/src/main/drivers/bus_spi_pinconfig.c index 372e8a131d..89d33e3725 100644 --- a/src/main/drivers/bus_spi_pinconfig.c +++ b/src/main/drivers/bus_spi_pinconfig.c @@ -160,51 +160,54 @@ const spiHardware_t spiHardware[] = { .device = SPIDEV_1, .reg = SPI1, .sckPins = { - { DEFIO_TAG_E(PA5), GPIO_AF_SPI1 }, - { DEFIO_TAG_E(PB3), GPIO_AF_SPI1 }, + { DEFIO_TAG_E(PA5) }, + { DEFIO_TAG_E(PB3) }, }, .misoPins = { - { DEFIO_TAG_E(PA6), GPIO_AF_SPI1 }, - { DEFIO_TAG_E(PB4), GPIO_AF_SPI1 }, + { DEFIO_TAG_E(PA6) }, + { DEFIO_TAG_E(PB4) }, }, .mosiPins = { - { DEFIO_TAG_E(PA7), GPIO_AF_SPI1 }, + { DEFIO_TAG_E(PA7) }, { DEFIO_TAG_E(PB5), GPIO_AF_SPI1 }, }, + .af = GPIO_AF_SPI1, .rcc = RCC_APB2(SPI1), }, { .device = SPIDEV_2, .reg = SPI2, .sckPins = { - { DEFIO_TAG_E(PB13), GPIO_AF_SPI2 }, - { DEFIO_TAG_E(PB3), GPIO_AF_SPI2 }, + { DEFIO_TAG_E(PB13) }, + { DEFIO_TAG_E(PB3) }, }, .misoPins = { - { DEFIO_TAG_E(PB14), GPIO_AF_SPI2 }, - { DEFIO_TAG_E(PB4), GPIO_AF_SPI2 }, + { DEFIO_TAG_E(PB14) }, + { DEFIO_TAG_E(PB4) }, }, .mosiPins = { - { DEFIO_TAG_E(PB15), GPIO_AF_SPI2 }, - { DEFIO_TAG_E(PB5), GPIO_AF_SPI2 }, + { DEFIO_TAG_E(PB15) }, + { DEFIO_TAG_E(PB5) }, }, + .af = GPIO_AF_SPI2, .rcc = RCC_APB1(SPI2), }, { .device = SPIDEV_3, .reg = SPI3, .sckPins = { - { DEFIO_TAG_E(PB3), GPIO_AF_SPI3 }, - { DEFIO_TAG_E(PC10), GPIO_AF_SPI3 }, + { DEFIO_TAG_E(PB3) }, + { DEFIO_TAG_E(PC10) }, }, .misoPins = { - { DEFIO_TAG_E(PB4), GPIO_AF_SPI3 }, - { DEFIO_TAG_E(PC11), GPIO_AF_SPI3 }, + { DEFIO_TAG_E(PB4) }, + { DEFIO_TAG_E(PC11) }, }, .mosiPins = { - { DEFIO_TAG_E(PB5), GPIO_AF_SPI3 }, - { DEFIO_TAG_E(PC12), GPIO_AF_SPI3 }, + { DEFIO_TAG_E(PB5) }, + { DEFIO_TAG_E(PC12) }, }, + .af = GPIO_AF_SPI3, .rcc = RCC_APB1(SPI3), }, #endif @@ -213,51 +216,54 @@ const spiHardware_t spiHardware[] = { .device = SPIDEV_1, .reg = SPI1, .sckPins = { - { DEFIO_TAG_E(PA5), GPIO_AF_SPI1 }, - { DEFIO_TAG_E(PB3), GPIO_AF_SPI1 }, + { DEFIO_TAG_E(PA5) }, + { DEFIO_TAG_E(PB3) }, }, .misoPins = { - { DEFIO_TAG_E(PA6), GPIO_AF_SPI1 }, - { DEFIO_TAG_E(PB4), GPIO_AF_SPI1 }, + { DEFIO_TAG_E(PA6) }, + { DEFIO_TAG_E(PB4) }, }, .mosiPins = { - { DEFIO_TAG_E(PA7), GPIO_AF_SPI1 }, - { DEFIO_TAG_E(PB5), GPIO_AF_SPI1 }, + { DEFIO_TAG_E(PA7) }, + { DEFIO_TAG_E(PB5) }, }, + .af = GPIO_AF_SPI1, .rcc = RCC_APB2(SPI1), }, { .device = SPIDEV_2, .reg = SPI2, .sckPins = { - { DEFIO_TAG_E(PB10), GPIO_AF_SPI2 }, - { DEFIO_TAG_E(PB13), GPIO_AF_SPI2 }, + { DEFIO_TAG_E(PB10) }, + { DEFIO_TAG_E(PB13) }, }, .misoPins = { - { DEFIO_TAG_E(PB14), GPIO_AF_SPI2 }, - { DEFIO_TAG_E(PC2), GPIO_AF_SPI2 }, + { DEFIO_TAG_E(PB14) }, + { DEFIO_TAG_E(PC2) }, }, .mosiPins = { - { DEFIO_TAG_E(PB15), GPIO_AF_SPI2 }, - { DEFIO_TAG_E(PC3), GPIO_AF_SPI2 }, + { DEFIO_TAG_E(PB15) }, + { DEFIO_TAG_E(PC3) }, }, + .af = GPIO_AF_SPI2, .rcc = RCC_APB1(SPI2), }, { .device = SPIDEV_3, .reg = SPI3, .sckPins = { - { DEFIO_TAG_E(PB3), GPIO_AF_SPI3 }, - { DEFIO_TAG_E(PC10), GPIO_AF_SPI3 }, + { DEFIO_TAG_E(PB3) }, + { DEFIO_TAG_E(PC10) }, }, .misoPins = { - { DEFIO_TAG_E(PB4), GPIO_AF_SPI3 }, - { DEFIO_TAG_E(PC11), GPIO_AF_SPI3 }, + { DEFIO_TAG_E(PB4) }, + { DEFIO_TAG_E(PC11) }, }, .mosiPins = { - { DEFIO_TAG_E(PB5), GPIO_AF_SPI3 }, - { DEFIO_TAG_E(PC12), GPIO_AF_SPI3 }, + { DEFIO_TAG_E(PB5) }, + { DEFIO_TAG_E(PC12) }, }, + .af = GPIO_AF_SPI3, .rcc = RCC_APB1(SPI3), }, #endif @@ -326,7 +332,7 @@ const spiHardware_t spiHardware[] = { .reg = SPI4, .sckPins = { { DEFIO_TAG_E(PE2), GPIO_AF5_SPI4 }, - { DEFIO_TAG_E(PE12), GPIO_AF6_SPI3 }, + { DEFIO_TAG_E(PE12), GPIO_AF5_SPI4 }, }, .misoPins = { { DEFIO_TAG_E(PE5), GPIO_AF5_SPI4 }, @@ -346,33 +352,42 @@ void spiPinConfigure(void) { const spiPinConfig_t *pConfig = spiPinConfig(); - for (size_t hwindex = 0 ; hwindex < ARRAYLEN(spiDefaultConfig) ; hwindex++) { + for (size_t hwindex = 0 ; hwindex < ARRAYLEN(spiHardware) ; hwindex++) { const spiHardware_t *hw = &spiHardware[hwindex]; if (!hw->reg) { continue; } - int device = hw->device; + SPIDevice device = hw->device; spiDevice_t *pDev = &spiDevice[device]; for (int pindex = 0 ; pindex < MAX_SPI_PIN_SEL ; pindex++) { if (pConfig->ioTagSck[device] == hw->sckPins[pindex].pin) { pDev->sck = hw->sckPins[pindex].pin; +#ifdef STM32F7 pDev->sckAF = hw->sckPins[pindex].af; +#endif } if (pConfig->ioTagMiso[device] == hw->misoPins[pindex].pin) { pDev->miso = hw->misoPins[pindex].pin; +#ifdef STM32F7 pDev->misoAF = hw->misoPins[pindex].af; +#endif } if (pConfig->ioTagMosi[device] == hw->mosiPins[pindex].pin) { pDev->mosi = hw->mosiPins[pindex].pin; +#ifdef STM32F7 pDev->mosiAF = hw->mosiPins[pindex].af; +#endif } } if (pDev->sck && pDev->miso && pDev->mosi) { pDev->dev = hw->reg; +#ifndef STM32F7 + pDev->af = hw->af; +#endif pDev->rcc = hw->rcc; pDev->leadingEdge = false; // XXX Should be part of transfer context #ifdef USE_HAL_DRIVER