Open
Description
The case statements in void TwoWire::setClock(uint32_t freq)
are at odds with Wire for Uno R3.
Uno R3 allows a range of clock values.
// Probably R3 should be range checked.
void TwoWire::setClock(uint32_t clock)
{
twi_setFrequency(clock);
}
void twi_setFrequency(uint32_t frequency)
{
TWBR = ((F_CPU / frequency) - 16) / 2;
}
The R4 boards only allow values in this enum:
/** Communication speed options */
typedef enum e_i2c_master_rate
{
I2C_MASTER_RATE_STANDARD = 100000, ///< 100 kHz
I2C_MASTER_RATE_FAST = 400000, ///< 400 kHz
I2C_MASTER_RATE_FASTPLUS = 1000000 ///< 1 MHz
} i2c_master_rate_t;
The I2C standard suggest you should allow the best match possible to the requested clock.
The I2C clock can be 0 Hz to 100 kHz, 0 Hz to 400 kHz, 0 Hz to 1 MHz and 0 Hz to 3.4 MHz, depending on the mode. This means that an I2C-bus running at less than 10 kHz is not SMBus compliant since the SMBus devices may time-out.