1 /** 2 ****************************************************************************** 3 * @file stm32h5xx_hal_smbus_ex.c 4 * @author MCD Application Team 5 * @brief SMBUS Extended HAL module driver. 6 * This file provides firmware functions to manage the following 7 * functionalities of SMBUS Extended peripheral: 8 * + Extended features functions 9 * + WakeUp Mode Functions 10 * + FastModePlus Functions 11 * 12 ****************************************************************************** 13 * @attention 14 * 15 * Copyright (c) 2023 STMicroelectronics. 16 * All rights reserved. 17 * 18 * This software is licensed under terms that can be found in the LICENSE file 19 * in the root directory of this software component. 20 * If no LICENSE file comes with this software, it is provided AS-IS. 21 * 22 ****************************************************************************** 23 @verbatim 24 ============================================================================== 25 ##### SMBUS peripheral Extended features ##### 26 ============================================================================== 27 28 [..] Comparing to other previous devices, the SMBUS interface for STM32H5xx 29 devices contains the following additional features 30 31 (+) Disable or enable wakeup from Stop mode(s) 32 33 ##### How to use this driver ##### 34 ============================================================================== 35 (#) Configure the enable or disable of SMBUS Wake Up Mode using the functions : 36 (++) HAL_SMBUSEx_EnableWakeUp() 37 (++) HAL_SMBUSEx_DisableWakeUp() 38 (#) Configure the enable or disable of fast mode plus driving capability using the functions : 39 (++) HAL_SMBUSEx_ConfigFastModePlus() 40 @endverbatim 41 */ 42 43 /* Includes ------------------------------------------------------------------*/ 44 #include "stm32h5xx_hal.h" 45 46 /** @addtogroup STM32H5xx_HAL_Driver 47 * @{ 48 */ 49 50 /** @defgroup SMBUSEx SMBUSEx 51 * @brief SMBUS Extended HAL module driver 52 * @{ 53 */ 54 55 #ifdef HAL_SMBUS_MODULE_ENABLED 56 57 /* Private typedef -----------------------------------------------------------*/ 58 /* Private define ------------------------------------------------------------*/ 59 /* Private macro -------------------------------------------------------------*/ 60 /* Private variables ---------------------------------------------------------*/ 61 /* Private function prototypes -----------------------------------------------*/ 62 /* Private functions ---------------------------------------------------------*/ 63 64 /** @defgroup SMBUSEx_Exported_Functions SMBUS Extended Exported Functions 65 * @{ 66 */ 67 68 /** @defgroup SMBUSEx_Exported_Functions_Group2 WakeUp Mode Functions 69 * @brief WakeUp Mode Functions 70 * 71 @verbatim 72 =============================================================================== 73 ##### WakeUp Mode Functions ##### 74 =============================================================================== 75 [..] This section provides functions allowing to: 76 (+) Configure Wake Up Feature 77 78 @endverbatim 79 * @{ 80 */ 81 82 /** 83 * @brief Enable SMBUS wakeup from Stop mode(s). 84 * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains 85 * the configuration information for the specified SMBUSx peripheral. 86 * @retval HAL status 87 */ HAL_SMBUSEx_EnableWakeUp(SMBUS_HandleTypeDef * hsmbus)88HAL_StatusTypeDef HAL_SMBUSEx_EnableWakeUp(SMBUS_HandleTypeDef *hsmbus) 89 { 90 /* Check the parameters */ 91 assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hsmbus->Instance)); 92 93 if (hsmbus->State == HAL_SMBUS_STATE_READY) 94 { 95 /* Process Locked */ 96 __HAL_LOCK(hsmbus); 97 98 hsmbus->State = HAL_SMBUS_STATE_BUSY; 99 100 /* Disable the selected SMBUS peripheral */ 101 __HAL_SMBUS_DISABLE(hsmbus); 102 103 /* Enable wakeup from stop mode */ 104 hsmbus->Instance->CR1 |= I2C_CR1_WUPEN; 105 106 __HAL_SMBUS_ENABLE(hsmbus); 107 108 hsmbus->State = HAL_SMBUS_STATE_READY; 109 110 /* Process Unlocked */ 111 __HAL_UNLOCK(hsmbus); 112 113 return HAL_OK; 114 } 115 else 116 { 117 return HAL_BUSY; 118 } 119 } 120 121 /** 122 * @brief Disable SMBUS wakeup from Stop mode(s). 123 * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains 124 * the configuration information for the specified SMBUSx peripheral. 125 * @retval HAL status 126 */ HAL_SMBUSEx_DisableWakeUp(SMBUS_HandleTypeDef * hsmbus)127HAL_StatusTypeDef HAL_SMBUSEx_DisableWakeUp(SMBUS_HandleTypeDef *hsmbus) 128 { 129 /* Check the parameters */ 130 assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hsmbus->Instance)); 131 132 if (hsmbus->State == HAL_SMBUS_STATE_READY) 133 { 134 /* Process Locked */ 135 __HAL_LOCK(hsmbus); 136 137 hsmbus->State = HAL_SMBUS_STATE_BUSY; 138 139 /* Disable the selected SMBUS peripheral */ 140 __HAL_SMBUS_DISABLE(hsmbus); 141 142 /* Disable wakeup from stop mode */ 143 hsmbus->Instance->CR1 &= ~(I2C_CR1_WUPEN); 144 145 __HAL_SMBUS_ENABLE(hsmbus); 146 147 hsmbus->State = HAL_SMBUS_STATE_READY; 148 149 /* Process Unlocked */ 150 __HAL_UNLOCK(hsmbus); 151 152 return HAL_OK; 153 } 154 else 155 { 156 return HAL_BUSY; 157 } 158 } 159 /** 160 * @} 161 */ 162 163 /** @defgroup SMBUSEx_Exported_Functions_Group3 Fast Mode Plus Functions 164 * @brief Fast Mode Plus Functions 165 * 166 @verbatim 167 =============================================================================== 168 ##### Fast Mode Plus Functions ##### 169 =============================================================================== 170 [..] This section provides functions allowing to: 171 (+) Configure Fast Mode Plus 172 173 @endverbatim 174 * @{ 175 */ 176 177 /** 178 * @brief Configure SMBUS Fast Mode Plus. 179 * @param hsmbus Pointer to a SMBUS_HandleTypeDef structure that contains 180 * the configuration information for the specified SMBUSx peripheral. 181 * @param FastModePlus New state of the Fast Mode Plus. 182 * @retval HAL status 183 */ HAL_SMBUSEx_ConfigFastModePlus(SMBUS_HandleTypeDef * hsmbus,uint32_t FastModePlus)184HAL_StatusTypeDef HAL_SMBUSEx_ConfigFastModePlus(SMBUS_HandleTypeDef *hsmbus, uint32_t FastModePlus) 185 { 186 /* Check the parameters */ 187 assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->Instance)); 188 assert_param(IS_SMBUS_FASTMODEPLUS(FastModePlus)); 189 190 if (hsmbus->State == HAL_SMBUS_STATE_READY) 191 { 192 /* Process Locked */ 193 __HAL_LOCK(hsmbus); 194 195 hsmbus->State = HAL_SMBUS_STATE_BUSY; 196 197 /* Disable the selected SMBUS peripheral */ 198 __HAL_SMBUS_DISABLE(hsmbus); 199 200 if (FastModePlus == SMBUS_FASTMODEPLUS_ENABLE) 201 { 202 /* Set SMBUSx FMP bit */ 203 hsmbus->Instance->CR1 |= (I2C_CR1_FMP); 204 } 205 else 206 { 207 /* Reset SMBUSx FMP bit */ 208 hsmbus->Instance->CR1 &= ~(I2C_CR1_FMP); 209 } 210 211 __HAL_SMBUS_ENABLE(hsmbus); 212 213 hsmbus->State = HAL_SMBUS_STATE_READY; 214 215 /* Process Unlocked */ 216 __HAL_UNLOCK(hsmbus); 217 218 return HAL_OK; 219 } 220 else 221 { 222 return HAL_BUSY; 223 } 224 } 225 226 /** 227 * @} 228 */ 229 230 /** 231 * @} 232 */ 233 234 /** 235 * @} 236 */ 237 238 #endif /* HAL_SMBUS_MODULE_ENABLED */ 239 /** 240 * @} 241 */ 242 243 /** 244 * @} 245 */ 246