summaryrefslogtreecommitdiffstatshomepage
path: root/stmhal/i2c.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2016-11-25 11:21:18 +1100
committerDamien George <damien.p.george@gmail.com>2016-11-25 11:21:18 +1100
commit652ca2017d8da647b30bddd4a8f782d05fa97a60 (patch)
tree8e7d10cfb7541b7f655abc18c9b66c15bb9e32cc /stmhal/i2c.c
parent30537489877fd77e129623f93d3921f547668fb8 (diff)
downloadmicropython-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.c47
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);