|
8 | 8 |
|
9 | 9 | static SPI_TypeDef * const spis[] = { (void *) 0, SPI1, SPI2, SPI3, SPI4, SPI5, SPI6 };
|
10 | 10 |
|
| 11 | +static inline uint16_t compute_prescaler(uint32_t clock) { |
| 12 | + if (clock >= SystemCoreClock / 2) { |
| 13 | + return SPI_BaudRatePrescaler_2; |
| 14 | + } else if (clock >= SystemCoreClock / 4) { |
| 15 | + return SPI_BaudRatePrescaler_4; |
| 16 | + } else if (clock >= SystemCoreClock / 8) { |
| 17 | + return SPI_BaudRatePrescaler_8; |
| 18 | + } else if (clock >= SystemCoreClock / 16) { |
| 19 | + return SPI_BaudRatePrescaler_16; |
| 20 | + } else if (clock >= SystemCoreClock / 32) { |
| 21 | + return SPI_BaudRatePrescaler_32; |
| 22 | + } else if (clock >= SystemCoreClock / 64) { |
| 23 | + return SPI_BaudRatePrescaler_64; |
| 24 | + } else if (clock >= SystemCoreClock / 128) { |
| 25 | + return SPI_BaudRatePrescaler_128; |
| 26 | + } |
| 27 | + |
| 28 | + return SPI_BaudRatePrescaler_256; |
| 29 | +} |
| 30 | + |
11 | 31 | void ssp_config(ssp_port_t ssp_port, uint32_t clock) {
|
12 | 32 | ssp_t ssp = get_ssp(ssp_port);
|
13 | 33 | pin_t sclk = get_sclk(ssp_port);
|
@@ -81,7 +101,7 @@ void ssp_config(ssp_port_t ssp_port, uint32_t clock) {
|
81 | 101 | SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
|
82 | 102 | SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
|
83 | 103 | SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
|
84 |
| - SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; |
| 104 | + SPI_InitStructure.SPI_BaudRatePrescaler = compute_prescaler(clock); |
85 | 105 | SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
|
86 | 106 | SPI_InitStructure.SPI_CRCPolynomial = 7;
|
87 | 107 | SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
|
|
0 commit comments