diff options
Diffstat (limited to 'ports/stm32')
| -rw-r--r-- | ports/stm32/i2c.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/ports/stm32/i2c.c b/ports/stm32/i2c.c index c63fe2162..a05a0954a 100644 --- a/ports/stm32/i2c.c +++ b/ports/stm32/i2c.c @@ -70,10 +70,11 @@ int i2c_init(i2c_t *i2c, mp_hal_pin_obj_t scl, mp_hal_pin_obj_t sda, uint32_t fr // SM: MAX(4, PCLK1 / (F * 2)) // FM, 16:9 duty: 0xc000 | MAX(1, (PCLK1 / (F * (16 + 9)))) + // (the PCLK1-1 and +1 at the end is to round the division up) if (freq <= 100000) { - i2c->CCR = MAX(4, PCLK1 / (freq * 2)); + i2c->CCR = MAX(4, ((PCLK1 - 1) / (freq * 2) + 1)); } else { - i2c->CCR = 0xc000 | MAX(1, PCLK1 / (freq * 25)); + i2c->CCR = 0xc000 | MAX(1, ((PCLK1 - 1) / (freq * 25) + 1)); } // SM: 1000ns / (1/PCLK1) + 1 = PCLK1 * 1e-6 + 1 |
