diff --git a/src/main/drivers/bus_i2c_config.c b/src/main/drivers/bus_i2c_config.c index c633a27b02..0119c11b7c 100644 --- a/src/main/drivers/bus_i2c_config.c +++ b/src/main/drivers/bus_i2c_config.c @@ -73,13 +73,13 @@ void i2cHardwareConfigure(const i2cConfig_t *i2cConfig) for (int pindex = 0 ; pindex < I2C_PIN_SEL_MAX ; pindex++) { if (i2cConfig[device].ioTagScl == hardware->sclPins[pindex].ioTag) { pDev->scl = IOGetByTag(i2cConfig[device].ioTagScl); -#if defined(STM32F4) +#if defined(STM32F4) || defined(STM32H7) pDev->sclAF = hardware->sclPins[pindex].af; #endif } if (i2cConfig[device].ioTagSda == hardware->sdaPins[pindex].ioTag) { pDev->sda = IOGetByTag(i2cConfig[device].ioTagSda); -#if defined(STM32F4) +#if defined(STM32F4) || defined(STM32H7) pDev->sdaAF = hardware->sdaPins[pindex].af; #endif } diff --git a/src/main/drivers/bus_i2c_hal.c b/src/main/drivers/bus_i2c_hal.c index 46691a7784..309615ea0c 100644 --- a/src/main/drivers/bus_i2c_hal.c +++ b/src/main/drivers/bus_i2c_hal.c @@ -56,6 +56,7 @@ static void i2cUnstick(IO_t scl, IO_t sda); #define GPIO_AF4_I2C GPIO_AF4_I2C1 const i2cHardware_t i2cHardware[I2CDEV_COUNT] = { +#if defined(STM32F7) #ifdef USE_I2C_DEVICE_1 { .device = I2CDEV_1, @@ -100,6 +101,52 @@ const i2cHardware_t i2cHardware[I2CDEV_COUNT] = { .er_irq = I2C4_ER_IRQn, }, #endif +#elif defined(STM32H7) +#ifdef USE_I2C_DEVICE_1 + { + .device = I2CDEV_1, + .reg = I2C1, + .sclPins = { I2CPINDEF(PB6, GPIO_AF4_I2C1), I2CPINDEF(PB8, GPIO_AF4_I2C1) }, + .sdaPins = { I2CPINDEF(PB7, GPIO_AF4_I2C1), I2CPINDEF(PB9, GPIO_AF4_I2C1) }, + .rcc = RCC_APB1L(I2C1), + .ev_irq = I2C1_EV_IRQn, + .er_irq = I2C1_ER_IRQn, + }, +#endif +#ifdef USE_I2C_DEVICE_2 + { + .device = I2CDEV_2, + .reg = I2C2, + .sclPins = { I2CPINDEF(PB10, GPIO_AF4_I2C2), I2CPINDEF(PF1, GPIO_AF4_I2C2) }, + .sdaPins = { I2CPINDEF(PB11, GPIO_AF4_I2C2), I2CPINDEF(PF0, GPIO_AF4_I2C2) }, + .rcc = RCC_APB1L(I2C2), + .ev_irq = I2C2_EV_IRQn, + .er_irq = I2C2_ER_IRQn, + }, +#endif +#ifdef USE_I2C_DEVICE_3 + { + .device = I2CDEV_3, + .reg = I2C3, + .sclPins = { I2CPINDEF(PA8, GPIO_AF4_I2C3) }, + .sdaPins = { I2CPINDEF(PC9, GPIO_AF4_I2C3) }, + .rcc = RCC_APB1L(I2C3), + .ev_irq = I2C3_EV_IRQn, + .er_irq = I2C3_ER_IRQn, + }, +#endif +#ifdef USE_I2C_DEVICE_4 + { + .device = I2CDEV_4, + .reg = I2C4, + .sclPins = { I2CPINDEF(PD12, GPIO_AF4_I2C4), I2CPINDEF(PF14, GPIO_AF4_I2C4), I2CPINDEF(PB6, GPIO_AF6_I2C4), I2CPINDEF(PB8, GPIO_AF6_I2C4) }, + .sdaPins = { I2CPINDEF(PD13, GPIO_AF4_I2C4), I2CPINDEF(PF15, GPIO_AF4_I2C4), I2CPINDEF(PB7, GPIO_AF6_I2C4), I2CPINDEF(PB9, GPIO_AF6_I2C4) }, + .rcc = RCC_APB1L(I2C4), + .ev_irq = I2C4_EV_IRQn, + .er_irq = I2C4_ER_IRQn, + }, +#endif +#endif }; i2cDevice_t i2cDevice[I2CDEV_COUNT]; @@ -250,9 +297,12 @@ void i2cInit(I2CDevice device) i2cUnstick(scl, sda); // Init pins -#ifdef STM32F7 +#if defined(STM32F7) IOConfigGPIOAF(scl, pDev->pullUp ? IOCFG_I2C_PU : IOCFG_I2C, GPIO_AF4_I2C); IOConfigGPIOAF(sda, pDev->pullUp ? IOCFG_I2C_PU : IOCFG_I2C, GPIO_AF4_I2C); +#elif defined(STM32H7) + IOConfigGPIOAF(scl, pDev->pullUp ? IOCFG_I2C_PU : IOCFG_I2C, pDev->sclAF); + IOConfigGPIOAF(sda, pDev->pullUp ? IOCFG_I2C_PU : IOCFG_I2C, pDev->sdaAF); #else IOConfigGPIO(scl, IOCFG_AF_OD); IOConfigGPIO(sda, IOCFG_AF_OD); diff --git a/src/main/drivers/bus_i2c_impl.h b/src/main/drivers/bus_i2c_impl.h index 34c5ea503e..cf5c2b8fd2 100644 --- a/src/main/drivers/bus_i2c_impl.h +++ b/src/main/drivers/bus_i2c_impl.h @@ -33,12 +33,12 @@ typedef struct i2cPinDef_s { ioTag_t ioTag; -#if defined(STM32F4) +#if defined(STM32F4) || defined(STM32H7) uint8_t af; #endif } i2cPinDef_t; -#if defined(STM32F4) +#if defined(STM32F4) || defined(STM32H7) #define I2CPINDEF(pin, af) { DEFIO_TAG_E(pin), af } #elif defined(STM32F1) #define I2CPINDEF(pin, af) { DEFIO_TAG_E(pin) } @@ -79,7 +79,7 @@ typedef struct i2cDevice_s { I2C_TypeDef *reg; IO_t scl; IO_t sda; -#ifdef STM32F4 +#if defined(STM32F4) || defined(STM32H7) uint8_t sclAF; uint8_t sdaAF; #endif