mirror of https://github.com/ARMmbed/mbed-os.git
Add support of I2C API for STM32H5 family (#323)
* fix PWM pin map in context of Timer change * Note about DAC on Nucleo-H503RB * Add ADC and DAC for STM32H5 * Copyright fix * Add I2C for STM32H5 * fix I2C related code * ADC/DAC fix * Enable I2C API * Copyright fix * fix I2C device * fix I2C ASYNCH macro * fix revert back the stop variable position --------- Co-authored-by: Jan Kamidra <odiin@windowslive.com>pull/15530/head
parent
047bbc3bd3
commit
3f239c6201
|
@ -13,6 +13,7 @@ target_sources(mbed-stm32h5
|
|||
analogin_device.c
|
||||
analogout_device.c
|
||||
gpio_irq_device.c
|
||||
i2c_device.c
|
||||
serial_device.c
|
||||
pwmout_device.c
|
||||
)
|
||||
|
|
|
@ -0,0 +1,139 @@
|
|||
/* mbed Microcontroller Library
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2024 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software component is licensed by ST under BSD 3-Clause license,
|
||||
* the "License"; You may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at:
|
||||
* opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include "i2c_device.h"
|
||||
#include "mbed_assert.h"
|
||||
#include "mbed_error.h"
|
||||
#include "stm32h5xx_ll_rcc.h"
|
||||
|
||||
/* Define I2C Device */
|
||||
#if DEVICE_I2C
|
||||
|
||||
/**
|
||||
* @brief Get I2C clock source frequency according I2C instance used.
|
||||
* @param i2c I2C instance name.
|
||||
* @retval I2C clock source frequency in Hz.
|
||||
*/
|
||||
uint32_t i2c_get_pclk(I2CName i2c)
|
||||
{
|
||||
uint32_t clocksource;
|
||||
uint32_t pclk = 0;
|
||||
#if !defined(RCC_CR_PLL3ON)
|
||||
PLL2_ClocksTypeDef pll2clock; //STM32H503
|
||||
#else
|
||||
PLL3_ClocksTypeDef pll3clock; //STM32H563
|
||||
#endif
|
||||
|
||||
if (i2c == I2C_1) {
|
||||
clocksource = __HAL_RCC_GET_I2C1_SOURCE();
|
||||
switch (clocksource) {
|
||||
case RCC_I2C1CLKSOURCE_PCLK1:
|
||||
pclk = HAL_RCC_GetPCLK1Freq();
|
||||
break;
|
||||
case RCC_I2C1CLKSOURCE_CSI:
|
||||
pclk = CSI_VALUE;
|
||||
break;
|
||||
case RCC_I2C1CLKSOURCE_HSI:
|
||||
pclk = HSI_VALUE;
|
||||
break;
|
||||
#if !defined(RCC_CR_PLL3ON)
|
||||
case RCC_I2C1CLKSOURCE_PLL2R:
|
||||
HAL_RCCEx_GetPLL2ClockFreq(&pll2clock);
|
||||
pclk = pll2clock.PLL2_R_Frequency;
|
||||
break;
|
||||
#else
|
||||
case RCC_I2C1CLKSOURCE_PLL3R:
|
||||
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
|
||||
pclk = pll3clock.PLL3_R_Frequency;
|
||||
break;
|
||||
#endif /* RCC_CR_PLL3ON */
|
||||
}
|
||||
}
|
||||
else if (i2c == I2C_2) {
|
||||
clocksource = __HAL_RCC_GET_I2C2_SOURCE();
|
||||
switch (clocksource) {
|
||||
case RCC_I2C2CLKSOURCE_PCLK1:
|
||||
pclk = HAL_RCC_GetPCLK1Freq();
|
||||
break;
|
||||
case RCC_I2C2CLKSOURCE_CSI:
|
||||
pclk = CSI_VALUE;
|
||||
break;
|
||||
case RCC_I2C2CLKSOURCE_HSI:
|
||||
pclk = HSI_VALUE;
|
||||
break;
|
||||
#if !defined(RCC_CR_PLL3ON)
|
||||
case RCC_I2C2CLKSOURCE_PLL2R:
|
||||
HAL_RCCEx_GetPLL2ClockFreq(&pll2clock);
|
||||
pclk = pll2clock.PLL2_R_Frequency;
|
||||
break;
|
||||
#else
|
||||
case RCC_I2C2CLKSOURCE_PLL3R:
|
||||
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
|
||||
pclk = pll3clock.PLL3_R_Frequency;
|
||||
break;
|
||||
#endif /* RCC_CR_PLL3ON */
|
||||
}
|
||||
}
|
||||
#if defined I2C3_BASE
|
||||
else if (i2c == I2C_3) {
|
||||
clocksource = __HAL_RCC_GET_I2C3_SOURCE();
|
||||
switch (clocksource) {
|
||||
case RCC_I2C3CLKSOURCE_PCLK3:
|
||||
pclk = HAL_RCC_GetPCLK3Freq();
|
||||
break;
|
||||
case RCC_I2C3CLKSOURCE_CSI:
|
||||
pclk = CSI_VALUE;
|
||||
break;
|
||||
case RCC_I2C3CLKSOURCE_HSI:
|
||||
pclk = HSI_VALUE;
|
||||
break;
|
||||
#if defined(RCC_CR_PLL3ON)
|
||||
case RCC_I2C3CLKSOURCE_PLL3R:
|
||||
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
|
||||
pclk = pll3clock.PLL3_R_Frequency;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined I2C4_BASE
|
||||
else if (i2c == I2C_4) {
|
||||
clocksource = __HAL_RCC_GET_I2C4_SOURCE();
|
||||
switch (clocksource) {
|
||||
case RCC_I2C4CLKSOURCE_PCLK3:
|
||||
pclk = HAL_RCC_GetPCLK3Freq();
|
||||
break;
|
||||
case RCC_I2C4CLKSOURCE_CSI:
|
||||
pclk = CSI_VALUE;
|
||||
break;
|
||||
case RCC_I2C4CLKSOURCE_HSI:
|
||||
pclk = HSI_VALUE;
|
||||
break;
|
||||
#if defined(RCC_CR_PLL3ON)
|
||||
case RCC_I2C4CLKSOURCE_PLL3R:
|
||||
HAL_RCCEx_GetPLL3ClockFreq(&pll3clock);
|
||||
pclk = pll3clock.PLL3_R_Frequency;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
// should not happend
|
||||
error("I2C: unknown instance");
|
||||
}
|
||||
return pclk;
|
||||
}
|
||||
#endif // DEVICE_I2C
|
|
@ -0,0 +1,65 @@
|
|||
/* mbed Microcontroller Library
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2015-2024 STMicroelectronics.
|
||||
* Copyright (c) 2020, Arduino SA.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software component is licensed by ST under BSD 3-Clause license,
|
||||
* the "License"; You may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at:
|
||||
* opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef MBED_I2C_DEVICE_H
|
||||
#define MBED_I2C_DEVICE_H
|
||||
|
||||
#include "PeripheralNames.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Define I2C Device */
|
||||
#if DEVICE_I2C
|
||||
|
||||
/* Define IP version */
|
||||
#define I2C_IP_VERSION_V2
|
||||
|
||||
// Note: Below values are generated using STM32Cube IDE
|
||||
#define TIMING_VAL_250M_CLK_100KHZ 0xA0E1597A // Standard mode with Rise Time = 400ns and Fall Time = 100ns
|
||||
#define TIMING_VAL_250M_CLK_400KHZ 0x90810E23 // Fast mode with Rise Time = 250ns and Fall Time = 100ns
|
||||
#define TIMING_VAL_250M_CLK_1MHZ 0x10D51940 // Fast mode Plus with Rise Time = 60ns and Fall Time = 100ns
|
||||
#define I2C_PCLK_250M 250000000 // 250 MHz
|
||||
|
||||
#define I2C_IT_ALL (I2C_IT_ERRI|I2C_IT_TCI|I2C_IT_STOPI|I2C_IT_NACKI|I2C_IT_ADDRI|I2C_IT_RXI|I2C_IT_TXI)
|
||||
|
||||
/* Family specifc settings for clock source */
|
||||
#define I2CAPI_I2C1_CLKSRC RCC_I2C1CLKSOURCE_PCLK1
|
||||
#define I2CAPI_I2C2_CLKSRC RCC_I2C2CLKSOURCE_PCLK1
|
||||
#if I2C3_BASE
|
||||
#define I2CAPI_I2C3_CLKSRC RCC_I2C3CLKSOURCE_PCLK3
|
||||
#endif
|
||||
#if I2C4_BASE
|
||||
#define I2CAPI_I2C4_CLKSRC RCC_I2C4CLKSOURCE_PCLK3
|
||||
#endif
|
||||
|
||||
uint32_t i2c_get_pclk(I2CName i2c);
|
||||
uint32_t i2c_get_timing(I2CName i2c, uint32_t current_timing, int current_hz, int hz);
|
||||
|
||||
#if MBED_CONF_TARGET_I2C_TIMING_VALUE_ALGO
|
||||
uint32_t i2c_compute_timing(uint32_t clock_src_freq, uint32_t i2c_freq);
|
||||
void i2c_compute_presc_scldel_sdadel(uint32_t clock_src_freq, uint32_t I2C_speed);
|
||||
uint32_t i2c_compute_scll_sclh(uint32_t clock_src_freq, uint32_t I2C_speed);
|
||||
#endif // MBED_CONF_TARGET_I2C_TIMING_VALUE_ALGO
|
||||
|
||||
#endif // DEVICE_I2C
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -1,6 +1,6 @@
|
|||
/* mbed Microcontroller Library
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2015-2021, STMicroelectronics
|
||||
* Copyright (c) 2015-2024, STMicroelectronics
|
||||
* All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
|
@ -1472,6 +1472,7 @@ void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|||
/* Get object ptr based on handler ptr */
|
||||
i2c_t *obj = get_i2c_obj(hi2c);
|
||||
struct i2c_s *obj_s = I2C_S(obj);
|
||||
#if DEVICE_I2C_ASYNCH
|
||||
#ifdef I2C_IP_VERSION_V1
|
||||
hi2c->PreviousState = I2C_STATE_NONE;
|
||||
#elif defined(I2C_IP_VERSION_V2)
|
||||
|
@ -1487,7 +1488,8 @@ void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
|
|||
obj_s->state = STM_I2C_IDLE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif /* I2C_IP_VERSION_VX */
|
||||
#endif /* DEVICE_I2C_ASYNCH */
|
||||
|
||||
// Set event flag. Note: We still get the complete callback even if an error was encountered,
|
||||
// so use |= to preserve any error flags.
|
||||
|
@ -1909,6 +1911,7 @@ void i2c_abort_asynch(i2c_t *obj)
|
|||
|
||||
STM_I2C_SET_STATE(obj_s, STM_I2C_IDLE);
|
||||
}
|
||||
#endif // DEVICE_I2C_ASYNCH
|
||||
|
||||
#if MBED_CONF_TARGET_I2C_TIMING_VALUE_ALGO
|
||||
/**
|
||||
|
@ -2397,6 +2400,4 @@ uint32_t i2c_get_timing(I2CName i2c, uint32_t current_timing, int current_hz,
|
|||
|
||||
#endif /* I2C_IP_VERSION_V2 */
|
||||
|
||||
#endif // DEVICE_I2C_ASYNCH
|
||||
|
||||
#endif // DEVICE_I2C
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2016-2022 STMicroelectronics
|
||||
* Copyright (c) 2016-2024 STMicroelectronics
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
@ -64,6 +64,7 @@ struct i2c_s {
|
|||
volatile uint8_t event;
|
||||
|
||||
int current_hz;
|
||||
|
||||
#if DEVICE_I2CSLAVE
|
||||
uint8_t slave;
|
||||
volatile uint8_t pending_slave_tx_master_rx;
|
||||
|
|
|
@ -3100,9 +3100,6 @@
|
|||
"LPTICKER",
|
||||
"CAN",
|
||||
"SERIAL_FC",
|
||||
"I2C",
|
||||
"I2C_ASYNCH",
|
||||
"I2CSLAVE",
|
||||
"SPI",
|
||||
"SPISLAVE",
|
||||
"SPI_ASYNCH",
|
||||
|
|
Loading…
Reference in New Issue