summaryrefslogtreecommitdiff
path: root/ports
diff options
context:
space:
mode:
Diffstat (limited to 'ports')
-rw-r--r--ports/stm32/i2c.c5
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