mbed library sources

Fork of mbed-src by mbed official

Revision:
613:bc40b8d2aec4
Parent:
552:a1b9575155a3
--- a/targets/hal/TARGET_STM/TARGET_STM32F4/spi_api.c	Tue Aug 18 15:00:09 2015 +0100
+++ b/targets/hal/TARGET_STM/TARGET_STM32F4/spi_api.c	Thu Aug 20 10:45:13 2015 +0100
@@ -1,6 +1,6 @@
 /* mbed Microcontroller Library
  *******************************************************************************
- * Copyright (c) 2014, STMicroelectronics
+ * Copyright (c) 2015, STMicroelectronics
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -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);
 }
@@ -78,26 +81,26 @@
 
     // Enable SPI clock
     if (obj->spi == SPI_1) {
-        __SPI1_CLK_ENABLE();
+        __HAL_RCC_SPI1_CLK_ENABLE();
     }
 
     if (obj->spi == SPI_2) {
-        __SPI2_CLK_ENABLE();
+        __HAL_RCC_SPI2_CLK_ENABLE();
     }
 
     if (obj->spi == SPI_3) {
-        __SPI3_CLK_ENABLE();
+        __HAL_RCC_SPI3_CLK_ENABLE();
     }
 
 #if defined SPI4_BASE
     if (obj->spi == SPI_4) {
-        __SPI4_CLK_ENABLE();
+        __HAL_RCC_SPI4_CLK_ENABLE();
     }
 #endif
 
 #if defined SPI5_BASE
     if (obj->spi == SPI_5) {
-        __SPI5_CLK_ENABLE();
+        __HAL_RCC_SPI5_CLK_ENABLE();
     }
 #endif
 
@@ -130,36 +133,36 @@
 {
     // Reset SPI and disable clock
     if (obj->spi == SPI_1) {
-        __SPI1_FORCE_RESET();
-        __SPI1_RELEASE_RESET();
-        __SPI1_CLK_DISABLE();
+        __HAL_RCC_SPI1_FORCE_RESET();
+        __HAL_RCC_SPI1_RELEASE_RESET();
+        __HAL_RCC_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();
+        __HAL_RCC_SPI3_FORCE_RESET();
+        __HAL_RCC_SPI3_RELEASE_RESET();
+        __HAL_RCC_SPI3_CLK_DISABLE();
     }
 
 #if defined SPI4_BASE
     if (obj->spi == SPI_4) {
-        __SPI4_FORCE_RESET();
-        __SPI4_RELEASE_RESET();
-        __SPI4_CLK_DISABLE();
+        __HAL_RCC_SPI4_FORCE_RESET();
+        __HAL_RCC_SPI4_RELEASE_RESET();
+        __HAL_RCC_SPI4_CLK_DISABLE();
     }
 #endif
 
 #if defined SPI5_BASE
     if (obj->spi == SPI_5) {
-        __SPI5_FORCE_RESET();
-        __SPI5_RELEASE_RESET();
-        __SPI5_CLK_DISABLE();
+        __HAL_RCC_SPI5_FORCE_RESET();
+        __HAL_RCC_SPI5_RELEASE_RESET();
+        __HAL_RCC_SPI5_CLK_DISABLE();
     }
 #endif
 
@@ -289,7 +292,6 @@
             obj->br_presc = SPI_BAUDRATEPRESCALER_2;   // 50 MHz
         }
     }
-
     // Values depend of PCLK1: 50 MHz
     if ((obj->spi == SPI_2) || (obj->spi == SPI_3)) {
         if (hz < 400000) {
@@ -310,6 +312,47 @@
             obj->br_presc = SPI_BAUDRATEPRESCALER_2;   // 25 MHz
         }
     }
+#elif defined(TARGET_STM32F446RE)
+    // Values depend of PCLK2: 90 MHz
+    if ((obj->spi == SPI_1) || (obj->spi == SPI_4)) {
+        if (hz < 700000) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 352 kHz
+        } else if ((hz >= 700000) && (hz < 1000000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 703 kHz
+        } else if ((hz >= 1000000) && (hz < 3000000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_64;  // 1.41 MHz
+        } else if ((hz >= 3000000) && (hz < 5000000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_32;  // 2.81 MHz
+        } else if ((hz >= 5000000) && (hz < 11000000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_16;  // 5.63 MHz
+        } else if ((hz >= 11000000) && (hz < 22000000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_8;   // 11.25 MHz
+        } else if ((hz >= 22000000) && (hz < 45000000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_4;   // 22.5 MHz
+        } else { // >= 45000000
+            obj->br_presc = SPI_BAUDRATEPRESCALER_2;   // 45 MHz
+        }
+    }
+    // Values depend of PCLK1: 45 MHz
+    if ((obj->spi == SPI_2) || (obj->spi == SPI_3)) {
+        if (hz < 350000) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 176 kHz
+        } else if ((hz >= 350000) && (hz < 700000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 352 kHz
+        } else if ((hz >= 700000) && (hz < 1000000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_64;  // 703 kHz
+        } else if ((hz >= 1000000) && (hz < 3000000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_32;  // 1.41 MHz
+        } else if ((hz >= 3000000) && (hz < 5000000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_16;  // 2.81 MHz
+        } else if ((hz >= 5000000) && (hz < 11000000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_8;   // 5.63 MHz
+        } else if ((hz >= 11000000) && (hz < 22000000)) {
+            obj->br_presc = SPI_BAUDRATEPRESCALER_4;   // 11.25 MHz
+        } else { // >= 22000000
+            obj->br_presc = SPI_BAUDRATEPRESCALER_2;   // 22.5 MHz
+        }
+    }    
 #endif
     init_spi(obj);
 }