mirror of https://github.com/ARMmbed/mbed-os.git
Update SPI clock for STM32F446RE
parent
188dd6580e
commit
ded07a59b5
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue