diff options
author | Damien George <damien.p.george@gmail.com> | 2016-11-25 11:21:18 +1100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-11-25 11:21:18 +1100 |
commit | 652ca2017d8da647b30bddd4a8f782d05fa97a60 (patch) | |
tree | 8e7d10cfb7541b7f655abc18c9b66c15bb9e32cc /stmhal/i2c.c | |
parent | 30537489877fd77e129623f93d3921f547668fb8 (diff) | |
download | micropython-652ca2017d8da647b30bddd4a8f782d05fa97a60.tar.gz micropython-652ca2017d8da647b30bddd4a8f782d05fa97a60.zip |
stmhal/i2c: Add support for I2C4 hardware block on F7 MCUs.
Diffstat (limited to 'stmhal/i2c.c')
-rw-r--r-- | stmhal/i2c.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/stmhal/i2c.c b/stmhal/i2c.c index 8f5f8c2d93..9227d1d9dc 100644 --- a/stmhal/i2c.c +++ b/stmhal/i2c.c @@ -113,8 +113,11 @@ I2C_HandleTypeDef I2CHandle2 = {.Instance = NULL}; #if defined(MICROPY_HW_I2C3_SCL) I2C_HandleTypeDef I2CHandle3 = {.Instance = NULL}; #endif +#if defined(MICROPY_HW_I2C4_SCL) +I2C_HandleTypeDef I2CHandle4 = {.Instance = NULL}; +#endif -STATIC bool pyb_i2c_use_dma[3]; +STATIC bool pyb_i2c_use_dma[4]; STATIC const pyb_i2c_obj_t pyb_i2c_obj[] = { #if defined(MICROPY_HW_I2C1_SCL) @@ -132,6 +135,11 @@ STATIC const pyb_i2c_obj_t pyb_i2c_obj[] = { #else {{&pyb_i2c_type}, NULL, NULL, NULL, NULL}, #endif + #if defined(MICROPY_HW_I2C4_SCL) + {{&pyb_i2c_type}, &I2CHandle4, &dma_I2C_4_TX, &dma_I2C_4_RX, &pyb_i2c_use_dma[3]}, + #else + {{&pyb_i2c_type}, NULL, NULL, NULL, NULL}, + #endif }; #if defined(MICROPY_HW_I2C_BAUDRATE_TIMING) @@ -192,6 +200,10 @@ void i2c_init0(void) { memset(&I2CHandle3, 0, sizeof(I2C_HandleTypeDef)); I2CHandle3.Instance = I2C3; #endif + #if defined(MICROPY_HW_I2C4_SCL) + memset(&I2CHandle4, 0, sizeof(I2C_HandleTypeDef)); + I2CHandle3.Instance = I2C4; + #endif } void i2c_init(I2C_HandleTypeDef *i2c) { @@ -221,6 +233,13 @@ void i2c_init(I2C_HandleTypeDef *i2c) { sda_pin = &MICROPY_HW_I2C3_SDA; __I2C3_CLK_ENABLE(); #endif + #if defined(MICROPY_HW_I2C4_SCL) + } else if (i2c == &I2CHandle4) { + i2c_unit = 4; + scl_pin = &MICROPY_HW_I2C4_SCL; + sda_pin = &MICROPY_HW_I2C4_SDA; + __I2C3_CLK_ENABLE(); + #endif } else { // I2C does not exist for this board (shouldn't get here, should be checked by caller) return; @@ -262,6 +281,11 @@ void i2c_init(I2C_HandleTypeDef *i2c) { HAL_NVIC_EnableIRQ(I2C3_EV_IRQn); HAL_NVIC_EnableIRQ(I2C3_ER_IRQn); #endif + #if defined(MICROPY_HW_I2C4_SCL) + } else if (i2c->Instance == I2C4) { + HAL_NVIC_EnableIRQ(I2C4_EV_IRQn); + HAL_NVIC_EnableIRQ(I2C4_ER_IRQn); + #endif } } @@ -292,6 +316,14 @@ void i2c_deinit(I2C_HandleTypeDef *i2c) { HAL_NVIC_DisableIRQ(I2C3_EV_IRQn); HAL_NVIC_DisableIRQ(I2C3_ER_IRQn); #endif + #if defined(MICROPY_HW_I2C4_SCL) + } else if (i2c->Instance == I2C4) { + __HAL_RCC_I2C4_FORCE_RESET(); + __HAL_RCC_I2C4_RELEASE_RESET(); + __HAL_RCC_I2C4_CLK_DISABLE(); + HAL_NVIC_DisableIRQ(I2C4_EV_IRQn); + HAL_NVIC_DisableIRQ(I2C4_ER_IRQn); + #endif } } @@ -328,6 +360,11 @@ void i2c_ev_irq_handler(mp_uint_t i2c_id) { hi2c = &I2CHandle3; break; #endif + #if defined(MICROPY_HW_I2C4_SCL) + case 4: + hi2c = &I2CHandle4; + break; + #endif default: return; } @@ -375,6 +412,11 @@ void i2c_er_irq_handler(mp_uint_t i2c_id) { hi2c = &I2CHandle3; break; #endif + #if defined(MICROPY_HW_I2C4_SCL) + case 4: + hi2c = &I2CHandle4; + break; + #endif default: return; } @@ -448,6 +490,9 @@ STATIC void pyb_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp_print_ki #if defined(MICROPY_HW_I2C3_SCL) else if (self->i2c->Instance == I2C3) { i2c_num = 3; } #endif + #if defined(MICROPY_HW_I2C4_SCL) + else if (self->i2c->Instance == I2C4) { i2c_num = 4; } + #endif if (self->i2c->State == HAL_I2C_STATE_RESET) { mp_printf(print, "I2C(%u)", i2c_num); |