mirror of https://github.com/ARMmbed/mbed-os.git
[STM32L4xx] Change SPI clock selection
Update of STM32L4 family CPI clock selection algo. Maximum SPI clock is obtained from APB domain clock (based on HAL API). Then algo sets maximum frequency available below requested frequencypull/2013/head
parent
67e6f729c7
commit
bc08631931
|
@ -187,47 +187,47 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||||
init_spi(obj);
|
init_spi(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const uint16_t baudrate_prescaler_table[] = {SPI_BAUDRATEPRESCALER_2,
|
||||||
|
SPI_BAUDRATEPRESCALER_4,
|
||||||
|
SPI_BAUDRATEPRESCALER_8,
|
||||||
|
SPI_BAUDRATEPRESCALER_16,
|
||||||
|
SPI_BAUDRATEPRESCALER_32,
|
||||||
|
SPI_BAUDRATEPRESCALER_64,
|
||||||
|
SPI_BAUDRATEPRESCALER_128,
|
||||||
|
SPI_BAUDRATEPRESCALER_256};
|
||||||
|
|
||||||
void spi_frequency(spi_t *obj, int hz)
|
void spi_frequency(spi_t *obj, int hz)
|
||||||
{
|
{
|
||||||
// Values depend of PCLK1 and PCLK2: 80 MHz if MSI or HSI is used, 48 MHz if HSE is used
|
int spi_hz = 0;
|
||||||
if (SystemCoreClock == 80000000) { // MSI or HSI
|
uint8_t prescaler_rank = 0;
|
||||||
if (hz < 600000) {
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 313 kHz
|
/* Get source clock depending on SPI instance */
|
||||||
} else if ((hz >= 600000) && (hz < 1000000)) {
|
switch ((int)obj->spi) {
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 625 kHz
|
case SPI_1:
|
||||||
} else if ((hz >= 1000000) && (hz < 2000000)) {
|
/* SPI_1. Source CLK is PCKL2 */
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.25 MHz (default)
|
spi_hz = HAL_RCC_GetPCLK2Freq();
|
||||||
} else if ((hz >= 2000000) && (hz < 5000000)) {
|
break;
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 2.5 MHz
|
case SPI_2:
|
||||||
} else if ((hz >= 5000000) && (hz < 10000000)) {
|
case SPI_3:
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 5 MHz
|
/* SPI_2, SPI_3. Source CLK is PCKL1 */
|
||||||
} else if ((hz >= 10000000) && (hz < 20000000)) {
|
spi_hz = HAL_RCC_GetPCLK1Freq();
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 10 MHz
|
break;
|
||||||
} else if ((hz >= 20000000) && (hz < 40000000)) {
|
default:
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 20 MHz
|
error("SPI instance not set");
|
||||||
} else { // >= 40000000
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 40 MHz
|
|
||||||
}
|
|
||||||
} else { // 48 MHz - HSE
|
|
||||||
if (hz < 350000) {
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 188 kHz
|
|
||||||
} else if ((hz >= 350000) && (hz < 750000)) {
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 375 kHz
|
|
||||||
} else if ((hz >= 750000) && (hz < 1000000)) {
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 750 kHz
|
|
||||||
} else if ((hz >= 1000000) && (hz < 3000000)) {
|
|
||||||
obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.5 MHz (default)
|
|
||||||
} 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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Define pre-scaler in order to get highest available frequency below requested frequency */
|
||||||
|
while ((spi_hz > hz) && (prescaler_rank < sizeof(baudrate_prescaler_table)/sizeof(baudrate_prescaler_table[0]))){
|
||||||
|
spi_hz = spi_hz / 2;
|
||||||
|
prescaler_rank++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prescaler_rank <= sizeof(baudrate_prescaler_table)/sizeof(baudrate_prescaler_table[0])) {
|
||||||
|
obj->br_presc = baudrate_prescaler_table[prescaler_rank-1];
|
||||||
|
} else {
|
||||||
|
error("Couldn't setup requested SPI frequency");
|
||||||
|
}
|
||||||
|
|
||||||
init_spi(obj);
|
init_spi(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue