Skip to content

Commit ebe442c

Browse files
authored
Merge pull request #6446 from EmergReanimator/stm_spi_freq_fix
Fixed STM SPI frequency settings.
2 parents dc5565a + e8dd5d3 commit ebe442c

File tree

1 file changed

+8
-4
lines changed
  • ports/stm/common-hal/busio

1 file changed

+8
-4
lines changed

ports/stm/common-hal/busio/SPI.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,10 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
206206
spi_clock_enable(1 << (self->sck->periph_index - 1));
207207
reserved_spi[self->sck->periph_index - 1] = true;
208208

209+
// Always start at 250khz which is what SD cards need. They are sensitive to
210+
// SPI bus noise before they are put into SPI mode.
211+
const uint32_t default_baudrate = 250000UL;
212+
209213
self->handle.Instance = SPIx;
210214
self->handle.Init.Mode = SPI_MODE_MASTER;
211215
// Direction change only required for RX-only, see RefMan RM0090:884
@@ -218,16 +222,16 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
218222
self->handle.Init.CLKPolarity = SPI_POLARITY_LOW;
219223
self->handle.Init.CLKPhase = SPI_PHASE_1EDGE;
220224
self->handle.Init.NSS = SPI_NSS_SOFT;
221-
self->handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
225+
self->handle.Init.BaudRatePrescaler = stm32_baud_to_spi_div(default_baudrate, &self->prescaler, get_busclock(self->handle.Instance));
222226
self->handle.Init.FirstBit = SPI_FIRSTBIT_MSB;
223227
self->handle.Init.TIMode = SPI_TIMODE_DISABLE;
224228
self->handle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
225229
self->handle.Init.CRCPolynomial = 10;
226230
if (HAL_SPI_Init(&self->handle) != HAL_OK) {
227231
mp_raise_ValueError(translate("SPI init error"));
228232
}
229-
self->baudrate = (get_busclock(SPIx) / 16);
230-
self->prescaler = 16;
233+
self->baudrate = default_baudrate;
234+
// self->prescaler = 16; // Initialised above by stm32_baud_to_spi_div
231235
self->half_duplex = half_duplex;
232236
self->polarity = 0;
233237
self->phase = 0;
@@ -381,7 +385,7 @@ bool common_hal_busio_spi_transfer(busio_spi_obj_t *self,
381385

382386
uint32_t common_hal_busio_spi_get_frequency(busio_spi_obj_t *self) {
383387
// returns actual frequency
384-
uint32_t result = HAL_RCC_GetPCLK2Freq() / self->prescaler;
388+
uint32_t result = get_busclock(self->handle.Instance) / self->prescaler;
385389
return result;
386390
}
387391

0 commit comments

Comments
 (0)