Skip to content

Commit c2f1ca5

Browse files
committed
fix(i2c): wrong clock frequencies for I2C5 and I2C6
Fixes #2534 Signed-off-by: Frederic Pillon <[email protected]>
1 parent 42e0262 commit c2f1ca5

File tree

1 file changed

+73
-0
lines changed
  • libraries/Wire/src/utility

1 file changed

+73
-0
lines changed

libraries/Wire/src/utility/twi.c

+73
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,49 @@ static uint32_t i2c_getClkFreq(I2C_TypeDef *i2c)
420420
#else
421421
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C35);
422422
#endif
423+
if (clkSrcFreq == 0)
424+
#endif
425+
{
426+
#ifdef __HAL_RCC_GET_I2C5_SOURCE
427+
switch (__HAL_RCC_GET_I2C5_SOURCE()) {
428+
#ifdef RCC_I2C5CLKSOURCE_HSI
429+
case RCC_I2C5CLKSOURCE_HSI:
430+
clkSrcFreq = HSI_VALUE;
431+
break;
432+
#endif
433+
#ifdef RCC_I2C5CLKSOURCE_SYSCLK
434+
case RCC_I2C5CLKSOURCE_SYSCLK:
435+
clkSrcFreq = SystemCoreClock;
436+
break;
437+
#endif
438+
#if defined(RCC_I2C5CLKSOURCE_PCLK1) || defined(RCC_I2C5CLKSOURCE_D2PCLK1)
439+
#ifdef RCC_I2C5CLKSOURCE_PCLK1
440+
case RCC_I2C5CLKSOURCE_PCLK1:
441+
#endif
442+
#ifdef RCC_I2C5CLKSOURCE_D2PCLK1
443+
case RCC_I2C5CLKSOURCE_D2PCLK1:
444+
#endif
445+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
446+
break;
447+
#endif
448+
#ifdef RCC_I2C5CLKSOURCE_CSI
449+
case RCC_I2C5CLKSOURCE_CSI:
450+
clkSrcFreq = CSI_VALUE;
451+
break;
452+
#endif
453+
#ifdef RCC_I2C5CLKSOURCE_PLL3
454+
case RCC_I2C5CLKSOURCE_PLL3:
455+
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
456+
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
457+
break;
423458
#endif
459+
default:
460+
Error_Handler();
461+
}
462+
#else
463+
Error_Handler();
464+
#endif
465+
}
424466
}
425467
#endif // I2C5_BASE
426468
#if defined(I2C6_BASE)
@@ -431,7 +473,38 @@ static uint32_t i2c_getClkFreq(I2C_TypeDef *i2c)
431473
#else
432474
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C46);
433475
#endif
476+
if (clkSrcFreq == 0)
477+
#endif
478+
{
479+
#ifdef __HAL_RCC_GET_I2C6_SOURCE
480+
switch (__HAL_RCC_GET_I2C6_SOURCE()) {
481+
#ifdef RCC_I2C6CLKSOURCE_HSI
482+
case RCC_I2C6CLKSOURCE_HSI:
483+
clkSrcFreq = HSI_VALUE;
484+
break;
485+
#endif
486+
#ifdef RCC_I2C6CLKSOURCE_SYSCLK
487+
case RCC_I2C6CLKSOURCE_SYSCLK:
488+
clkSrcFreq = SystemCoreClock;
489+
break;
434490
#endif
491+
#ifdef RCC_I2C6CLKSOURCE_PCLK1
492+
case RCC_I2C6CLKSOURCE_PCLK1:
493+
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
494+
break;
495+
#endif
496+
#ifdef RCC_I2C6CLKSOURCE_MSIK
497+
case RCC_I2C6CLKSOURCE_MSIK:
498+
clkSrcFreq = MSI_VALUE;
499+
break;
500+
#endif
501+
default:
502+
Error_Handler();
503+
}
504+
#else
505+
Error_Handler();
506+
#endif
507+
}
435508
}
436509
#endif // I2C6_BASE
437510
return clkSrcFreq;

0 commit comments

Comments
 (0)