@@ -182,6 +182,83 @@ 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+ return STM32_SPI1CLK ;
192+ }
193+ #endif
194+ #if STM32_SPI_USE_SPI2
195+ if (spip == &SPID2 ) {
196+ return STM32_SPI2CLK ;
197+ }
198+ #endif
199+ #if STM32_SPI_USE_SPI3
200+ if (spip == &SPID3 ) {
201+ return STM32_SPI3CLK ;
202+ }
203+ #endif
204+ #if STM32_SPI_USE_SPI4
205+ if (spip == &SPID4 ) {
206+ return STM32_SPI4CLK ;
207+ }
208+ #endif
209+ #if STM32_SPI_USE_SPI5
210+ if (spip == &SPID5 ) {
211+ return STM32_SPI5CLK ;
212+ }
213+ #endif
214+ #if STM32_SPI_USE_SPI6
215+ if (spip == &SPID6 ) {
216+ return STM32_SPI6CLK ;
217+ }
218+ #endif
219+
220+ return 0 ;
221+ }
222+
223+ int spiCalcClockDiv (SPIDriver *spip, SPIConfig *spiConfig, unsigned int clk)
224+ {
225+ if (clk == 0 ) {
226+ return -1 ;
227+ }
228+
229+ unsigned int baseClock = spiGetBaseClock (spip);
230+
231+ if (baseClock == 0 ) {
232+ return -1 ;
233+ }
234+
235+ // round down
236+ int div = (baseClock + clk - 1 ) / clk;
237+
238+ spiConfig->cfg1 &= ~SPI_CFG1_MBR_Msk;
239+ if (div <= 2 ) {
240+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_2;
241+ } else if (div <= 4 ) {
242+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_4;
243+ } else if (div <= 8 ) {
244+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_8;
245+ } else if (div <= 16 ) {
246+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_16;
247+ } else if (div <= 32 ) {
248+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_32;
249+ } else if (div <= 64 ) {
250+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_64;
251+ } else if (div <= 128 ) {
252+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_128;
253+ } else {
254+ spiConfig->cfg1 |= SPI_BaudRatePrescaler_256;
255+ }
256+
257+ return 0 ;
258+ }
259+
260+ #else
261+
185262int spiGetBaseClock (SPIDriver *spip)
186263{
187264#if STM32_SPI_USE_SPI1
@@ -224,16 +301,6 @@ int spiGetBaseClock(SPIDriver *spip)
224301 return 0 ;
225302}
226303
227- #ifdef STM32H7XX
228-
229- int spiCalcClockDiv (SPIDriver*, SPIConfig*, unsigned int )
230- {
231- // TODO: implement
232- return -1 ;
233- }
234-
235- #else
236-
237304int spiCalcClockDiv (SPIDriver *spip, SPIConfig *spiConfig, unsigned int clk)
238305{
239306 if (clk == 0 ) {
0 commit comments