stm32/machine_i2c: Provide hardware I2C for machine.I2C on F7 MCUs.

This commit is contained in:
Damien George 2018-04-24 17:34:42 +10:00
parent 19778d0a3c
commit 9254f365d6

View File

@ -416,6 +416,66 @@ timeout:
return -MP_ETIMEDOUT;
}
#elif defined(STM32F7)
typedef struct _machine_hard_i2c_obj_t {
mp_obj_base_t base;
i2c_t *i2c;
mp_hal_pin_obj_t scl;
mp_hal_pin_obj_t sda;
} machine_hard_i2c_obj_t;
STATIC const machine_hard_i2c_obj_t machine_hard_i2c_obj[] = {
#if defined(MICROPY_HW_I2C1_SCL)
{{&machine_hard_i2c_type}, I2C1, MICROPY_HW_I2C1_SCL, MICROPY_HW_I2C1_SDA},
#else
{{NULL}, NULL, NULL, NULL},
#endif
#if defined(MICROPY_HW_I2C2_SCL)
{{&machine_hard_i2c_type}, I2C2, MICROPY_HW_I2C2_SCL, MICROPY_HW_I2C2_SDA},
#else
{{NULL}, NULL, NULL, NULL},
#endif
#if defined(MICROPY_HW_I2C3_SCL)
{{&machine_hard_i2c_type}, I2C3, MICROPY_HW_I2C3_SCL, MICROPY_HW_I2C3_SDA},
#else
{{NULL}, NULL, NULL, NULL},
#endif
#if defined(MICROPY_HW_I2C4_SCL)
{{&machine_hard_i2c_type}, I2C4, MICROPY_HW_I2C4_SCL, MICROPY_HW_I2C4_SDA},
#else
{{NULL}, NULL, NULL, NULL},
#endif
};
STATIC void machine_hard_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
machine_hard_i2c_obj_t *self = MP_OBJ_TO_PTR(self_in);
uint32_t timingr = self->i2c->TIMINGR;
uint32_t presc = timingr >> 28;
uint32_t sclh = timingr >> 8 & 0xff;
uint32_t scll = timingr & 0xff;
uint32_t freq = HAL_RCC_GetPCLK1Freq() / (presc + 1) / (sclh + scll + 2);
mp_printf(print, "I2C(%u, scl=%q, sda=%q, freq=%u, timingr=0x%08x)",
self - &machine_hard_i2c_obj[0] + 1,
mp_hal_pin_name(self->scl), mp_hal_pin_name(self->sda),
freq, timingr);
}
void machine_hard_i2c_init(machine_hard_i2c_obj_t *self, uint32_t freq, uint32_t timeout) {
(void)timeout;
i2c_init(self->i2c, self->scl, self->sda, freq);
}
int machine_hard_i2c_readfrom(mp_obj_base_t *self_in, uint16_t addr, uint8_t *dest, size_t len, bool stop) {
machine_hard_i2c_obj_t *self = MP_OBJ_TO_PTR(self_in);
return i2c_readfrom(self->i2c, addr, dest, len, stop);
}
int machine_hard_i2c_writeto(mp_obj_base_t *self_in, uint16_t addr, const uint8_t *src, size_t len, bool stop) {
machine_hard_i2c_obj_t *self = MP_OBJ_TO_PTR(self_in);
return i2c_writeto(self->i2c, addr, src, len, stop);
}
#else
// No hardware I2C driver for this MCU so use the software implementation