TUKS MCU Introductory course / TUKS-COURSE-THERMOMETER

Fork of TUKS-COURSE-TIMER by TUKS MCU Introductory course

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers stm32l4xx_hal_i2c_ex.c Source File

stm32l4xx_hal_i2c_ex.c

Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32l4xx_hal_i2c_ex.c
00004   * @author  MCD Application Team
00005   * @version V1.5.1
00006   * @date    31-May-2016
00007   * @brief   I2C Extended HAL module driver.
00008   *          This file provides firmware functions to manage the following 
00009   *          functionalities of I2C Extended peripheral:
00010   *           + Extended features functions
00011   *
00012   @verbatim
00013   ==============================================================================
00014                ##### I2C peripheral Extended features  #####
00015   ==============================================================================
00016 
00017   [..] Comparing to other previous devices, the I2C interface for STM32L4xx
00018        devices contains the following additional features
00019 
00020        (+) Possibility to disable or enable Analog Noise Filter
00021        (+) Use of a configured Digital Noise Filter
00022        (+) Disable or enable wakeup from Stop modes
00023 
00024                      ##### How to use this driver #####
00025   ==============================================================================
00026   [..] This driver provides functions to configure Noise Filter and Wake Up Feature
00027     (#) Configure I2C Analog noise filter using the function HAL_I2CEx_ConfigAnalogFilter()
00028     (#) Configure I2C Digital noise filter using the function HAL_I2CEx_ConfigDigitalFilter()
00029     (#) Configure the enable or disable of I2C Wake Up Mode using the functions :
00030           (++) HAL_I2CEx_EnableWakeUp()
00031           (++) HAL_I2CEx_DisableWakeUp()
00032     (#) Configure the enable or disable of fast mode plus driving capability using the functions :
00033           (++) HAL_I2CEx_EnableFastModePlus()
00034           (++) HAL_I2CEx_DisbleFastModePlus()
00035   @endverbatim
00036   ******************************************************************************
00037   * @attention
00038   *
00039   * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
00040   *
00041   * Redistribution and use in source and binary forms, with or without modification,
00042   * are permitted provided that the following conditions are met:
00043   *   1. Redistributions of source code must retain the above copyright notice,
00044   *      this list of conditions and the following disclaimer.
00045   *   2. Redistributions in binary form must reproduce the above copyright notice,
00046   *      this list of conditions and the following disclaimer in the documentation
00047   *      and/or other materials provided with the distribution.
00048   *   3. Neither the name of STMicroelectronics nor the names of its contributors
00049   *      may be used to endorse or promote products derived from this software
00050   *      without specific prior written permission.
00051   *
00052   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00053   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00054   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00055   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00056   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00057   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00058   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00059   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00060   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00061   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00062   *
00063   ******************************************************************************
00064   */
00065 
00066 /* Includes ------------------------------------------------------------------*/
00067 #include "stm32l4xx_hal.h"
00068 
00069 /** @addtogroup STM32L4xx_HAL_Driver
00070   * @{
00071   */
00072 
00073 /** @defgroup I2CEx I2CEx
00074   * @brief I2C Extended HAL module driver
00075   * @{
00076   */
00077 
00078 #ifdef HAL_I2C_MODULE_ENABLED
00079 
00080 /* Private typedef -----------------------------------------------------------*/
00081 /* Private define ------------------------------------------------------------*/
00082 /* Private macro -------------------------------------------------------------*/
00083 /* Private variables ---------------------------------------------------------*/
00084 /* Private function prototypes -----------------------------------------------*/
00085 /* Private functions ---------------------------------------------------------*/
00086 
00087 /** @defgroup I2CEx_Exported_Functions I2C Extended Exported Functions
00088   * @{
00089   */
00090 
00091 /** @defgroup I2CEx_Exported_Functions_Group1 Extended features functions
00092   * @brief    Extended features functions
00093  *
00094 @verbatim
00095  ===============================================================================
00096                       ##### Extended features functions #####
00097  ===============================================================================
00098     [..] This section provides functions allowing to:
00099       (+) Configure Noise Filters 
00100       (+) Configure Wake Up Feature
00101 
00102 @endverbatim
00103   * @{
00104   */
00105 
00106 /**
00107   * @brief  Configure I2C Analog noise filter.
00108   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
00109   *                the configuration information for the specified I2Cx peripheral.
00110   * @param  AnalogFilter New state of the Analog filter.
00111   * @retval HAL status
00112   */
00113 HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter)
00114 {
00115   /* Check the parameters */
00116   assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
00117   assert_param(IS_I2C_ANALOG_FILTER(AnalogFilter));
00118 
00119   if(hi2c->State == HAL_I2C_STATE_READY)
00120   {
00121     /* Process Locked */
00122     __HAL_LOCK(hi2c);
00123 
00124     hi2c->State = HAL_I2C_STATE_BUSY;
00125 
00126     /* Disable the selected I2C peripheral */
00127     __HAL_I2C_DISABLE(hi2c);
00128 
00129     /* Reset I2Cx ANOFF bit */
00130     hi2c->Instance->CR1 &= ~(I2C_CR1_ANFOFF);
00131 
00132     /* Set analog filter bit*/
00133     hi2c->Instance->CR1 |= AnalogFilter;
00134 
00135     __HAL_I2C_ENABLE(hi2c);
00136 
00137     hi2c->State = HAL_I2C_STATE_READY;
00138 
00139     /* Process Unlocked */
00140     __HAL_UNLOCK(hi2c);
00141 
00142     return HAL_OK;
00143   }
00144   else
00145   {
00146     return HAL_BUSY;
00147   }
00148 }
00149 
00150 /**
00151   * @brief  Configure I2C Digital noise filter.
00152   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
00153   *                the configuration information for the specified I2Cx peripheral.
00154   * @param  DigitalFilter Coefficient of digital noise filter between 0x00 and 0x0F.
00155   * @retval HAL status
00156   */
00157 HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter)
00158 {
00159   uint32_t tmpreg = 0U;
00160 
00161   /* Check the parameters */
00162   assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
00163   assert_param(IS_I2C_DIGITAL_FILTER(DigitalFilter));
00164 
00165   if(hi2c->State == HAL_I2C_STATE_READY)
00166   {
00167     /* Process Locked */
00168     __HAL_LOCK(hi2c);
00169 
00170     hi2c->State = HAL_I2C_STATE_BUSY;
00171 
00172     /* Disable the selected I2C peripheral */
00173     __HAL_I2C_DISABLE(hi2c);
00174 
00175     /* Get the old register value */
00176     tmpreg = hi2c->Instance->CR1;
00177 
00178     /* Reset I2Cx DNF bits [11:8] */
00179     tmpreg &= ~(I2C_CR1_DNF);
00180 
00181     /* Set I2Cx DNF coefficient */
00182     tmpreg |= DigitalFilter << 8U;
00183 
00184     /* Store the new register value */
00185     hi2c->Instance->CR1 = tmpreg;
00186 
00187     __HAL_I2C_ENABLE(hi2c);
00188 
00189     hi2c->State = HAL_I2C_STATE_READY;
00190 
00191     /* Process Unlocked */
00192     __HAL_UNLOCK(hi2c);
00193 
00194     return HAL_OK;
00195   }
00196   else
00197   {
00198     return HAL_BUSY;
00199   }
00200 }
00201 
00202 /**
00203   * @brief  Enable I2C wakeup from stop mode.
00204   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
00205   *                the configuration information for the specified I2Cx peripheral.
00206   * @retval HAL status
00207   */
00208 HAL_StatusTypeDef HAL_I2CEx_EnableWakeUp (I2C_HandleTypeDef *hi2c)
00209 {
00210   /* Check the parameters */
00211   assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hi2c->Instance));
00212 
00213   if(hi2c->State == HAL_I2C_STATE_READY)
00214   {
00215     /* Process Locked */
00216     __HAL_LOCK(hi2c);
00217 
00218     hi2c->State = HAL_I2C_STATE_BUSY;
00219 
00220     /* Disable the selected I2C peripheral */
00221     __HAL_I2C_DISABLE(hi2c);
00222 
00223     /* Enable wakeup from stop mode */
00224     hi2c->Instance->CR1 |= I2C_CR1_WUPEN;
00225 
00226     __HAL_I2C_ENABLE(hi2c);
00227 
00228     hi2c->State = HAL_I2C_STATE_READY;
00229 
00230     /* Process Unlocked */
00231     __HAL_UNLOCK(hi2c);
00232 
00233     return HAL_OK;
00234   }
00235   else
00236   {
00237     return HAL_BUSY;
00238   }
00239 }
00240 
00241 
00242 /**
00243   * @brief  Disable I2C wakeup from stop mode.
00244   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
00245   *                the configuration information for the specified I2Cx peripheral.
00246   * @retval HAL status
00247   */
00248 HAL_StatusTypeDef HAL_I2CEx_DisableWakeUp (I2C_HandleTypeDef *hi2c)
00249 {
00250   /* Check the parameters */
00251   assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hi2c->Instance));
00252 
00253   if(hi2c->State == HAL_I2C_STATE_READY)
00254   {
00255     /* Process Locked */
00256     __HAL_LOCK(hi2c);
00257 
00258     hi2c->State = HAL_I2C_STATE_BUSY;
00259 
00260     /* Disable the selected I2C peripheral */
00261     __HAL_I2C_DISABLE(hi2c);
00262 
00263     /* Enable wakeup from stop mode */
00264     hi2c->Instance->CR1 &= ~(I2C_CR1_WUPEN);
00265 
00266     __HAL_I2C_ENABLE(hi2c); 
00267 
00268     hi2c->State = HAL_I2C_STATE_READY;
00269 
00270     /* Process Unlocked */
00271     __HAL_UNLOCK(hi2c);
00272 
00273     return HAL_OK;
00274   }
00275   else
00276   {
00277     return HAL_BUSY;
00278   }
00279 }
00280 
00281 /**
00282   * @brief Enable the I2C fast mode plus driving capability.
00283   * @param ConfigFastModePlus Selects the pin.
00284   *   This parameter can be one of the @ref I2CEx_FastModePlus values
00285   * @note  For I2C1, fast mode plus driving capability can be enabled on all selected
00286   *        I2C1 pins using I2C_FASTMODEPLUS_I2C1 parameter or independently
00287   *        on each one of the following pins PB6, PB7, PB8 and PB9.
00288   * @note  For remaining I2C1 pins (PA14, PA15...) fast mode plus driving capability
00289   *        can be enabled only by using I2C_FASTMODEPLUS_I2C1 parameter.
00290   * @note  For all I2C2 pins fast mode plus driving capability can be enabled
00291   *        only by using I2C_FASTMODEPLUS_I2C2 parameter.
00292   * @note  For all I2C3 pins fast mode plus driving capability can be enabled
00293   *        only by using I2C_FASTMODEPLUS_I2C3 parameter.
00294   * @retval None
00295   */
00296 void HAL_I2CEx_EnableFastModePlus(uint32_t ConfigFastModePlus)
00297 {
00298   /* Check the parameter */
00299   assert_param(IS_I2C_FASTMODEPLUS(ConfigFastModePlus));
00300 
00301   /* Enable SYSCFG clock */
00302   __HAL_RCC_SYSCFG_CLK_ENABLE();
00303 
00304   /* Enable fast mode plus driving capability for selected pin */
00305   SET_BIT(SYSCFG->CFGR1, (uint32_t)ConfigFastModePlus);
00306 }
00307 
00308 /**
00309   * @brief Disable the I2C fast mode plus driving capability.
00310   * @param ConfigFastModePlus Selects the pin.
00311   *   This parameter can be one of the @ref I2CEx_FastModePlus values
00312   * @note  For I2C1, fast mode plus driving capability can be disabled on all selected
00313   *        I2C1 pins using I2C_FASTMODEPLUS_I2C1 parameter or independently
00314   *        on each one of the following pins PB6, PB7, PB8 and PB9.
00315   * @note  For remaining I2C1 pins (PA14, PA15...) fast mode plus driving capability
00316   *        can be disabled only by using I2C_FASTMODEPLUS_I2C1 parameter.
00317   * @note  For all I2C2 pins fast mode plus driving capability can be disabled
00318   *        only by using I2C_FASTMODEPLUS_I2C2 parameter.
00319   * @note  For all I2C3 pins fast mode plus driving capability can be disabled
00320   *        only by using I2C_FASTMODEPLUS_I2C3 parameter.
00321   * @retval None
00322   */
00323 void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus)
00324 {
00325   /* Check the parameter */
00326   assert_param(IS_I2C_FASTMODEPLUS(ConfigFastModePlus));
00327 
00328   /* Enable SYSCFG clock */
00329   __HAL_RCC_SYSCFG_CLK_ENABLE();
00330 
00331   /* Disable fast mode plus driving capability for selected pin */
00332   CLEAR_BIT(SYSCFG->CFGR1, (uint32_t)ConfigFastModePlus);
00333 }
00334 
00335 /**
00336   * @}
00337   */
00338 
00339 /**
00340   * @}
00341   */
00342 
00343 #endif /* HAL_I2C_MODULE_ENABLED */
00344 /**
00345   * @}
00346   */
00347 
00348 /**
00349   * @}
00350   */
00351 
00352 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/