lib_iic.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /***************************************************************
  2. *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *文件名: lib_iic.h
  4. *作 者: Liut
  5. *版 本: V1.00
  6. *日 期: 2017/07/14
  7. *描 述: I2C模块库函数头文件
  8. *备 注: 适用于 ES8P508x芯片
  9. 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
  10. ***************************************************************/
  11. #ifndef __LIBIIC_H__
  12. #define __LIBIIC_H__
  13. #include "ES8P508x.h"
  14. #include "type.h"
  15. #include "system_ES8P508x.h"
  16. /* 引脚开漏设置 */
  17. typedef enum
  18. {
  19. I2C_PinMode_PP = 0x0 , //端口输出模式:推挽
  20. I2C_PinMode_OD = 0x1 , //端口输出模式:开漏
  21. }I2C_TYPE_PINOD;
  22. /* 工作模式 */
  23. typedef enum
  24. {
  25. I2C_Mode_Master = 0x0 , //工作模式:主
  26. I2C_Mode_Slave = 0x1 , //工作模式:从
  27. }I2C_TYPE_MODE;
  28. /* 应答延时 */
  29. typedef enum
  30. {
  31. I2C_AckDelay_0P5 = 0x0 , //应答延时:0.5个时钟周期
  32. I2C_AckDelay_1 = 0x1 , //应答延时:1个时钟周期
  33. I2C_AckDelay_1P5 = 0x2 , //应答延时:1.5个时钟周期
  34. I2C_AckDelay_2 = 0x3 , //应答延时:2个时钟周期
  35. I2C_AckDelay_2P5 = 0x4 , //应答延时:2.5个时钟周期
  36. I2C_AckDelay_3 = 0x5 , //应答延时:3个时钟周期
  37. I2C_AckDelay_3P5 = 0x6 , //应答延时:3.5个时钟周期
  38. I2C_AckDelay_4 = 0x7 , //应答延时:4个时钟周期
  39. }I2C_TYPE_ADLY;
  40. /* 接收模式 */
  41. typedef enum
  42. {
  43. I2C_RecMode_0 = 0x0 , //接收模式:接收1字节,发送ACK
  44. I2C_RecMode_1 = 0x1 , //接收模式:接收1字节,发送NACK
  45. I2C_RecMode_2 = 0x2 , //接收模式:接收2字节,每字节发送ACK
  46. I2C_RecMode_3 = 0x3 , //接收模式:接收2字节,前一字节发送ACK,后一字节发送NACK
  47. I2C_RecMode_4 = 0x4 , //接收模式:接收4字节,每字节发送ACK
  48. I2C_RecMode_5 = 0x5 , //接收模式:接收4字节,前3字节发送ACK,后一字节发送NACK
  49. I2C_RecMode_6 = 0x6, //接收模式:连续接收,每个字节发送ACK
  50. I2C_RecMode_7 = 0x7, //接收模式:完成该字节接收,发送NACK
  51. }I2C_TYPE_RECMODE;
  52. /* 数据帧传输间隔 */
  53. typedef enum
  54. {
  55. I2C_TI_Disable = 0x0 , //数据帧传输间隔:0
  56. I2C_TI_1 = 0x1 , //数据帧传输间隔:1
  57. I2C_TI_2 = 0x2 , //数据帧传输间隔:2
  58. I2C_TI_3 = 0x3 , //数据帧传输间隔:3
  59. I2C_TI_4 = 0x4 , //数据帧传输间隔:4
  60. I2C_TI_5 = 0x5 , //数据帧传输间隔:5
  61. I2C_TI_6 = 0x6 , //数据帧传输间隔:6
  62. I2C_TI_7 = 0x7 , //数据帧传输间隔:7
  63. I2C_TI_8 = 0x8 , //数据帧传输间隔:8
  64. I2C_TI_9 = 0x9 , //数据帧传输间隔:9
  65. I2C_TI_10 = 0xA , //数据帧传输间隔:10
  66. I2C_TI_11 = 0xB , //数据帧传输间隔:11
  67. I2C_TI_12 = 0xC , //数据帧传输间隔:12
  68. I2C_TI_13 = 0xD , //数据帧传输间隔:13
  69. I2C_TI_14 = 0xE , //数据帧传输间隔:14
  70. I2C_TI_15 = 0xF , //数据帧传输间隔:15
  71. }I2C_TYPE_TIS;
  72. /* I2C初始化配置结构体定义 */
  73. typedef struct
  74. {
  75. I2C_TYPE_PINOD I2C_SclOd; //SCL端口输出模式
  76. I2C_TYPE_PINOD I2C_SdaOd; //SDA端口输出模式
  77. TYPE_FUNCEN I2C_16XSamp; //端口16倍速采样使能
  78. uint32_t I2C_Clk; //I2C频率
  79. I2C_TYPE_MODE I2C_Mode; //工作模式
  80. TYPE_FUNCEN I2C_AutoStop; //自动停止
  81. TYPE_FUNCEN I2C_AutoCall; //自动寻呼
  82. }I2C_InitStruType;
  83. /* 发送、接收中断模式 */
  84. typedef enum
  85. {
  86. I2C_TRBIM_Byte = 0x0 , //字节满产生中断
  87. I2C_TRBIM_HalfWord = 0x1 , //半字满产生中断
  88. I2C_TRBIM_Word = 0x2 , //字满产生中断
  89. }I2C_TYPE_TRBIM;
  90. /* 读写模式 */
  91. typedef enum
  92. {
  93. I2C_Mode_Write = 0x0 ,
  94. I2C_Mode_Read = 0x1 ,
  95. }I2C_TYPE_RWMODE;
  96. /* 中断使能标志位 */
  97. typedef enum
  98. {
  99. I2C_IT_SR = 0x0001 , //起始位
  100. I2C_IT_SP = 0x0002 , //停止位
  101. I2C_IT_TB = 0x0004 , //发送缓冲空
  102. I2C_IT_RB = 0x0008 , //接收缓冲满
  103. I2C_IT_TE = 0x0010 , //发送数据错误
  104. I2C_IT_RO = 0x0020 , //接收数据溢出
  105. I2C_IT_NA = 0x0040 , //未应答NACK
  106. I2C_IT_TBWE = 0x0080 , //发送数据写错误
  107. I2C_IT_TIDLE = 0x01000 , //发送空闲中断
  108. }I2C_TYPE_IT;
  109. /* 中断标志位 */
  110. typedef enum
  111. {
  112. I2C_Flag_SR = 0x0001 , //起始位
  113. I2C_Flag_SP = 0x0002 , //停止位
  114. I2C_Flag_TB = 0x0004 , //发送缓冲空
  115. I2C_Flag_RB = 0x0008 , //接收缓冲满
  116. I2C_Flag_TE = 0x0010 , //发送数据错误
  117. I2C_Flag_RO = 0x0020 , //接收数据溢出
  118. I2C_Flag_NA = 0x0040 , //未应答NACK
  119. I2C_Flag_TBWE = 0x0080, //发送数据写错误中断标志位
  120. I2C_Flag_TIDLE= 0X1000, //I2C 发送空闲中断标志位
  121. }I2C_TYPE_FLAG;
  122. /* 标志清除 */
  123. typedef enum
  124. {
  125. I2C_Clr_SR = 0x0001 , //起始位
  126. I2C_Clr_SP = 0x0002 , //停止位
  127. I2C_Clr_TE = 0x0010 , //发送数据错误
  128. I2C_Clr_RO = 0x0020 , //接收数据溢出
  129. I2C_Clr_NA = 0x0040 , //未应答NACK
  130. I2C_Clr_TBWE = 0x0080 , //发送数据写错误
  131. I2C_Clr_TIDLE= 0X01000, //I2C 发送空闲
  132. }I2C_CLR_IF;
  133. /*************I2C模块宏定义************/
  134. /* I2C模块使能控制 */
  135. #define I2C_Enable() (I2C0->CON.EN = 1)
  136. #define I2C_Disable() (I2C0->CON.EN = 0)
  137. /* I2C模块复位 */
  138. #define I2C_Reset() (I2C0->CON.RST = 1)
  139. /* I2C时基使能控制 */
  140. #define I2C_TJEnable() (I2C0->CON.TJE = 1)
  141. #define I2C_TJDisable() (I2C0->CON.TJE = 0)
  142. /* I2C主控模式读写控制 */
  143. #define I2C_Read() (I2C0->CON.RW = 1)
  144. #define I2C_Write() (I2C0->CON.RW = 0)
  145. /* I2C时钟自动下拉等待使能控制(仅从机模式支持) */
  146. #define I2C_CSEnable() (I2C0->MOD.CSE = 1)
  147. #define I2C_CSDisable() (I2C0->MOD.CSE = 0)
  148. /* I2C自动发送未应答使能控制(仅从机模式支持) */
  149. #define I2C_ANAEnable() (I2C0->MOD.ANAE = 1)
  150. #define I2C_ANADisable() (I2C0->MOD.ANAE = 0)
  151. /* I2C自动寻呼使能控制(仅主机模式支持) */
  152. #define I2C_SRAEnable() (I2C0->MOD.SRAE = 1)
  153. #define I2C_SRADisable() (I2C0->MOD.SRAE = 0)
  154. /* I2C自动结束使能控制(仅主机模式支持) */
  155. #define I2C_SPAEnable() (I2C0->MOD.SPAE = 1)
  156. #define I2C_SPADisable() (I2C0->MOD.SPAE = 0)
  157. /* I2C起始位触发(仅主机模式支持) */
  158. #define I2C_SRTrigger() (I2C0->MOD.SRT=1)
  159. /* I2C停止位触发(仅主机模式支持) */
  160. #define I2C_SPTrigger() (I2C0->MOD.SPT = 1)
  161. /* I2C接收数据触发(仅主机模式支持) */
  162. #define I2C_RDTrigger() (I2C0->MOD.RDT = 1)
  163. /* I2C总线释放 */
  164. #define I2C_Release() (I2C0->MOD.BLD = 1)
  165. /* I2C发送应答设置(仅从机模式支持) */
  166. #define I2C_TACK() (I2C0->MOD.TAS = 1)
  167. #define I2C_TNACK() (I2C0->MOD.TAS = 0)
  168. /************I2C模块函数声明***********/
  169. void I2C_Init(I2C_InitStruType* I2C_InitStruct);
  170. void I2C_ITConfig(I2C_TYPE_IT I2C_IT,TYPE_FUNCEN NewState);
  171. void I2C_SendAddress(uint8_t I2C_Address,I2C_TYPE_RWMODE Mode);
  172. void I2C_SetAddress(uint8_t I2C_Address);
  173. void I2C_RecModeConfig(I2C_TYPE_RECMODE RecType);
  174. void I2C_TBIMConfig(I2C_TYPE_TRBIM Type);
  175. void I2C_RBIMConfig(I2C_TYPE_TRBIM Type);
  176. void I2C_AckDelay(I2C_TYPE_ADLY Type,TYPE_FUNCEN NewStatus);
  177. void I2C_TISConfig(I2C_TYPE_TIS Time);
  178. void I2C_SendByte(uint8_t Byte);
  179. void I2C_SendHalfWord(uint16_t HalfWord);
  180. void I2C_SendWord(uint32_t Word);
  181. uint8_t I2C_RecByte(void);
  182. uint16_t I2C_RecHalfWord(void);
  183. uint32_t I2C_RecWord(void);
  184. I2C_TYPE_RWMODE I2C_GetRWMode(void);
  185. FlagStatus I2C_GetTBStatus(void);
  186. FlagStatus I2C_GetFlagStatus(I2C_TYPE_FLAG I2C_Flag);
  187. FlagStatus I2C_GetITStatus( I2C_TYPE_IT I2C_Flag);
  188. void I2C_ClearITPendingBit(I2C_CLR_IF I2C_IT);
  189. #endif
  190. /*************************END OF FILE**********************/