|
STM32G474xx HAL 用户手册
|
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->