Skip to content

Commit 0b558e8

Browse files
committed
fix error in SPI busclock selection
1 parent 41fb6e7 commit 0b558e8

File tree

1 file changed

+17
-6
lines changed
  • ports/stm32f4/common-hal/busio

1 file changed

+17
-6
lines changed

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

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@
3939
STATIC bool reserved_spi[6];
4040
STATIC bool never_reset_spi[6];
4141

42+
STATIC uint32_t get_busclock(SPI_TypeDef * instance) {
43+
//SPI2 and 3 are on PCLK1, if they exist.
44+
#ifdef SPI2
45+
if(instance == SPI2) return HAL_RCC_GetPCLK1Freq();
46+
#endif
47+
#ifdef SPI3
48+
if(instance == SPI2) return HAL_RCC_GetPCLK1Freq();
49+
#endif
50+
return HAL_RCC_GetPCLK2Freq();
51+
}
52+
4253
void spi_reset(void) {
4354
#ifdef SPI1
4455
if(!never_reset_spi[0]) {
@@ -205,7 +216,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
205216
{
206217
mp_raise_ValueError(translate("SPI Init Error"));
207218
}
208-
self->baudrate = (HAL_RCC_GetPCLK2Freq()/16);
219+
self->baudrate = (get_busclock(SPIx)/16);
209220
self->prescaler = 16;
210221
self->polarity = 0;
211222
self->phase = 1;
@@ -277,7 +288,7 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) {
277288
self->miso = mp_const_none;
278289
}
279290

280-
static uint32_t stm32_baud_to_spi_div(uint32_t baudrate, uint16_t * prescaler) {
291+
STATIC uint32_t stm32_baud_to_spi_div(uint32_t baudrate, uint16_t * prescaler, uint32_t busclock) {
281292
static const uint32_t baud_map[8][2] = {
282293
{2,SPI_BAUDRATEPRESCALER_2},
283294
{4,SPI_BAUDRATEPRESCALER_4},
@@ -292,7 +303,7 @@ static uint32_t stm32_baud_to_spi_div(uint32_t baudrate, uint16_t * prescaler) {
292303
uint16_t divisor;
293304
do {
294305
divisor = baud_map[i][0];
295-
if (baudrate >= (HAL_RCC_GetPCLK2Freq()/divisor)) {
306+
if (baudrate >= (busclock/divisor)) {
296307
*prescaler = divisor;
297308
return baud_map[i][1];
298309
}
@@ -331,9 +342,9 @@ bool common_hal_busio_spi_configure(busio_spi_obj_t *self,
331342
} else {
332343
self->handle.Init.CLKPhase = SPI_PHASE_1EDGE;
333344
}
334-
335-
self->handle.Init.BaudRatePrescaler = stm32_baud_to_spi_div(baudrate, &self->prescaler);
336-
345+
346+
self->handle.Init.BaudRatePrescaler = stm32_baud_to_spi_div(baudrate, &self->prescaler,
347+
get_busclock(self->handle.Instance));
337348
self->handle.Init.Mode = SPI_MODE_MASTER;
338349
self->handle.Init.Direction = SPI_DIRECTION_2LINES;
339350
self->handle.Init.NSS = SPI_NSS_SOFT;

0 commit comments

Comments
 (0)