3535typedef struct _machine_i2c_target_obj_t {
3636 mp_obj_base_t base ;
3737 I2C_TypeDef * i2c ;
38- int irqn ;
38+ uint16_t irqn_ev ;
39+ uint16_t irqn_er ;
3940 mp_hal_pin_obj_t scl ;
4041 mp_hal_pin_obj_t sda ;
4142} machine_i2c_target_obj_t ;
4243
4344static const machine_i2c_target_obj_t machine_i2cslave_obj [] = {
4445 #if defined(MICROPY_HW_I2C1_SCL )
45- {{& machine_i2c_target_type }, I2C1 , I2C1_EV_IRQn , MICROPY_HW_I2C1_SCL , MICROPY_HW_I2C1_SDA },
46+ {{& machine_i2c_target_type }, I2C1 , I2C1_EV_IRQn , I2C1_ER_IRQn , MICROPY_HW_I2C1_SCL , MICROPY_HW_I2C1_SDA },
4647 #else
47- {{NULL }, NULL , 0 , NULL , NULL },
48+ {{NULL }, NULL , 0 , 0 , NULL , NULL },
4849 #endif
4950 #if defined(MICROPY_HW_I2C2_SCL )
50- {{& machine_i2c_target_type }, I2C2 , I2C2_EV_IRQn , MICROPY_HW_I2C2_SCL , MICROPY_HW_I2C2_SDA },
51+ {{& machine_i2c_target_type }, I2C2 , I2C2_EV_IRQn , I2C2_ER_IRQn , MICROPY_HW_I2C2_SCL , MICROPY_HW_I2C2_SDA },
5152 #else
52- {{NULL }, NULL , 0 , NULL , NULL },
53+ {{NULL }, NULL , 0 , 0 , NULL , NULL },
5354 #endif
5455 #if defined(MICROPY_HW_I2C3_SCL )
55- {{& machine_i2c_target_type }, I2C3 , I2C3_EV_IRQn , MICROPY_HW_I2C3_SCL , MICROPY_HW_I2C3_SDA },
56+ {{& machine_i2c_target_type }, I2C3 , I2C3_EV_IRQn , I2C3_ER_IRQn , MICROPY_HW_I2C3_SCL , MICROPY_HW_I2C3_SDA },
5657 #else
57- {{NULL }, NULL , 0 , NULL , NULL },
58+ {{NULL }, NULL , 0 , 0 , NULL , NULL },
5859 #endif
5960 #if defined(MICROPY_HW_I2C4_SCL )
60- {{& machine_i2c_target_type }, I2C4 , I2C4_EV_IRQn , MICROPY_HW_I2C4_SCL , MICROPY_HW_I2C4_SDA },
61+ {{& machine_i2c_target_type }, I2C4 , I2C4_EV_IRQn , I2C4_ER_IRQn , MICROPY_HW_I2C4_SCL , MICROPY_HW_I2C4_SDA },
6162 #else
62- {{NULL }, NULL , 0 , NULL , NULL },
63+ {{NULL }, NULL , 0 , 0 , NULL , NULL },
6364 #endif
6465};
6566
@@ -187,7 +188,9 @@ static mp_obj_t mp_machine_i2c_target_make_new(const mp_obj_type_t *type, size_t
187188 // Initialise the I2C target.
188189 mp_hal_pin_config_alt (self -> scl , MP_HAL_PIN_MODE_ALT_OPEN_DRAIN , MP_HAL_PIN_PULL_NONE , AF_FN_I2C , i2c_id );
189190 mp_hal_pin_config_alt (self -> sda , MP_HAL_PIN_MODE_ALT_OPEN_DRAIN , MP_HAL_PIN_PULL_NONE , AF_FN_I2C , i2c_id );
190- i2c_slave_init (self -> i2c , self -> irqn , IRQ_PRI_I2C , args [ARG_addr ].u_int );
191+ i2c_slave_init (self -> i2c , self -> irqn_ev , IRQ_PRI_I2C , args [ARG_addr ].u_int );
192+ NVIC_SetPriority (self -> irqn_er , IRQ_PRI_I2C );
193+ NVIC_EnableIRQ (self -> irqn_er );
191194
192195 i2c_target_enabled |= 1 << (i2c_id - 1 );
193196
@@ -202,5 +205,6 @@ static void mp_machine_i2c_target_print(const mp_print_t *print, mp_obj_t self_i
202205}
203206
204207static void mp_machine_i2c_target_deinit (machine_i2c_target_obj_t * self ) {
205- i2c_slave_shutdown (self -> i2c , self -> irqn );
208+ i2c_slave_shutdown (self -> i2c , self -> irqn_ev );
209+ NVIC_DisableIRQ (self -> irqn_er );
206210}
0 commit comments