mbed library sources

Dependents:   Marvino mbot

Fork of mbed-src by mbed official

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)