arduino / Arduino

Arduino IDE 1.x
https://www.arduino.cc/en/software
Other
14.16k stars 7.02k forks source link

Please add uint32_t getClock() to the Wire library #11457

Open RobTillaart opened 3 years ago

RobTillaart commented 3 years ago

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 commented 2 years ago

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 ARDUINOI2CGETCLOCK so it can be tested compile-time if function exists.