Update SPI clock for STM32F446RE

pull/1305/head
bcostm 2015-08-17 16:41:06 +02:00
parent 188dd6580e
commit ded07a59b5
1 changed files with 66 additions and 23 deletions

View File

@ -1,6 +1,6 @@
/* mbed Microcontroller Library /* mbed Microcontroller Library
******************************************************************************* *******************************************************************************
* Copyright (c) 2014, STMicroelectronics * Copyright (c) 2015, STMicroelectronics
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -36,6 +36,7 @@
#include "cmsis.h" #include "cmsis.h"
#include "pinmap.h" #include "pinmap.h"
#include "PeripheralPins.h" #include "PeripheralPins.h"
#include "mbed_error.h"
static SPI_HandleTypeDef SpiHandle; static SPI_HandleTypeDef SpiHandle;
@ -57,7 +58,9 @@ static void init_spi(spi_t *obj)
SpiHandle.Init.NSS = obj->nss; SpiHandle.Init.NSS = obj->nss;
SpiHandle.Init.TIMode = SPI_TIMODE_DISABLED; 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); __HAL_SPI_ENABLE(&SpiHandle);
} }
@ -78,26 +81,26 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
// Enable SPI clock // Enable SPI clock
if (obj->spi == SPI_1) { if (obj->spi == SPI_1) {
__SPI1_CLK_ENABLE(); __HAL_RCC_SPI1_CLK_ENABLE();
} }
if (obj->spi == SPI_2) { if (obj->spi == SPI_2) {
__SPI2_CLK_ENABLE(); __HAL_RCC_SPI2_CLK_ENABLE();
} }
if (obj->spi == SPI_3) { if (obj->spi == SPI_3) {
__SPI3_CLK_ENABLE(); __HAL_RCC_SPI3_CLK_ENABLE();
} }
#if defined SPI4_BASE #if defined SPI4_BASE
if (obj->spi == SPI_4) { if (obj->spi == SPI_4) {
__SPI4_CLK_ENABLE(); __HAL_RCC_SPI4_CLK_ENABLE();
} }
#endif #endif
#if defined SPI5_BASE #if defined SPI5_BASE
if (obj->spi == SPI_5) { if (obj->spi == SPI_5) {
__SPI5_CLK_ENABLE(); __HAL_RCC_SPI5_CLK_ENABLE();
} }
#endif #endif
@ -130,36 +133,36 @@ void spi_free(spi_t *obj)
{ {
// Reset SPI and disable clock // Reset SPI and disable clock
if (obj->spi == SPI_1) { if (obj->spi == SPI_1) {
__SPI1_FORCE_RESET(); __HAL_RCC_SPI1_FORCE_RESET();
__SPI1_RELEASE_RESET(); __HAL_RCC_SPI1_RELEASE_RESET();
__SPI1_CLK_DISABLE(); __HAL_RCC_SPI1_CLK_DISABLE();
} }
if (obj->spi == SPI_2) { if (obj->spi == SPI_2) {
__SPI2_FORCE_RESET(); __HAL_RCC_SPI2_FORCE_RESET();
__SPI2_RELEASE_RESET(); __HAL_RCC_SPI2_RELEASE_RESET();
__SPI2_CLK_DISABLE(); __HAL_RCC_SPI2_CLK_DISABLE();
} }
if (obj->spi == SPI_3) { if (obj->spi == SPI_3) {
__SPI3_FORCE_RESET(); __HAL_RCC_SPI3_FORCE_RESET();
__SPI3_RELEASE_RESET(); __HAL_RCC_SPI3_RELEASE_RESET();
__SPI3_CLK_DISABLE(); __HAL_RCC_SPI3_CLK_DISABLE();
} }
#if defined SPI4_BASE #if defined SPI4_BASE
if (obj->spi == SPI_4) { if (obj->spi == SPI_4) {
__SPI4_FORCE_RESET(); __HAL_RCC_SPI4_FORCE_RESET();
__SPI4_RELEASE_RESET(); __HAL_RCC_SPI4_RELEASE_RESET();
__SPI4_CLK_DISABLE(); __HAL_RCC_SPI4_CLK_DISABLE();
} }
#endif #endif
#if defined SPI5_BASE #if defined SPI5_BASE
if (obj->spi == SPI_5) { if (obj->spi == SPI_5) {
__SPI5_FORCE_RESET(); __HAL_RCC_SPI5_FORCE_RESET();
__SPI5_RELEASE_RESET(); __HAL_RCC_SPI5_RELEASE_RESET();
__SPI5_CLK_DISABLE(); __HAL_RCC_SPI5_CLK_DISABLE();
} }
#endif #endif
@ -289,7 +292,6 @@ void spi_frequency(spi_t *obj, int hz)
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 50 MHz obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 50 MHz
} }
} }
// Values depend of PCLK1: 50 MHz // Values depend of PCLK1: 50 MHz
if ((obj->spi == SPI_2) || (obj->spi == SPI_3)) { if ((obj->spi == SPI_2) || (obj->spi == SPI_3)) {
if (hz < 400000) { if (hz < 400000) {
@ -310,6 +312,47 @@ void spi_frequency(spi_t *obj, int hz)
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 25 MHz 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 #endif
init_spi(obj); init_spi(obj);
} }