hc32f460_i2c.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. /*******************************************************************************
  2. * Copyright (C) 2020, Huada Semiconductor Co., Ltd. All rights reserved.
  3. *
  4. * This software component is licensed by HDSC under BSD 3-Clause license
  5. * (the "License"); You may not use this file except in compliance with the
  6. * License. You may obtain a copy of the License at:
  7. * opensource.org/licenses/BSD-3-Clause
  8. */
  9. /******************************************************************************/
  10. /** \file hc32f460_i2c.h
  11. **
  12. ** A detailed description is available at
  13. ** @link I2cGroup Inter-Integrated Circuit(I2C) description @endlink
  14. **
  15. ** - 2018-10-16 CDT First version for Device Driver Library of I2C.
  16. **
  17. ******************************************************************************/
  18. #ifndef __HC32F460_I2C_H__
  19. #define __HC32F460_I2C_H__
  20. /*******************************************************************************
  21. * Include files
  22. ******************************************************************************/
  23. #include "hc32_common.h"
  24. #include "ddl_config.h"
  25. #if (DDL_I2C_ENABLE == DDL_ON)
  26. /* C binding of definitions if building with C++ compiler */
  27. #ifdef __cplusplus
  28. extern "C"
  29. {
  30. #endif
  31. /**
  32. *******************************************************************************
  33. ** \defgroup I2cGroup Inter-Integrated Circuit (I2C)
  34. **
  35. ******************************************************************************/
  36. //@{
  37. /*******************************************************************************
  38. * Global type definitions ('typedef')
  39. ******************************************************************************/
  40. /**
  41. *******************************************************************************
  42. ** \brief I2c configuration structure
  43. **
  44. ******************************************************************************/
  45. typedef struct stc_i2c_init
  46. {
  47. uint32_t u32ClockDiv; ///< I2C clock division for i2c source clock
  48. uint32_t u32Baudrate; ///< I2C baudrate config
  49. uint32_t u32SclTime; ///< The SCL rising and falling time, count of T(i2c source clock after frequency divider)
  50. }stc_i2c_init_t;
  51. /**
  52. *******************************************************************************
  53. ** \brief I2c SMBUS configuration structure
  54. **
  55. ******************************************************************************/
  56. typedef struct stc_i2c_smbus_init
  57. {
  58. en_functional_state_t enHostAdrMatchFunc; ///< SMBUS host address matching function
  59. en_functional_state_t enDefaultAdrMatchFunc; ///< SMBUS default address matching function
  60. en_functional_state_t enAlarmAdrMatchFunc; ///< SMBUS Alarm address matching function
  61. }stc_i2c_smbus_init_t;
  62. /**
  63. *******************************************************************************
  64. ** \brief I2c digital filter mode enumeration
  65. **
  66. ******************************************************************************/
  67. typedef enum en_i2c_digital_filter_mode
  68. {
  69. Filter1BaseCycle = 0u, ///< I2C digital filter ability 1 base cycle
  70. Filter2BaseCycle = 1u, ///< I2C digital filter ability 2 base cycle
  71. Filter3BaseCycle = 2u, ///< I2C digital filter ability 3 base cycle
  72. Filter4BaseCycle = 3u, ///< I2C digital filter ability 4 base cycle
  73. }en_i2c_digital_filter_mode_t;
  74. /**
  75. *******************************************************************************
  76. ** \brief I2c address bit enumeration
  77. **
  78. ******************************************************************************/
  79. typedef enum en_address_bit
  80. {
  81. Adr7bit = 0u, ///< I2C address length is 7 bits
  82. Adr10bit = 1u, ///< I2C address length is 10 bits
  83. }en_address_bit_t;
  84. /**
  85. *******************************************************************************
  86. ** \brief I2c transfer direction enumeration
  87. **
  88. ******************************************************************************/
  89. typedef enum en_trans_direction
  90. {
  91. I2CDirTrans = 0u,
  92. I2CDirReceive = 1u,
  93. }en_trans_direction_t;
  94. /**
  95. *******************************************************************************
  96. ** \brief I2c clock timeout switch enumeration
  97. **
  98. ******************************************************************************/
  99. typedef enum en_clock_timeout_switch
  100. {
  101. TimeoutFunOff = 0u, ///< I2C SCL pin time out function off
  102. LowTimerOutOn = 3u, ///< I2C SCL pin high level time out function on
  103. HighTimeOutOn = 5u, ///< I2C SCL pin low level time out function on
  104. BothTimeOutOn = 7u, ///< I2C SCL pin both(low and high) level time out function on
  105. }en_clock_timeout_switch_t;
  106. /**
  107. *******************************************************************************
  108. ** \brief I2c clock timeout initialize structure
  109. **
  110. ******************************************************************************/
  111. typedef struct stc_clock_timeout_init
  112. {
  113. en_clock_timeout_switch_t enClkTimeOutSwitch; ///< I2C clock timeout function switch
  114. uint16_t u16TimeOutHigh; ///< I2C clock timeout period for High level
  115. uint16_t u16TimeOutLow; ///< I2C clock timeout period for Low level
  116. }stc_clock_timeout_init_t;
  117. /**
  118. *******************************************************************************
  119. ** \brief I2c ACK config enumeration
  120. **
  121. ******************************************************************************/
  122. typedef enum en_i2c_ack_config
  123. {
  124. I2c_ACK = 0u,
  125. I2c_NACK = 1u,
  126. }en_i2c_ack_config_t;
  127. /*******************************************************************************
  128. * Global pre-processor symbols/macros ('#define')
  129. ******************************************************************************/
  130. /* define interrupt enable bit for I2C_CR2 register */
  131. #define I2C_CR2_STARTIE (0x00000001ul)
  132. #define I2C_CR2_SLADDR0EN (0x00000002ul)
  133. #define I2C_CR2_SLADDR1EN (0x00000004ul)
  134. #define I2C_CR2_TENDIE (0x00000008ul)
  135. #define I2C_CR2_STOPIE (0x00000010ul)
  136. #define I2C_CR2_RFULLIE (0x00000040ul)
  137. #define I2C_CR2_TEMPTYIE (0x00000080ul)
  138. #define I2C_CR2_ARLOIE (0x00000200ul)
  139. #define I2C_CR2_NACKIE (0x00001000ul)
  140. #define I2C_CR2_TMOURIE (0x00004000ul)
  141. #define I2C_CR2_GENCALLIE (0x00100000ul)
  142. #define I2C_CR2_SMBDEFAULTIE (0x00200000ul)
  143. #define I2C_CR2_SMBHOSTIE (0x00400000ul)
  144. #define I2C_CR2_SMBALRTIE (0x00800000ul)
  145. /* define status bit for I2C_SR register */
  146. #define I2C_SR_STARTF (0x00000001ul)
  147. #define I2C_SR_SLADDR0F (0x00000002ul)
  148. #define I2C_SR_SLADDR1F (0x00000004ul)
  149. #define I2C_SR_TENDF (0x00000008ul)
  150. #define I2C_SR_STOPF (0x00000010ul)
  151. #define I2C_SR_RFULLF (0x00000040ul)
  152. #define I2C_SR_TEMPTYF (0x00000080ul)
  153. #define I2C_SR_ARLOF (0x00000200ul)
  154. #define I2C_SR_ACKRF (0x00000400ul)
  155. #define I2C_SR_NACKF (0x00001000ul)
  156. #define I2C_SR_TMOUTF (0x00004000ul)
  157. #define I2C_SR_MSL (0x00010000ul)
  158. #define I2C_SR_BUSY (0x00020000ul)
  159. #define I2C_SR_TRA (0x00040000ul)
  160. #define I2C_SR_GENCALLF (0x00100000ul)
  161. #define I2C_SR_SMBDEFAULTF (0x00200000ul)
  162. #define I2C_SR_SMBHOSTF (0x00400000ul)
  163. #define I2C_SR_SMBALRTF (0x00800000ul)
  164. /* define status clear bit for I2C_CLR register*/
  165. #define I2C_CLR_STARTFCLR (0x00000001ul)
  166. #define I2C_CLR_SLADDR0FCLR (0x00000002ul)
  167. #define I2C_CLR_SLADDR1FCLR (0x00000004ul)
  168. #define I2C_CLR_TENDFCLR (0x00000008ul)
  169. #define I2C_CLR_STOPFCLR (0x00000010ul)
  170. #define I2C_CLR_RFULLFCLR (0x00000040ul)
  171. #define I2C_CLR_TEMPTYFCLR (0x00000080ul)
  172. #define I2C_CLR_ARLOFCLR (0x00000200ul)
  173. #define I2C_CLR_NACKFCLR (0x00001000ul)
  174. #define I2C_CLR_TMOUTFCLR (0x00004000ul)
  175. #define I2C_CLR_GENCALLFCLR (0x00100000ul)
  176. #define I2C_CLR_SMBDEFAULTFCLR (0x00200000ul)
  177. #define I2C_CLR_SMBHOSTFCLR (0x00400000ul)
  178. #define I2C_CLR_SMBALRTFCLR (0x00800000ul)
  179. #define I2C_CLR_MASK (0x00F056DFul)
  180. /* I2C_Clock_Division I2C clock division */
  181. #define I2C_CLK_DIV1 (0ul) /* I2c source clock/1 */
  182. #define I2C_CLK_DIV2 (1ul) /* I2c source clock/2 */
  183. #define I2C_CLK_DIV4 (2ul) /* I2c source clock/4 */
  184. #define I2C_CLK_DIV8 (3ul) /* I2c source clock/8 */
  185. #define I2C_CLK_DIV16 (4ul) /* I2c source clock/16 */
  186. #define I2C_CLK_DIV32 (5ul) /* I2c source clock/32 */
  187. #define I2C_CLK_DIV64 (6ul) /* I2c source clock/64 */
  188. #define I2C_CLK_DIV128 (7ul) /* I2c source clock/128 */
  189. /**
  190. * @}
  191. */
  192. /*******************************************************************************
  193. * Global variable definitions ('extern')
  194. ******************************************************************************/
  195. /*******************************************************************************
  196. Global function prototypes (definition in C source)
  197. ******************************************************************************/
  198. en_result_t I2C_BaudrateConfig(M4_I2C_TypeDef* pstcI2Cx, const stc_i2c_init_t* pstcI2cInit, float32_t *pf32Error);
  199. en_result_t I2C_DeInit(M4_I2C_TypeDef* pstcI2Cx);
  200. en_result_t I2C_Init(M4_I2C_TypeDef* pstcI2Cx, const stc_i2c_init_t* pstcI2cInit, float32_t *pf32Error);
  201. void I2C_Cmd(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState);
  202. en_result_t I2C_SmbusConfig(M4_I2C_TypeDef* pstcI2Cx, const stc_i2c_smbus_init_t* pstcI2C_SmbusInitStruct);
  203. void I2C_SmBusCmd(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState);
  204. void I2C_SoftwareResetCmd(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState);
  205. ////////////////////////////////////////////////////////////////////////////////////////
  206. void I2C_DigitalFilterConfig(M4_I2C_TypeDef* pstcI2Cx, en_i2c_digital_filter_mode_t enDigiFilterMode);
  207. void I2C_DigitalFilterCmd(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState);
  208. void I2C_AnalogFilterCmd(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState);
  209. void I2C_GeneralCallCmd(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState);
  210. void I2C_SlaveAdr0Config(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState, en_address_bit_t enAdrMode, uint32_t u32Adr);
  211. void I2C_SlaveAdr1Config(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState, en_address_bit_t enAdrMode, uint32_t u32Adr);
  212. en_result_t I2C_ClkTimeOutConfig(M4_I2C_TypeDef* pstcI2Cx, const stc_clock_timeout_init_t* pstcTimoutInit);
  213. void I2C_IntCmd(M4_I2C_TypeDef* pstcI2Cx, uint32_t u32IntEn, en_functional_state_t enNewState);
  214. void I2C_FastAckCmd(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState);
  215. void I2C_BusWaitCmd(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState);
  216. ///////////////////////////////////////////////////////////////////////////////////////
  217. void I2C_GenerateStart(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState);
  218. void I2C_GenerateReStart(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState);
  219. void I2C_GenerateStop(M4_I2C_TypeDef* pstcI2Cx, en_functional_state_t enNewState);
  220. void I2C_WriteData(M4_I2C_TypeDef* pstcI2Cx, uint8_t u8Data);
  221. uint8_t I2C_ReadData(M4_I2C_TypeDef* pstcI2Cx);
  222. void I2C_AckConfig(M4_I2C_TypeDef* pstcI2Cx, en_i2c_ack_config_t u32AckConfig);
  223. en_flag_status_t I2C_GetStatus(M4_I2C_TypeDef* pstcI2Cx, uint32_t u32StatusBit);
  224. void I2C_ClearStatus(M4_I2C_TypeDef* pstcI2Cx, uint32_t u32StatusBit);
  225. /* High level functions for reference ********************************/
  226. en_result_t I2C_Start(M4_I2C_TypeDef* pstcI2Cx, uint32_t u32Timeout);
  227. en_result_t I2C_Restart(M4_I2C_TypeDef* pstcI2Cx, uint32_t u32Timeout);
  228. en_result_t I2C_TransAddr(M4_I2C_TypeDef* pstcI2Cx, uint8_t u8Addr, en_trans_direction_t enDir, uint32_t u32Timeout);
  229. en_result_t I2C_Trans10BitAddr(M4_I2C_TypeDef* pstcI2Cx, uint16_t u16Addr, en_trans_direction_t enDir, uint32_t u32Timeout);
  230. en_result_t I2C_TransData(M4_I2C_TypeDef* pstcI2Cx, uint8_t const au8TxData[], uint32_t u32Size, uint32_t u32Timeout);
  231. en_result_t I2C_ReceiveData(M4_I2C_TypeDef* pstcI2Cx, uint8_t au8RxData[], uint32_t u32Size, uint32_t u32Timeout);
  232. en_result_t I2C_Stop(M4_I2C_TypeDef* pstcI2Cx, uint32_t u32Timeout);
  233. en_result_t I2C_WaitStatus(const M4_I2C_TypeDef *pstcI2Cx, uint32_t u32Flag, en_flag_status_t enStatus, uint32_t u32Timeout);
  234. en_result_t I2C_MasterDataReceiveAndStop(M4_I2C_TypeDef* pstcI2Cx, uint8_t au8RxData[], uint32_t u32Size, uint32_t u32Timeout);
  235. //@} // I2cGroup
  236. #ifdef __cplusplus
  237. }
  238. #endif
  239. #endif /* DDL_I2C_ENABLE */
  240. #endif /* __HC32F460_I2C_H__ */
  241. /*******************************************************************************
  242. * EOF (not truncated)
  243. ******************************************************************************/