@@ -291,23 +291,28 @@ void spi_frequency(spi_t *obj, int hz) {
291
291
struct spi_s * spiobj = SPI_S (obj );
292
292
int spi_hz = 0 ;
293
293
uint8_t prescaler_rank = 0 ;
294
+ uint8_t last_index = (sizeof (baudrate_prescaler_table )/sizeof (baudrate_prescaler_table [0 ])) - 1 ;
294
295
SPI_HandleTypeDef * handle = & (spiobj -> handle );
295
296
296
- /* Get the clock of the peripheral */
297
- spi_hz = spi_get_clock_freq (obj );
297
+ /* Calculate the spi clock for prescaler_rank 0: SPI_BAUDRATEPRESCALER_2 */
298
+ spi_hz = spi_get_clock_freq (obj ) / 2 ;
298
299
299
300
/* Define pre-scaler in order to get highest available frequency below requested frequency */
300
- while ((spi_hz > hz ) && (prescaler_rank < sizeof ( baudrate_prescaler_table )/ sizeof ( baudrate_prescaler_table [ 0 ]))) {
301
+ while ((spi_hz > hz ) && (prescaler_rank < last_index )) {
301
302
spi_hz = spi_hz / 2 ;
302
303
prescaler_rank ++ ;
303
304
}
304
305
305
- if (prescaler_rank <= sizeof (baudrate_prescaler_table )/sizeof (baudrate_prescaler_table [0 ])) {
306
- handle -> Init .BaudRatePrescaler = baudrate_prescaler_table [prescaler_rank - 1 ];
307
- } else {
308
- error ("Couldn't setup requested SPI frequency" );
306
+ /* Use the best fit pre-scaler */
307
+ handle -> Init .BaudRatePrescaler = baudrate_prescaler_table [prescaler_rank ];
308
+
309
+ /* In case maximum pre-scaler still gives too high freq, raise an error */
310
+ if (spi_hz > hz ) {
311
+ error ("Couldn't set suitable spi freq: request:%d, lowest:%d\r\n" , hz , spi_hz );
309
312
}
310
313
314
+ DEBUG_PRINTF ("spi_frequency, request:%d, select:%d\r\n" , hz , spi_hz );
315
+
311
316
init_spi (obj );
312
317
}
313
318
0 commit comments