39
39
STATIC bool reserved_spi [6 ];
40
40
STATIC bool never_reset_spi [6 ];
41
41
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
+
42
53
void spi_reset (void ) {
43
54
#ifdef SPI1
44
55
if (!never_reset_spi [0 ]) {
@@ -205,7 +216,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
205
216
{
206
217
mp_raise_ValueError (translate ("SPI Init Error" ));
207
218
}
208
- self -> baudrate = (HAL_RCC_GetPCLK2Freq ( )/16 );
219
+ self -> baudrate = (get_busclock ( SPIx )/16 );
209
220
self -> prescaler = 16 ;
210
221
self -> polarity = 0 ;
211
222
self -> phase = 1 ;
@@ -277,7 +288,7 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) {
277
288
self -> miso = mp_const_none ;
278
289
}
279
290
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 ) {
281
292
static const uint32_t baud_map [8 ][2 ] = {
282
293
{2 ,SPI_BAUDRATEPRESCALER_2 },
283
294
{4 ,SPI_BAUDRATEPRESCALER_4 },
@@ -292,7 +303,7 @@ static uint32_t stm32_baud_to_spi_div(uint32_t baudrate, uint16_t * prescaler) {
292
303
uint16_t divisor ;
293
304
do {
294
305
divisor = baud_map [i ][0 ];
295
- if (baudrate >= (HAL_RCC_GetPCLK2Freq () /divisor )) {
306
+ if (baudrate >= (busclock /divisor )) {
296
307
* prescaler = divisor ;
297
308
return baud_map [i ][1 ];
298
309
}
@@ -331,9 +342,9 @@ bool common_hal_busio_spi_configure(busio_spi_obj_t *self,
331
342
} else {
332
343
self -> handle .Init .CLKPhase = SPI_PHASE_1EDGE ;
333
344
}
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 ));
337
348
self -> handle .Init .Mode = SPI_MODE_MASTER ;
338
349
self -> handle .Init .Direction = SPI_DIRECTION_2LINES ;
339
350
self -> handle .Init .NSS = SPI_NSS_SOFT ;
0 commit comments