Arduino icon indicating copy to clipboard operation
Arduino copied to clipboard

Please add uint32_t getClock() to the Wire library

Open RobTillaart opened this issue 3 years ago • 1 comments

The Wire library has a function void setClock(uint32_t frequency) to set the I2C clock frequency.

It would be useful for (library) developers to be able to read the current clock frequency so I could drive a device at maximum frequency and reset the I2C bus afterwards.

some_device_call()
{
  uint32_t prev_freq = Wire.getClock();

  Wire.setClock(_my_max_freq);
  // do my I2C thing

  Wire.setClock(prev_freq);

  return whatever;
}

The ESP32 does already support a getClock() function,

For AVR based devices it could look like

FILE: Wire.h

//  class TwoWire : public Stream
...
uint32_t getClock();

FILE: Wire.cpp

uint32_t  TwoWire::getClock()
{
 uint32_t speed = F_CPU / ((TWBR * 2) + 16);
 return speed;
}

Yes the value may not be exact what was set by setClock() but it would be the actual frequency.

RobTillaart avatar Apr 25 '21 17:04 RobTillaart

Just to mention I implemented a related workaround in this library - https://github.com/RobTillaart/AGS02MA This sensor has an I2C bus working at 30KHz. Setting the bus to this value would slow down all other I2C devices quite a bit.

Having a WIre.getClock() would make live definitely easier.

One might add a define like ARDUINO__I2C__GETCLOCK so it can be tested compile-time if function exists.

RobTillaart avatar Jan 21 '22 12:01 RobTillaart