ciu32f003_std_i2c(1).h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. /************************************************************************************************/
  2. /**
  3. * @file ciu32f003_std_i2c.h
  4. * @author MCU Ecosystem Development Team
  5. * @brief I2C STD库驱动头文件。
  6. * 提供I2C相关的STD库操作函数声明、数据类型以及常量的定义。
  7. *
  8. *
  9. **************************************************************************************************
  10. * @attention
  11. * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
  12. *
  13. **************************************************************************************************
  14. */
  15. /* 避免头文件重复引用 */
  16. #ifndef CIU32F003_STD_I2C_H
  17. #define CIU32F003_STD_I2C_H
  18. /************************************************************************************************/
  19. /**
  20. * @addtogroup CIU32F003_STD_Driver
  21. * @{
  22. */
  23. /**
  24. * @defgroup I2C I2C
  25. * @brief I2C接口的STD库驱动
  26. * @{
  27. */
  28. /************************************************************************************************/
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. /*------------------------------------includes--------------------------------------------------*/
  33. #include "ciu32f003_std_common.h"
  34. /*--------------------------------------------define--------------------------------------------*/
  35. /************************************************************************************************/
  36. /**
  37. * @defgroup I2C_Constants I2C Constants
  38. * @brief I2C常量定义及宏定义
  39. * @{
  40. *
  41. */
  42. /************************************************************************************************/
  43. /* 数字滤波器配置 */
  44. #define I2C_DIGITALFILTER_DISABLE I2C_CR1_DNF_DISABLE /**< 数字滤波器禁止 */
  45. #define I2C_DIGITALFILTER_1CLK I2C_CR1_DNF_1CLK /**< 滤除小于1个I2C_KCLK的噪声 */
  46. #define I2C_DIGITALFILTER_2CLK I2C_CR1_DNF_2CLK /**< 滤除小于2个I2C_KCLK的噪声 */
  47. #define I2C_DIGITALFILTER_3CLK I2C_CR1_DNF_3CLK /**< 滤除小于3个I2C_KCLK的噪声 */
  48. #define I2C_DIGITALFILTER_4CLK I2C_CR1_DNF_4CLK /**< 滤除小于4个I2C_KCLK的噪声 */
  49. #define I2C_DIGITALFILTER_5CLK I2C_CR1_DNF_5CLK /**< 滤除小于5个I2C_KCLK的噪声 */
  50. #define I2C_DIGITALFILTER_6CLK I2C_CR1_DNF_6CLK /**< 滤除小于6个I2C_KCLK的噪声 */
  51. #define I2C_DIGITALFILTER_7CLK I2C_CR1_DNF_7CLK /**< 滤除小于7个I2C_KCLK的噪声 */
  52. #define I2C_DIGITALFILTER_8CLK I2C_CR1_DNF_8CLK /**< 滤除小于8个I2C_KCLK的噪声 */
  53. #define I2C_DIGITALFILTER_9CLK I2C_CR1_DNF_9CLK /**< 滤除小于9个I2C_KCLK的噪声 */
  54. #define I2C_DIGITALFILTER_10CLK I2C_CR1_DNF_10CLK /**< 滤除小于10个I2C_KCLK的噪声 */
  55. #define I2C_DIGITALFILTER_11CLK I2C_CR1_DNF_11CLK /**< 滤除小于11个I2C_KCLK的噪声 */
  56. #define I2C_DIGITALFILTER_12CLK I2C_CR1_DNF_12CLK /**< 滤除小于12个I2C_KCLK的噪声 */
  57. #define I2C_DIGITALFILTER_13CLK I2C_CR1_DNF_13CLK /**< 滤除小于13个I2C_KCLK的噪声 */
  58. #define I2C_DIGITALFILTER_14CLK I2C_CR1_DNF_14CLK /**< 滤除小于14个I2C_KCLK的噪声 */
  59. #define I2C_DIGITALFILTER_15CLK I2C_CR1_DNF_15CLK /**< 滤除小于15个I2C_KCLK的噪声 */
  60. /* I2C 中断源配置 */
  61. #define I2C_INTERRUPT_ERR I2C_CR1_ERRIE /**< 错误中断 */
  62. #define I2C_INTERRUPT_BUF I2C_CR1_BUFIE /**< 缓冲器中断 */
  63. #define I2C_INTERRUPT_EVT I2C_CR1_EVTIE /**< 事件中断 */
  64. /* I2C 状态标志位 */
  65. #define I2C_FLAG_TXE I2C_ISR_TXE /**< 发送数据寄存器为空标志 */
  66. #define I2C_FLAG_TXIS I2C_ISR_TXIS /**< 发送中断状态标志 */
  67. #define I2C_FLAG_RXNE I2C_ISR_RXNE /**< 接收数据寄存器非空标志 */
  68. #define I2C_FLAG_ADDR I2C_ISR_ADDR /**< 地址匹配标志 */
  69. #define I2C_FLAG_NACK I2C_ISR_NACKF /**< 接收NACK标志 */
  70. #define I2C_FLAG_STOP I2C_ISR_STOPF /**< 停止位检测标志 */
  71. #define I2C_FLAG_BERR I2C_ISR_BERR /**< 总线错误标志 */
  72. #define I2C_FLAG_OVR I2C_ISR_OVR /**< 溢出标志 */
  73. #define I2C_FLAG_BUSY I2C_ISR_BUSY /**< 总线被占用标志 */
  74. #define I2C_FLAG_DIR I2C_ISR_DIR /**< 数据传输方向标志 */
  75. /* I2C 清除状态位 */
  76. #define I2C_CLEAR_ADDR I2C_ICR_ADDRCF /**< 清除地址匹配标志 */
  77. #define I2C_CLEAR_NACK I2C_ICR_NACKCF /**< 清除NACK标志 */
  78. #define I2C_CLEAR_STOP I2C_ICR_STOPCF /**< 清除停止位检测标志 */
  79. #define I2C_CLEAR_BERR I2C_ICR_BERRCF /**< 清除总线错误标志 */
  80. #define I2C_CLEAR_OVR I2C_ICR_OVRCF /**< 清除溢出标志 */
  81. /* I2C传输方向 */
  82. #define I2C_DIR_RX (0x00000000U) /**< I2C接收数据 */
  83. #define I2C_DIR_TX I2C_ISR_DIR /**< I2C发送数据 */
  84. /* I2C 数据传输方向配置 */
  85. #define I2C_REQUEST_WRITE (0x00000000U) /**< 写请求 */
  86. #define I2C_REQUEST_READ I2C_CR2_RD_WRN /**< 读请求 */
  87. /**
  88. * @}
  89. */
  90. /*-------------------------------------------functions------------------------------------------*/
  91. /************************************************************************************************/
  92. /**
  93. * @defgroup I2C_External_Functions I2C External Functions
  94. * @brief I2C对外函数
  95. * @{
  96. *
  97. */
  98. /************************************************************************************************/
  99. /**
  100. * @brief 使能I2C接口
  101. * @retval 无
  102. */
  103. __STATIC_INLINE void std_i2c_enable(void)
  104. {
  105. I2C1->CR1 |= I2C_CR1_PE;
  106. }
  107. /**
  108. * @brief 禁止I2C接口
  109. * @retval 无
  110. */
  111. __STATIC_INLINE void std_i2c_disable(void)
  112. {
  113. I2C1->CR1 &= (~I2C_CR1_PE);
  114. }
  115. /**
  116. * @brief 配置数字滤波器
  117. * @param digital_filter 数字滤波器配置参数
  118. * @arg I2C_DIGITALFILTER_DISABLE: 禁止数字滤波器
  119. * @arg I2C_DIGITALFILTER_1CLK: 滤波脉宽小于1 * I2C_KCLK
  120. * @arg I2C_DIGITALFILTER_2CLK: 滤波脉宽小于2 * I2C_KCLK
  121. * @arg ...
  122. * @arg I2C_DIGITALFILTER_15CLK: 滤波脉宽小于15 * I2C_KCLK
  123. * @note 滤波器配置只能在I2C禁止的状态下条件下有效
  124. * @retval 无
  125. */
  126. __STATIC_INLINE void std_i2c_digital_filter_config(uint32_t digital_filter)
  127. {
  128. MODIFY_REG(I2C1->CR1, I2C_CR1_DNF, digital_filter);
  129. }
  130. /**
  131. * @brief I2C从模式时钟延长功能开启
  132. * @retval 无
  133. */
  134. __STATIC_INLINE void std_i2c_clock_stretch_enable(void)
  135. {
  136. I2C1->CR1 &= (~I2C_CR1_NOSTRETCH);
  137. }
  138. /**
  139. * @brief I2C从模式时钟延长功能禁止
  140. * @retval 无
  141. */
  142. __STATIC_INLINE void std_i2c_clock_stretch_disable(void)
  143. {
  144. I2C1->CR1 |= I2C_CR1_NOSTRETCH;
  145. }
  146. /**
  147. * @brief I2C广播地址应答使能
  148. * @retval 无
  149. */
  150. __STATIC_INLINE void std_i2c_general_call_address_enable(void)
  151. {
  152. I2C1->CR1 |= I2C_CR1_GCEN;
  153. }
  154. /**
  155. * @brief I2C广播地址应答禁止
  156. * @retval 无
  157. */
  158. __STATIC_INLINE void std_i2c_general_call_address_disable(void)
  159. {
  160. I2C1->CR1 &= (~I2C_CR1_GCEN);
  161. }
  162. /**
  163. * @brief 设置I2C从模式地址1
  164. * @param dev_address I2C设备地址1(该变量的范围在0x0~0x7F之间)
  165. * @retval 无
  166. */
  167. __STATIC_INLINE void std_i2c_device_address1_config(uint32_t dev_address)
  168. {
  169. I2C1->ADDR1 = dev_address;
  170. }
  171. /**
  172. * @brief 使能I2C中断
  173. * @param interrupt 使能I2C中断源选择
  174. * @arg I2C_INTERRUPT_ERR: I2C错误中断
  175. * @arg I2C_INTERRUPT_BUF: I2C缓冲器中断
  176. * @arg I2C_INTERRUPT_EVT: I2C事件中断
  177. * @retval 无
  178. */
  179. __STATIC_INLINE void std_i2c_interrupt_enable(uint32_t interrupt)
  180. {
  181. I2C1->CR1 |= interrupt;
  182. }
  183. /**
  184. * @brief 禁止I2C中断
  185. * @param interrupt I2C中断选择
  186. * @arg I2C_INTERRUPT_ERR: I2C错误中断
  187. * @arg I2C_INTERRUPT_BUF: I2C缓冲器中断
  188. * @arg I2C_INTERRUPT_EVT: I2C事件中断
  189. * @retval 无
  190. */
  191. __STATIC_INLINE void std_i2c_interrupt_disable(uint32_t interrupt)
  192. {
  193. I2C1->CR1 &= (~interrupt);
  194. }
  195. /**
  196. * @brief 获取I2C中断使能状态
  197. * @param interrupt I2C中断选择
  198. * @arg I2C_INTERRUPT_ERR: I2C错误中断
  199. * @arg I2C_INTERRUPT_BUF: I2C缓冲器中断
  200. * @arg I2C_INTERRUPT_EVT: I2C事件中断
  201. * @retval uint32_t 返回选择的I2C中断使能状态
  202. * @arg 非0: 使能
  203. * @arg 0: 禁止
  204. */
  205. __STATIC_INLINE uint32_t std_i2c_get_interrupt_enable(uint32_t interrupt)
  206. {
  207. return (I2C1->CR1 & interrupt);
  208. }
  209. /**
  210. * @brief 获取I2C状态标志位或数据传输方向
  211. * @param flag I2C状态标志位选择
  212. * @arg I2C_FLAG_TXE: I2C发送数据寄存器为空
  213. * @arg I2C_FLAG_TXIS: I2C发送中断状态
  214. * @arg I2C_FLAG_RXNE: I2C接收数据寄存器非空
  215. * @arg ...
  216. * @arg I2C_FLAG_DIR: I2C数据传输方向标志
  217. * @retval uint32_t 返回选择的I2C状态标志位状态
  218. * @arg 非0: 标志位置位
  219. * @arg 0: 标志位清除
  220. */
  221. __STATIC_INLINE uint32_t std_i2c_get_flag(uint32_t flag)
  222. {
  223. return (I2C1->ISR & flag);
  224. }
  225. /**
  226. * @brief 清除I2C状态标志位
  227. * @param flag I2C状态标志位选择
  228. * @arg I2C_CLEAR_ADDR: 清除ADDR标志
  229. * @arg I2C_CLEAR_NACK: 清除NACKF标志
  230. * @arg I2C_CLEAR_STOP: 清除STOPF标志
  231. * @arg I2C_CLEAR_BERR: 清除BERR标志
  232. * @arg I2C_CLEAR_OVR: 清除OVR标志
  233. * @retval 无
  234. */
  235. __STATIC_INLINE void std_i2c_clear_flag(uint32_t flag)
  236. {
  237. I2C1->ICR = flag;
  238. }
  239. /**
  240. * @brief 配置从模式下地址匹配或接收下个数据时返回NACK应答
  241. * @retval 无
  242. */
  243. __STATIC_INLINE void std_i2c_set_next_data_nack(void)
  244. {
  245. I2C1->CR2 = I2C_CR2_NACK;
  246. }
  247. /**
  248. * @brief 读数据寄存器
  249. * @retval uint8_t 接收数据寄存器中的值(该值范围为0x00~0xFF)
  250. */
  251. __STATIC_INLINE uint8_t std_i2c_receive_byte(void)
  252. {
  253. return (uint8_t)(I2C1->RDR);
  254. }
  255. /**
  256. * @brief 写数据寄存器
  257. * @param send_data 写入I2C TDR寄存器中的值(该变量范围为0x00~0xFF)
  258. * @retval 无
  259. */
  260. __STATIC_INLINE void std_i2c_transmit_byte(uint8_t send_data)
  261. {
  262. I2C1->TDR = send_data;
  263. }
  264. /**
  265. * @brief 清除发送数据寄存器
  266. * @retval 无
  267. */
  268. __STATIC_INLINE void std_i2c_clear_tx_data(void)
  269. {
  270. I2C1->ISR = I2C_ISR_TXE;
  271. }
  272. /* I2C去初始化函数 */
  273. void std_i2c_deinit(void);
  274. /**
  275. * @}
  276. */
  277. #ifdef __cplusplus
  278. }
  279. #endif
  280. /**
  281. * @}
  282. */
  283. /**
  284. * @}
  285. */
  286. #endif /* CIU32F003_STD_I2C_H */