Skip to content

Commit 25b4e95

Browse files
committed
stm32/machine_i2c_target: Support er irqs.
Signed-off-by: Damien George <[email protected]>
1 parent 10fdc06 commit 25b4e95

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

ports/stm32/machine_i2c_target.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,31 +35,32 @@
3535
typedef 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

4344
static 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

204207
static 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

Comments
 (0)