123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- /************************************************************************************************/
- /**
- * @file ciu32f003_std_i2c.h
- * @author MCU Ecosystem Development Team
- * @brief I2C STD库驱动头文件。
- * 提供I2C相关的STD库操作函数声明、数据类型以及常量的定义。
- *
- *
- **************************************************************************************************
- * @attention
- * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
- *
- **************************************************************************************************
- */
- /* 避免头文件重复引用 */
- #ifndef CIU32F003_STD_I2C_H
- #define CIU32F003_STD_I2C_H
- /************************************************************************************************/
- /**
- * @addtogroup CIU32F003_STD_Driver
- * @{
- */
- /**
- * @defgroup I2C I2C
- * @brief I2C接口的STD库驱动
- * @{
- */
- /************************************************************************************************/
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*------------------------------------includes--------------------------------------------------*/
- #include "ciu32f003_std_common.h"
- /*--------------------------------------------define--------------------------------------------*/
- /************************************************************************************************/
- /**
- * @defgroup I2C_Constants I2C Constants
- * @brief I2C常量定义及宏定义
- * @{
- *
- */
- /************************************************************************************************/
- /* 数字滤波器配置 */
- #define I2C_DIGITALFILTER_DISABLE I2C_CR1_DNF_DISABLE /**< 数字滤波器禁止 */
- #define I2C_DIGITALFILTER_1CLK I2C_CR1_DNF_1CLK /**< 滤除小于1个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_2CLK I2C_CR1_DNF_2CLK /**< 滤除小于2个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_3CLK I2C_CR1_DNF_3CLK /**< 滤除小于3个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_4CLK I2C_CR1_DNF_4CLK /**< 滤除小于4个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_5CLK I2C_CR1_DNF_5CLK /**< 滤除小于5个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_6CLK I2C_CR1_DNF_6CLK /**< 滤除小于6个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_7CLK I2C_CR1_DNF_7CLK /**< 滤除小于7个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_8CLK I2C_CR1_DNF_8CLK /**< 滤除小于8个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_9CLK I2C_CR1_DNF_9CLK /**< 滤除小于9个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_10CLK I2C_CR1_DNF_10CLK /**< 滤除小于10个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_11CLK I2C_CR1_DNF_11CLK /**< 滤除小于11个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_12CLK I2C_CR1_DNF_12CLK /**< 滤除小于12个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_13CLK I2C_CR1_DNF_13CLK /**< 滤除小于13个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_14CLK I2C_CR1_DNF_14CLK /**< 滤除小于14个I2C_KCLK的噪声 */
- #define I2C_DIGITALFILTER_15CLK I2C_CR1_DNF_15CLK /**< 滤除小于15个I2C_KCLK的噪声 */
- /* I2C 中断源配置 */
- #define I2C_INTERRUPT_ERR I2C_CR1_ERRIE /**< 错误中断 */
- #define I2C_INTERRUPT_BUF I2C_CR1_BUFIE /**< 缓冲器中断 */
- #define I2C_INTERRUPT_EVT I2C_CR1_EVTIE /**< 事件中断 */
- /* I2C 状态标志位 */
- #define I2C_FLAG_TXE I2C_ISR_TXE /**< 发送数据寄存器为空标志 */
- #define I2C_FLAG_TXIS I2C_ISR_TXIS /**< 发送中断状态标志 */
- #define I2C_FLAG_RXNE I2C_ISR_RXNE /**< 接收数据寄存器非空标志 */
- #define I2C_FLAG_ADDR I2C_ISR_ADDR /**< 地址匹配标志 */
- #define I2C_FLAG_NACK I2C_ISR_NACKF /**< 接收NACK标志 */
- #define I2C_FLAG_STOP I2C_ISR_STOPF /**< 停止位检测标志 */
- #define I2C_FLAG_BERR I2C_ISR_BERR /**< 总线错误标志 */
- #define I2C_FLAG_OVR I2C_ISR_OVR /**< 溢出标志 */
- #define I2C_FLAG_BUSY I2C_ISR_BUSY /**< 总线被占用标志 */
- #define I2C_FLAG_DIR I2C_ISR_DIR /**< 数据传输方向标志 */
- /* I2C 清除状态位 */
- #define I2C_CLEAR_ADDR I2C_ICR_ADDRCF /**< 清除地址匹配标志 */
- #define I2C_CLEAR_NACK I2C_ICR_NACKCF /**< 清除NACK标志 */
- #define I2C_CLEAR_STOP I2C_ICR_STOPCF /**< 清除停止位检测标志 */
- #define I2C_CLEAR_BERR I2C_ICR_BERRCF /**< 清除总线错误标志 */
- #define I2C_CLEAR_OVR I2C_ICR_OVRCF /**< 清除溢出标志 */
- /* I2C传输方向 */
- #define I2C_DIR_RX (0x00000000U) /**< I2C接收数据 */
- #define I2C_DIR_TX I2C_ISR_DIR /**< I2C发送数据 */
- /* I2C 数据传输方向配置 */
- #define I2C_REQUEST_WRITE (0x00000000U) /**< 写请求 */
- #define I2C_REQUEST_READ I2C_CR2_RD_WRN /**< 读请求 */
- /**
- * @}
- */
- /*-------------------------------------------functions------------------------------------------*/
- /************************************************************************************************/
- /**
- * @defgroup I2C_External_Functions I2C External Functions
- * @brief I2C对外函数
- * @{
- *
- */
- /************************************************************************************************/
- /**
- * @brief 使能I2C接口
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_enable(void)
- {
- I2C1->CR1 |= I2C_CR1_PE;
- }
- /**
- * @brief 禁止I2C接口
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_disable(void)
- {
- I2C1->CR1 &= (~I2C_CR1_PE);
- }
- /**
- * @brief 配置数字滤波器
- * @param digital_filter 数字滤波器配置参数
- * @arg I2C_DIGITALFILTER_DISABLE: 禁止数字滤波器
- * @arg I2C_DIGITALFILTER_1CLK: 滤波脉宽小于1 * I2C_KCLK
- * @arg I2C_DIGITALFILTER_2CLK: 滤波脉宽小于2 * I2C_KCLK
- * @arg ...
- * @arg I2C_DIGITALFILTER_15CLK: 滤波脉宽小于15 * I2C_KCLK
- * @note 滤波器配置只能在I2C禁止的状态下条件下有效
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_digital_filter_config(uint32_t digital_filter)
- {
- MODIFY_REG(I2C1->CR1, I2C_CR1_DNF, digital_filter);
- }
- /**
- * @brief I2C从模式时钟延长功能开启
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_clock_stretch_enable(void)
- {
- I2C1->CR1 &= (~I2C_CR1_NOSTRETCH);
- }
- /**
- * @brief I2C从模式时钟延长功能禁止
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_clock_stretch_disable(void)
- {
- I2C1->CR1 |= I2C_CR1_NOSTRETCH;
- }
- /**
- * @brief I2C广播地址应答使能
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_general_call_address_enable(void)
- {
- I2C1->CR1 |= I2C_CR1_GCEN;
- }
- /**
- * @brief I2C广播地址应答禁止
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_general_call_address_disable(void)
- {
- I2C1->CR1 &= (~I2C_CR1_GCEN);
- }
- /**
- * @brief 设置I2C从模式地址1
- * @param dev_address I2C设备地址1(该变量的范围在0x0~0x7F之间)
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_device_address1_config(uint32_t dev_address)
- {
- I2C1->ADDR1 = dev_address;
- }
- /**
- * @brief 使能I2C中断
- * @param interrupt 使能I2C中断源选择
- * @arg I2C_INTERRUPT_ERR: I2C错误中断
- * @arg I2C_INTERRUPT_BUF: I2C缓冲器中断
- * @arg I2C_INTERRUPT_EVT: I2C事件中断
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_interrupt_enable(uint32_t interrupt)
- {
- I2C1->CR1 |= interrupt;
- }
- /**
- * @brief 禁止I2C中断
- * @param interrupt I2C中断选择
- * @arg I2C_INTERRUPT_ERR: I2C错误中断
- * @arg I2C_INTERRUPT_BUF: I2C缓冲器中断
- * @arg I2C_INTERRUPT_EVT: I2C事件中断
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_interrupt_disable(uint32_t interrupt)
- {
- I2C1->CR1 &= (~interrupt);
- }
- /**
- * @brief 获取I2C中断使能状态
- * @param interrupt I2C中断选择
- * @arg I2C_INTERRUPT_ERR: I2C错误中断
- * @arg I2C_INTERRUPT_BUF: I2C缓冲器中断
- * @arg I2C_INTERRUPT_EVT: I2C事件中断
- * @retval uint32_t 返回选择的I2C中断使能状态
- * @arg 非0: 使能
- * @arg 0: 禁止
- */
- __STATIC_INLINE uint32_t std_i2c_get_interrupt_enable(uint32_t interrupt)
- {
- return (I2C1->CR1 & interrupt);
- }
- /**
- * @brief 获取I2C状态标志位或数据传输方向
- * @param flag I2C状态标志位选择
- * @arg I2C_FLAG_TXE: I2C发送数据寄存器为空
- * @arg I2C_FLAG_TXIS: I2C发送中断状态
- * @arg I2C_FLAG_RXNE: I2C接收数据寄存器非空
- * @arg ...
- * @arg I2C_FLAG_DIR: I2C数据传输方向标志
- * @retval uint32_t 返回选择的I2C状态标志位状态
- * @arg 非0: 标志位置位
- * @arg 0: 标志位清除
- */
- __STATIC_INLINE uint32_t std_i2c_get_flag(uint32_t flag)
- {
- return (I2C1->ISR & flag);
- }
- /**
- * @brief 清除I2C状态标志位
- * @param flag I2C状态标志位选择
- * @arg I2C_CLEAR_ADDR: 清除ADDR标志
- * @arg I2C_CLEAR_NACK: 清除NACKF标志
- * @arg I2C_CLEAR_STOP: 清除STOPF标志
- * @arg I2C_CLEAR_BERR: 清除BERR标志
- * @arg I2C_CLEAR_OVR: 清除OVR标志
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_clear_flag(uint32_t flag)
- {
- I2C1->ICR = flag;
- }
- /**
- * @brief 配置从模式下地址匹配或接收下个数据时返回NACK应答
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_set_next_data_nack(void)
- {
- I2C1->CR2 = I2C_CR2_NACK;
- }
- /**
- * @brief 读数据寄存器
- * @retval uint8_t 接收数据寄存器中的值(该值范围为0x00~0xFF)
- */
- __STATIC_INLINE uint8_t std_i2c_receive_byte(void)
- {
- return (uint8_t)(I2C1->RDR);
- }
- /**
- * @brief 写数据寄存器
- * @param send_data 写入I2C TDR寄存器中的值(该变量范围为0x00~0xFF)
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_transmit_byte(uint8_t send_data)
- {
- I2C1->TDR = send_data;
- }
- /**
- * @brief 清除发送数据寄存器
- * @retval 无
- */
- __STATIC_INLINE void std_i2c_clear_tx_data(void)
- {
- I2C1->ISR = I2C_ISR_TXE;
- }
- /* I2C去初始化函数 */
- void std_i2c_deinit(void);
- /**
- * @}
- */
- #ifdef __cplusplus
- }
- #endif
- /**
- * @}
- */
- /**
- * @}
- */
- #endif /* CIU32F003_STD_I2C_H */
|