@@ -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 }
0 commit comments