mbed library sources
Fork of mbed-src by
Diff: targets/hal/TARGET_STM/TARGET_STM32F7/spi_api.c
- Revision:
- 582:a89625bcd809
- Parent:
- 573:ad23fe03a082
--- a/targets/hal/TARGET_STM/TARGET_STM32F7/spi_api.c Thu Jul 02 16:30:08 2015 +0100 +++ b/targets/hal/TARGET_STM/TARGET_STM32F7/spi_api.c Mon Jul 06 09:00:34 2015 +0100 @@ -36,6 +36,7 @@ #include "cmsis.h" #include "pinmap.h" #include "PeripheralPins.h" +#include "mbed_error.h" static SPI_HandleTypeDef SpiHandle; @@ -57,7 +58,9 @@ SpiHandle.Init.NSS = obj->nss; SpiHandle.Init.TIMode = SPI_TIMODE_DISABLED; - HAL_SPI_Init(&SpiHandle); + if (HAL_SPI_Init(&SpiHandle) != HAL_OK) { + error("Cannot initialize SPI"); + } __HAL_SPI_ENABLE(&SpiHandle); } @@ -77,29 +80,13 @@ MBED_ASSERT(obj->spi != (SPIName)NC); // Enable SPI clock - if (obj->spi == SPI_1) { - __SPI1_CLK_ENABLE(); - } - if (obj->spi == SPI_2) { - __SPI2_CLK_ENABLE(); - } - - if (obj->spi == SPI_3) { - __SPI3_CLK_ENABLE(); + __HAL_RCC_SPI2_CLK_ENABLE(); } -#if defined SPI4_BASE - if (obj->spi == SPI_4) { - __SPI4_CLK_ENABLE(); + if (obj->spi == SPI_5) { + __HAL_RCC_SPI5_CLK_ENABLE(); } -#endif - -#if defined SPI5_BASE - if (obj->spi == SPI_5) { - __SPI5_CLK_ENABLE(); - } -#endif // Configure the SPI pins pinmap_pinout(mosi, PinMap_SPI_MOSI); @@ -129,40 +116,18 @@ void spi_free(spi_t *obj) { // Reset SPI and disable clock - if (obj->spi == SPI_1) { - __SPI1_FORCE_RESET(); - __SPI1_RELEASE_RESET(); - __SPI1_CLK_DISABLE(); - } - if (obj->spi == SPI_2) { - __SPI2_FORCE_RESET(); - __SPI2_RELEASE_RESET(); - __SPI2_CLK_DISABLE(); + __HAL_RCC_SPI2_FORCE_RESET(); + __HAL_RCC_SPI2_RELEASE_RESET(); + __HAL_RCC_SPI2_CLK_DISABLE(); } - if (obj->spi == SPI_3) { - __SPI3_FORCE_RESET(); - __SPI3_RELEASE_RESET(); - __SPI3_CLK_DISABLE(); + if (obj->spi == SPI_5) { + __HAL_RCC_SPI5_FORCE_RESET(); + __HAL_RCC_SPI5_RELEASE_RESET(); + __HAL_RCC_SPI5_CLK_DISABLE(); } -#if defined SPI4_BASE - if (obj->spi == SPI_4) { - __SPI4_FORCE_RESET(); - __SPI4_RELEASE_RESET(); - __SPI4_CLK_DISABLE(); - } -#endif - -#if defined SPI5_BASE - if (obj->spi == SPI_5) { - __SPI5_FORCE_RESET(); - __SPI5_RELEASE_RESET(); - __SPI5_CLK_DISABLE(); - } -#endif - // Configure GPIOs pin_function(obj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)); pin_function(obj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)); @@ -209,108 +174,48 @@ void spi_frequency(spi_t *obj, int hz) { -#if defined(TARGET_STM32F401RE) || defined(TARGET_STM32F401VC) || defined(TARGET_STM32F407VG) - // Note: The frequencies are obtained with SPI1 clock = 84 MHz (APB2 clock) - if (hz < 600000) { - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 330 kHz - } else if ((hz >= 600000) && (hz < 1000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 656 kHz - } else if ((hz >= 1000000) && (hz < 2000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.3 MHz - } else if ((hz >= 2000000) && (hz < 5000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 2.6 MHz - } else if ((hz >= 5000000) && (hz < 10000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 5.25 MHz - } else if ((hz >= 10000000) && (hz < 21000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 10.5 MHz - } else if ((hz >= 21000000) && (hz < 42000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 21 MHz - } else { // >= 42000000 - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 42 MHz - } -#elif defined(TARGET_STM32F405RG) - // Note: The frequencies are obtained with SPI1 clock = 48 MHz (APB2 clock) - if (obj->spi == SPI_1) { - if (hz < 375000) { - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 187.5 kHz - } else if ((hz >= 375000) && (hz < 750000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 375 kHz - } else if ((hz >= 750000) && (hz < 1500000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 0.75 MHz - } else if ((hz >= 1500000) && (hz < 3000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.5 MHz - } else if ((hz >= 3000000) && (hz < 6000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 3 MHz - } else if ((hz >= 6000000) && (hz < 12000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 6 MHz - } else if ((hz >= 12000000) && (hz < 24000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 12 MHz - } else { // >= 24000000 - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 24 MHz - } - // Note: The frequencies are obtained with SPI2/3 clock = 48 MHz (APB1 clock) - } else if ((obj->spi == SPI_2) || (obj->spi == SPI_3)) { - if (hz < 375000) { - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 187.5 kHz - } else if ((hz >= 375000) && (hz < 750000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 375 kHz - } else if ((hz >= 750000) && (hz < 1500000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 0.75 MHz - } else if ((hz >= 1500000) && (hz < 3000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.5 MHz + // The frequencies are obtained with: + // - SPI2 clock = 54 MHz (APB1 clock) + // - SPI5 clock = 108 MHz (APB2 clock) + if (obj->spi == SPI_2) { + if (hz < 400000) { + obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 211 kHz + } else if ((hz >= 400000) && (hz < 800000)) { + obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 422 kHz + } else if ((hz >= 800000) && (hz < 1000000)) { + obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 844 kHz + } else if ((hz >= 1000000) && (hz < 3000000)) { + obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.69 MHz } else if ((hz >= 3000000) && (hz < 6000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 3 MHz - } else if ((hz >= 6000000) && (hz < 12000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 6 MHz - } else if ((hz >= 12000000) && (hz < 24000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 12 MHz - } else { // >= 24000000 - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 24 MHz - } - } -#elif defined(TARGET_STM32F411RE) || defined(TARGET_STM32F429ZI) - // Values depend of PCLK2: 100 MHz - if ((obj->spi == SPI_1) || (obj->spi == SPI_4) || (obj->spi == SPI_5)) { - if (hz < 700000) { - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 391 kHz - } else if ((hz >= 700000) && (hz < 1000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 781 kHz - } else if ((hz >= 1000000) && (hz < 3000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.56 MHz - } else if ((hz >= 3000000) && (hz < 6000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 3.13 MHz + obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 3.38 MHz } else if ((hz >= 6000000) && (hz < 12000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 6.25 MHz - } else if ((hz >= 12000000) && (hz < 25000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 12.5 MHz - } else if ((hz >= 25000000) && (hz < 50000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 25 MHz - } else { // >= 50000000 - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 50 MHz + obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 6.75 MHz + } else if ((hz >= 12000000) && (hz < 24000000)) { + obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 13.5 MHz + } else { // >= 24000000 + obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 27 MHz } + } else if (obj->spi == SPI_5) { + if (hz < 800000) { + obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 422 kHz + } else if ((hz >= 800000) && (hz < 1000000)) { + obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 844 kHz + } else if ((hz >= 1000000) && (hz < 3000000)) { + obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.69 MHz + } else if ((hz >= 3000000) && (hz < 6000000)) { + obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 3.38 MHz + } else if ((hz >= 6000000) && (hz < 12000000)) { + obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 6.75 MHz + } else if ((hz >= 12000000) && (hz < 24000000)) { + obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 13.5 MHz + } else if ((hz >= 24000000) && (hz < 54000000)) { + obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 27 MHz + } else { // >= 54000000 + obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 54 MHz + } + } else { + return; } - - // Values depend of PCLK1: 50 MHz - if ((obj->spi == SPI_2) || (obj->spi == SPI_3)) { - if (hz < 400000) { - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 195 kHz - } else if ((hz >= 400000) && (hz < 700000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 391 kHz - } else if ((hz >= 700000) && (hz < 1000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 781 MHz - } else if ((hz >= 1000000) && (hz < 3000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.56 MHz - } else if ((hz >= 3000000) && (hz < 6000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 3.13 MHz - } else if ((hz >= 6000000) && (hz < 12000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 6.25 MHz - } else if ((hz >= 12000000) && (hz < 25000000)) { - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 12.5 MHz - } else { // >= 25000000 - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 25 MHz - } - } -#endif init_spi(obj); } @@ -336,14 +241,28 @@ { SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi); while (!ssp_writeable(obj)); - spi->DR = (uint16_t)value; + if (obj->bits == SPI_DATASIZE_8BIT) { + // Force 8-bit access to the data register + uint8_t *p_spi_dr = 0; + p_spi_dr = (uint8_t *) & (spi->DR); + *p_spi_dr = (uint8_t)value; + } else { // SPI_DATASIZE_16BIT + spi->DR = (uint16_t)value; + } } static inline int ssp_read(spi_t *obj) { SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi); while (!ssp_readable(obj)); - return (int)spi->DR; + if (obj->bits == SPI_DATASIZE_8BIT) { + // Force 8-bit access to the data register + uint8_t *p_spi_dr = 0; + p_spi_dr = (uint8_t *) & (spi->DR); + return (int)(*p_spi_dr); + } else { + return (int)spi->DR; + } } static inline int ssp_busy(spi_t *obj) @@ -369,14 +288,28 @@ { SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi); while (!ssp_readable(obj)); - return (int)spi->DR; + if (obj->bits == SPI_DATASIZE_8BIT) { + // Force 8-bit access to the data register + uint8_t *p_spi_dr = 0; + p_spi_dr = (uint8_t *) & (spi->DR); + return (int)(*p_spi_dr); + } else { + return (int)spi->DR; + } } void spi_slave_write(spi_t *obj, int value) { SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi); while (!ssp_writeable(obj)); - spi->DR = (uint16_t)value; + if (obj->bits == SPI_DATASIZE_8BIT) { + // Force 8-bit access to the data register + uint8_t *p_spi_dr = 0; + p_spi_dr = (uint8_t *) & (spi->DR); + *p_spi_dr = (uint8_t)value; + } else { // SPI_DATASIZE_16BIT + spi->DR = (uint16_t)value; + } } int spi_busy(spi_t *obj)