From ac8387e3720bd879b4f13befb64a3f774c15e101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Thu, 22 Jul 2021 11:44:15 +0300 Subject: [PATCH] [FL-1581] I2C fast mode #596 --- firmware/targets/f6/api-hal/api-hal-clock.c | 1 + firmware/targets/f6/api-hal/api-hal-i2c.c | 23 +++++++++++-------- .../targets/f6/api-hal/api-hal-resources.h | 10 ++++++-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/firmware/targets/f6/api-hal/api-hal-clock.c b/firmware/targets/f6/api-hal/api-hal-clock.c index 411144b3..f0172452 100644 --- a/firmware/targets/f6/api-hal/api-hal-clock.c +++ b/firmware/targets/f6/api-hal/api-hal-clock.c @@ -93,6 +93,7 @@ void api_hal_clock_init() { // AHB1 LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMAMUX1); LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1); + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1); // AHB2 LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); diff --git a/firmware/targets/f6/api-hal/api-hal-i2c.c b/firmware/targets/f6/api-hal/api-hal-i2c.c index a525c5b3..dc9dd87f 100644 --- a/firmware/targets/f6/api-hal/api-hal-i2c.c +++ b/firmware/targets/f6/api-hal/api-hal-i2c.c @@ -1,4 +1,6 @@ #include +#include + #include #include #include @@ -15,7 +17,6 @@ void api_hal_i2c_init() { LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); - LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); GPIO_InitStruct.Pin = POWER_I2C_SCL_Pin | POWER_I2C_SDA_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; @@ -24,21 +25,23 @@ void api_hal_i2c_init() { GPIO_InitStruct.Alternate = LL_GPIO_AF_4; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); - LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1); - I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C; - I2C_InitStruct.Timing = POWER_I2C_TIMINGS; I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; I2C_InitStruct.DigitalFilter = 0; I2C_InitStruct.OwnAddress1 = 0; I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK; I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; - LL_I2C_Init(I2C1, &I2C_InitStruct); - LL_I2C_EnableAutoEndMode(I2C1); - LL_I2C_SetOwnAddress2(I2C1, 0, LL_I2C_OWNADDRESS2_NOMASK); - LL_I2C_DisableOwnAddress2(I2C1); - LL_I2C_DisableGeneralCall(I2C1); - LL_I2C_EnableClockStretching(I2C1); + if (api_hal_version_get_hw_version() > 10) { + I2C_InitStruct.Timing = POWER_I2C_TIMINGS_400; + } else { + I2C_InitStruct.Timing = POWER_I2C_TIMINGS_100; + } + LL_I2C_Init(POWER_I2C, &I2C_InitStruct); + LL_I2C_EnableAutoEndMode(POWER_I2C); + LL_I2C_SetOwnAddress2(POWER_I2C, 0, LL_I2C_OWNADDRESS2_NOMASK); + LL_I2C_DisableOwnAddress2(POWER_I2C); + LL_I2C_DisableGeneralCall(POWER_I2C); + LL_I2C_EnableClockStretching(POWER_I2C); } bool api_hal_i2c_tx( diff --git a/firmware/targets/f6/api-hal/api-hal-resources.h b/firmware/targets/f6/api-hal/api-hal-resources.h index 5381005d..e962a232 100644 --- a/firmware/targets/f6/api-hal/api-hal-resources.h +++ b/firmware/targets/f6/api-hal/api-hal-resources.h @@ -17,10 +17,16 @@ extern "C" { #define POWER_I2C I2C1 /** Timing register value is computed with the STM32CubeMX Tool, - * Fast Mode @100kHz with I2CCLK = 64 MHz, + * Standard Mode @100kHz with I2CCLK = 64 MHz, * rise time = 0ns, fall time = 0ns */ -#define POWER_I2C_TIMINGS 0x10707DBC +#define POWER_I2C_TIMINGS_100 0x10707DBC + +/** Timing register value is computed with the STM32CubeMX Tool, + * Fast Mode @400kHz with I2CCLK = 64 MHz, + * rise time = 0ns, fall time = 0ns + */ +#define POWER_I2C_TIMINGS_400 0x00602173 /* Input Related Constants */ #define INPUT_DEBOUNCE_TICKS 20