@@ -285,8 +285,17 @@ int i2c_write(i2c_t *i2c, const uint8_t *src, size_t len, size_t next_len) {
285
285
286
286
STATIC uint16_t i2c_timeout_ms [MICROPY_HW_MAX_I2C ];
287
287
288
+ static uint32_t i2c_get_id (i2c_t * i2c ) {
289
+ #if defined(STM32H7 )
290
+ if (i2c == I2C4 ) {
291
+ return 3 ;
292
+ }
293
+ #endif
294
+ return ((uint32_t )i2c - I2C1_BASE ) / (I2C2_BASE - I2C1_BASE );
295
+ }
296
+
288
297
int i2c_init (i2c_t * i2c , mp_hal_pin_obj_t scl , mp_hal_pin_obj_t sda , uint32_t freq , uint16_t timeout_ms ) {
289
- uint32_t i2c_id = (( uint32_t ) i2c - I2C1_BASE ) / ( I2C2_BASE - I2C1_BASE );
298
+ uint32_t i2c_id = i2c_get_id ( i2c );
290
299
291
300
// Init pins
292
301
if (!mp_hal_pin_config_alt (scl , MP_HAL_PIN_MODE_ALT_OPEN_DRAIN , MP_HAL_PIN_PULL_UP , AF_FN_I2C , i2c_id + 1 )) {
@@ -300,9 +309,22 @@ int i2c_init(i2c_t *i2c, mp_hal_pin_obj_t scl, mp_hal_pin_obj_t sda, uint32_t fr
300
309
i2c_timeout_ms [i2c_id ] = timeout_ms ;
301
310
302
311
// Enable I2C peripheral clock
303
- RCC -> APB1ENR |= RCC_APB1ENR_I2C1EN << i2c_id ;
304
- volatile uint32_t tmp = RCC -> APB1ENR ; // delay after RCC clock enable
312
+ volatile uint32_t tmp ;
305
313
(void )tmp ;
314
+ switch (i2c_id ) {
315
+ case 0 :
316
+ case 1 :
317
+ case 2 :
318
+ RCC -> APB1ENR |= RCC_APB1ENR_I2C1EN << i2c_id ;
319
+ tmp = RCC -> APB1ENR ; // delay after RCC clock enable
320
+ break ;
321
+ #if defined(STM32H7 )
322
+ case 3 :
323
+ RCC -> APB4ENR |= RCC_APB4ENR_I2C4EN ;
324
+ tmp = RCC -> APB4ENR ; // delay after RCC clock enable
325
+ break ;
326
+ #endif
327
+ }
306
328
307
329
// Initialise I2C peripheral
308
330
i2c -> CR1 = 0 ;
@@ -340,7 +362,8 @@ int i2c_init(i2c_t *i2c, mp_hal_pin_obj_t scl, mp_hal_pin_obj_t sda, uint32_t fr
340
362
}
341
363
342
364
STATIC int i2c_wait_cr2_clear (i2c_t * i2c , uint32_t mask ) {
343
- uint32_t i2c_id = ((uint32_t )i2c - I2C1_BASE ) / (I2C2_BASE - I2C1_BASE );
365
+ uint32_t i2c_id = i2c_get_id (i2c );
366
+
344
367
uint32_t t0 = HAL_GetTick ();
345
368
while (i2c -> CR2 & mask ) {
346
369
if (HAL_GetTick () - t0 >= i2c_timeout_ms [i2c_id ]) {
@@ -352,7 +375,8 @@ STATIC int i2c_wait_cr2_clear(i2c_t *i2c, uint32_t mask) {
352
375
}
353
376
354
377
STATIC int i2c_wait_isr_set (i2c_t * i2c , uint32_t mask ) {
355
- uint32_t i2c_id = ((uint32_t )i2c - I2C1_BASE ) / (I2C2_BASE - I2C1_BASE );
378
+ uint32_t i2c_id = i2c_get_id (i2c );
379
+
356
380
uint32_t t0 = HAL_GetTick ();
357
381
while (!(i2c -> ISR & mask )) {
358
382
if (HAL_GetTick () - t0 >= i2c_timeout_ms [i2c_id ]) {
0 commit comments