STM32G474xx HAL 用户手册
stm32g4xx_hal_i2c_ex.c
转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_i2c_ex.c
00004   * @author  MCD Application Team
00005   * @brief   I2C 扩展 HAL 模块驱动程序。
00006   *          此文件提供固件函数,用于管理 I2C 扩展外设的以下功能:
00007   *           + 滤波器模式功能
00008   *           + 唤醒模式功能
00009   *           + 快速模式增强功能
00010   *
00011   ******************************************************************************
00012   * @attention
00013   *
00014   * Copyright (c) 2019 STMicroelectronics.
00015   * 保留所有权利。
00016   *
00017   * 本软件根据可在本软件组件根目录中找到的 LICENSE 文件中的条款进行许可。
00018   * 如果本软件未附带 LICENSE 文件,则按原样提供。
00019   *
00020   ******************************************************************************
00021   @verbatim
00022   ==============================================================================
00023                ##### I2C 外设扩展功能 #####
00024   ==============================================================================
00025 
00026   [..] 与之前的其他器件相比,STM32G4xx 器件的 I2C 接口包含以下附加功能
00027 
00028        (+) 可禁用或启用模拟噪声滤波器
00029        (+) 使用已配置的数字噪声滤波器
00030        (+) 禁用或启用从 Stop 模式唤醒
00031        (+) 禁用或启用快速模式增强
00032 
00033                      ##### 如何使用此驱动程序 #####
00034   ==============================================================================
00035   [..] 此驱动程序提供用于配置噪声滤波器和唤醒功能的函数
00036     (#) 使用函数 HAL_I2CEx_ConfigAnalogFilter() 配置 I2C 模拟噪声滤波器
00037     (#) 使用函数 HAL_I2CEx_ConfigDigitalFilter() 配置 I2C 数字噪声滤波器
00038     (#) 使用以下函数配置 I2C 唤醒模式的启用或禁用:
00039           (++) HAL_I2CEx_EnableWakeUp()
00040           (++) HAL_I2CEx_DisableWakeUp()
00041     (#) 使用以下函数配置快速模式增强驱动能力的启用或禁用:
00042           (++) HAL_I2CEx_EnableFastModePlus()
00043           (++) HAL_I2CEx_DisableFastModePlus()
00044   @endverbatim
00045   */
00046 
00047 /* Includes ------------------------------------------------------------------*/
00048 #include "stm32g4xx_hal.h"
00049 
00050 /** @addtogroup STM32G4xx_HAL_Driver
00051   * @{
00052   */
00053 
00054 /** @defgroup I2CEx I2CEx
00055   * @brief I2C 扩展 HAL 模块驱动程序
00056   * @{
00057   */
00058 
00059 #ifdef HAL_I2C_MODULE_ENABLED
00060 
00061 /* Private typedef -----------------------------------------------------------*/
00062 /* Private define ------------------------------------------------------------*/
00063 /* Private macro -------------------------------------------------------------*/
00064 /* Private variables ---------------------------------------------------------*/
00065 /* Private function prototypes -----------------------------------------------*/
00066 /* Private functions ---------------------------------------------------------*/
00067 
00068 /** @defgroup I2CEx_Exported_Functions I2C 扩展导出函数
00069   * @{
00070   */
00071 
00072 /** @defgroup I2CEx_Exported_Functions_Group1 滤波器模式函数
00073   * @brief    滤波器模式函数
00074   *
00075 @verbatim
00076  ===============================================================================
00077                       ##### 滤波器模式函数 #####
00078  ===============================================================================
00079     [..] 本节提供允许以下操作的函数:
00080       (+) 配置噪声滤波器
00081 
00082 @endverbatim
00083   * @{
00084   */
00085 
00086 /**
00087   * @brief  配置 I2C 模拟噪声滤波器。
00088   * @param  hi2c 指向包含指定 I2Cx 外设配置信息的 I2C_HandleTypeDef 结构的指针。
00089   * @param  AnalogFilter 模拟滤波器的新状态。
00090   * @retval HAL 状态
00091   */
00092 HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter)
00093 {
00094   /* 检查参数 */
00095   assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
00096   assert_param(IS_I2C_ANALOG_FILTER(AnalogFilter));
00097 
00098   if (hi2c->State == HAL_I2C_STATE_READY)
00099   {
00100     /* 进程已锁定 */
00101     __HAL_LOCK(hi2c);
00102 
00103     hi2c->State = HAL_I2C_STATE_BUSY;
00104 
00105     /* 禁用所选的 I2C 外设 */
00106     __HAL_I2C_DISABLE(hi2c);
00107 
00108     /* 复位 I2Cx ANOFF 位 */
00109     hi2c->Instance->CR1 &= ~(I2C_CR1_ANFOFF);
00110 
00111     /* 设置模拟滤波器位*/
00112     hi2c->Instance->CR1 |= AnalogFilter;
00113 
00114     __HAL_I2C_ENABLE(hi2c);
00115 
00116     hi2c->State = HAL_I2C_STATE_READY;
00117 
00118     /* 进程已解锁 */
00119     __HAL_UNLOCK(hi2c);
00120 
00121     return HAL_OK;
00122   }
00123   else
00124   {
00125     return HAL_BUSY;
00126   }
00127 }
00128 
00129 /**
00130   * @brief  配置 I2C 数字噪声滤波器。
00131   * @param  hi2c 指向包含指定 I2Cx 外设配置信息的 I2C_HandleTypeDef 结构的指针。
00132   * @param  DigitalFilter 数字噪声滤波器的系数,范围在 Min_Data=0x00 和 Max_Data=0x0F 之间。
00133   * @retval HAL 状态
00134   */
00135 HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter)
00136 {
00137   uint32_t tmpreg;
00138 
00139   /* 检查参数 */
00140   assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
00141   assert_param(IS_I2C_DIGITAL_FILTER(DigitalFilter));
00142 
00143   if (hi2c->State == HAL_I2C_STATE_READY)
00144   {
00145     /* 进程已锁定 */
00146     __HAL_LOCK(hi2c);
00147 
00148     hi2c->State = HAL_I2C_STATE_BUSY;
00149 
00150     /* 禁用所选的 I2C 外设 */
00151     __HAL_I2C_DISABLE(hi2c);
00152 
00153     /* 获取旧的寄存器值 */
00154     tmpreg = hi2c->Instance->CR1;
00155 
00156     /* 复位 I2Cx DNF 位 [11:8] */
00157     tmpreg &= ~(I2C_CR1_DNF);
00158 
00159     /* 设置 I2Cx DNF 系数 */
00160     tmpreg |= DigitalFilter << 8U;
00161 
00162     /* 存储新的寄存器值 */
00163     hi2c->