Skip to content

I2C Speed incorrect for I2C5 on Nucleo-H723ZG board #2534

Closed
@Steffen-Zienert

Description

@Steffen-Zienert

Describe the bug
The speed for the I2C5 peripheral is always ~16.8kHz and not the expected 100kHz on the Nucleo-H723ZG board and possibly other H7 variants. It does not change for different values of Wire.setClock(values). The other I2C peripherals behave as expected.

To Reproduce
Minimal reproducible example code:

#include <Wire.h>

void setup() {
  // set Wire to Pins associated with I2C5:
  Wire.setSDA(PC_10);
  Wire.setSCL(PC_11);
  Wire.begin();
  Wire.setClock(100000);

  // send any I2C message
  Wire.beginTransmission(0x24);
  Wire.write(0);
  Wire.endTransmission();
}

void loop() {
}

Results in ~16.8kHz on SCL Pin PC11 (see image)

Expected behavior
Expect 100kHz clock speed.

Screenshots
Measurement of Pin PC 10 (red) and PC11 (brown):
grafik
Clock speed around 16.8kHz.

Desktop (please complete the following information):

  • OS: Windows 11
  • Arduino IDE version: 2.3.3
  • STM32 core version: 2.81
  • Tools menu settings: default
  • Upload method: Mass storage

Board (please complete the following information):

  • Name: Nucleo-H723ZG
  • Hardware Revision: Rev E01
  • Extra hardware: no

Additional context
I think that the issue is in the i2c_getClkFreq(I2C_TypeDef *i2c) function. I single stepped the code and this snipped always returns 0 for the I2C5 peripheral clock frequency clkSrcFreq:

#if defined(I2C5_BASE)
if (i2c == I2C5) {
#if defined(RCC_PERIPHCLK_I2C5) || defined(RCC_PERIPHCLK_I2C35)
#ifdef RCC_PERIPHCLK_I2C5
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C5);
#else
clkSrcFreq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2C35);
#endif
#endif
}

For the working I2C1 Peripheral with the same clock source there is handling for that case:
if (clkSrcFreq == 0)
#endif
{
#ifdef __HAL_RCC_GET_I2C1_SOURCE
switch (__HAL_RCC_GET_I2C1_SOURCE()) {
#ifdef RCC_I2C1CLKSOURCE_HSI
case RCC_I2C1CLKSOURCE_HSI:
clkSrcFreq = HSI_VALUE;
break;
#endif
#ifdef RCC_I2C1CLKSOURCE_HSIKER
case RCC_I2C1CLKSOURCE_HSIKER:
clkSrcFreq = __LL_RCC_CALC_HSIKER_FREQ(LL_RCC_HSIKER_GetDivider());
break;
#endif
#ifdef RCC_I2C1CLKSOURCE_SYSCLK
case RCC_I2C1CLKSOURCE_SYSCLK:
clkSrcFreq = SystemCoreClock;
break;
#endif
#if defined(RCC_I2C1CLKSOURCE_PCLK1) || defined(RCC_I2C1CLKSOURCE_D2PCLK1)
#ifdef RCC_I2C1CLKSOURCE_PCLK1
case RCC_I2C1CLKSOURCE_PCLK1:
#endif
#ifdef RCC_I2C1CLKSOURCE_D2PCLK1
case RCC_I2C1CLKSOURCE_D2PCLK1:
#endif
clkSrcFreq = HAL_RCC_GetPCLK1Freq();
break;
#endif
#ifdef RCC_I2C1CLKSOURCE_CSI
case RCC_I2C1CLKSOURCE_CSI:
clkSrcFreq = CSI_VALUE;
break;
#endif
#ifdef RCC_I2C1CLKSOURCE_PLL3
case RCC_I2C1CLKSOURCE_PLL3:
HAL_RCCEx_GetPLL3ClockFreq(&PLL3_Clocks);
clkSrcFreq = PLL3_Clocks.PLL3_R_Frequency;
break;
#endif
default:
Error_Handler();
}
#else
Error_Handler();
#endif
}

Activity

added this to the 2.9.0 milestone on Oct 21, 2024
added a commit that references this issue on Oct 21, 2024
c2f1ca5
fpistm

fpistm commented on Oct 21, 2024

@fpistm
Member

Hi @Steffen-Zienert
Thanks for the detailed issue.
I've made a fix (#2535), could you test it, please ?

Steffen-Zienert

Steffen-Zienert commented on Oct 21, 2024

@Steffen-Zienert
Author

Hi @fpistm,

thanks for the fast reply. My problem is fixed with your new code. The MRE behaves as expected:

grafik

added a commit that references this issue on Oct 21, 2024
511ed73
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug 🐛Something isn't working

    Type

    No type

    Projects

    Status

    Done

    Relationships

    None yet

      Development

      Participants

      @fpistm@Steffen-Zienert

      Issue actions

        I2C Speed incorrect for I2C5 on Nucleo-H723ZG board · Issue #2534 · stm32duino/Arduino_Core_STM32