mbed library sources
Fork of mbed-src by
Diff: targets/hal/TARGET_STM/TARGET_STM32F4/spi_api.c
- 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); }