Skip to content

Commit 024edaf

Browse files
committed
stm32/i2c: On F4 MCUs report the actual I2C SCL frequency.
1 parent 8359210 commit 024edaf

3 files changed

Lines changed: 15 additions & 7 deletions

File tree

ports/stm32/i2c.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,9 @@ STATIC void i2c_set_baudrate(I2C_InitTypeDef *init, uint32_t baudrate) {
191191
"Unsupported I2C baudrate: %lu", baudrate));
192192
}
193193

194-
uint32_t i2c_get_baudrate(I2C_InitTypeDef *init) {
194+
uint32_t i2c_get_baudrate(I2C_HandleTypeDef *i2c) {
195195
for (int i = 0; i < NUM_BAUDRATE_TIMINGS; i++) {
196-
if (pyb_i2c_baudrate_timing[i].timing == init->Timing) {
196+
if (pyb_i2c_baudrate_timing[i].timing == i2c->Init.Timing) {
197197
return pyb_i2c_baudrate_timing[i].baudrate;
198198
}
199199
}
@@ -210,8 +210,16 @@ STATIC void i2c_set_baudrate(I2C_InitTypeDef *init, uint32_t baudrate) {
210210
init->DutyCycle = I2C_DUTYCYCLE_16_9;
211211
}
212212

213-
uint32_t i2c_get_baudrate(I2C_InitTypeDef *init) {
214-
return init->ClockSpeed;
213+
uint32_t i2c_get_baudrate(I2C_HandleTypeDef *i2c) {
214+
uint32_t pfreq = i2c->Instance->CR2 & 0x3f;
215+
uint32_t ccr = i2c->Instance->CCR & 0xfff;
216+
if (i2c->Instance->CCR & 0x8000) {
217+
// Fast mode, assume duty cycle of 16/9
218+
return pfreq * 40000 / ccr;
219+
} else {
220+
// Standard mode
221+
return pfreq * 500000 / ccr;
222+
}
215223
}
216224

217225
#endif
@@ -545,7 +553,7 @@ STATIC void pyb_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp_print_ki
545553
mp_printf(print, "I2C(%u)", i2c_num);
546554
} else {
547555
if (in_master_mode(self)) {
548-
mp_printf(print, "I2C(%u, I2C.MASTER, baudrate=%u)", i2c_num, i2c_get_baudrate(&self->i2c->Init));
556+
mp_printf(print, "I2C(%u, I2C.MASTER, baudrate=%u)", i2c_num, i2c_get_baudrate(self->i2c));
549557
} else {
550558
mp_printf(print, "I2C(%u, I2C.SLAVE, addr=0x%02x)", i2c_num, (self->i2c->Instance->OAR1 >> 1) & 0x7f);
551559
}

ports/stm32/i2c.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ extern const pyb_i2c_obj_t pyb_i2c_obj[4];
4848
void i2c_init0(void);
4949
void i2c_init(I2C_HandleTypeDef *i2c);
5050
void i2c_init_freq(const pyb_i2c_obj_t *self, mp_int_t freq);
51-
uint32_t i2c_get_baudrate(I2C_InitTypeDef *init);
51+
uint32_t i2c_get_baudrate(I2C_HandleTypeDef *i2c);
5252
void i2c_ev_irq_handler(mp_uint_t i2c_id);
5353
void i2c_er_irq_handler(mp_uint_t i2c_id);
5454

ports/stm32/machine_i2c.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ STATIC void machine_hard_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp
8888
machine_hard_i2c_obj_t *self = MP_OBJ_TO_PTR(self_in);
8989
mp_printf(print, "I2C(%u, freq=%u, timeout=%u)",
9090
self - &machine_hard_i2c_obj[0] + 1,
91-
i2c_get_baudrate(&self->pyb->i2c->Init),
91+
i2c_get_baudrate(self->pyb->i2c),
9292
*self->timeout);
9393
}
9494

0 commit comments

Comments
 (0)