@@ -182,6 +182,89 @@ void initSpiCs(SPIConfig *spiConfig, brain_pin_e csPin) {
182182 efiSetPadMode (" chip select" , csPin, PAL_STM32_MODE_OUTPUT );
183183}
184184
185+ #ifdef STM32H7XX
186+
187+ int spiGetBaseClock (SPIDriver *spip)
188+ {
189+ #if STM32_SPI_USE_SPI1
190+ if (spip == &SPID1 ) {
191+ // APB2
192+ return STM32_SPI1CLK ;
193+ }
194+ #endif
195+ #if STM32_SPI_USE_SPI2
196+ if (spip == &SPID2 ) {
197+ // APB1
198+ return STM32_SPI2CLK ;
199+ }
200+ #endif
201+ #if STM32_SPI_USE_SPI3
202+ if (spip == &SPID3 ) {
203+ // APB1
204+ return STM32_SPI3CLK ;
205+ }
206+ #endif
207+ #if STM32_SPI_USE_SPI4
208+ if (spip == &SPID4 ) {
209+ // APB2
210+ return STM32_SPI4CLK ;
211+ }
212+ #endif
213+ #if STM32_SPI_USE_SPI5
214+ if (spip == &SPID5 ) {
215+ // APB2
216+ return STM32_SPI5CLK ;
217+ }
218+ #endif
219+ #if STM32_SPI_USE_SPI6
220+ if (spip == &SPID6 ) {
221+ // APB2
222+ return STM32_SPI6CLK ;
223+ }
224+ #endif
225+
226+ return 0 ;
227+ }
228+
229+ int spiCalcClockDiv (SPIDriver *spip, SPIConfig *spiConfig, unsigned int clk)
230+ {
231+ if (clk == 0 ) {
232+ return -1 ;
233+ }
234+
235+ unsigned int baseClock = spiGetBaseClock (spip);
236+
237+ if (baseClock == 0 ) {
238+ return -1 ;
239+ }
240+
241+ // round down
242+ int div = (baseClock + clk - 1 ) / clk;
243+
244+ spiConfig->cfg1 &= ~SPI_CFG1_MBR_Msk;
245+ if (div <= 2 ) {
246+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_2;
247+ } else if (div <= 4 ) {
248+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_4;
249+ } else if (div <= 8 ) {
250+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_8;
251+ } else if (div <= 16 ) {
252+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_16;
253+ } else if (div <= 32 ) {
254+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_32;
255+ } else if (div <= 64 ) {
256+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_64;
257+ } else if (div <= 128 ) {
258+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_128;
259+ } else {
260+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_256;
261+ }
262+
263+ return 0 ;
264+ }
265+
266+ #else
267+
185268int spiGetBaseClock (SPIDriver *spip)
186269{
187270#if STM32_SPI_USE_SPI1
@@ -224,16 +307,6 @@ int spiGetBaseClock(SPIDriver *spip)
224307 return 0 ;
225308}
226309
227- #ifdef STM32H7XX
228-
229- int spiCalcClockDiv (SPIDriver*, SPIConfig*, unsigned int )
230- {
231- // TODO: implement
232- return -1 ;
233- }
234-
235- #else
236-
237310int spiCalcClockDiv (SPIDriver *spip, SPIConfig *spiConfig, unsigned int clk)
238311{
239312 if (clk == 0 ) {
0 commit comments