You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

316 lines
7.9 KiB

4 years ago
  1. /*********************************************************
  2. *Copyright (C), 2015, Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *: lib_iic.c
  4. * : AE Team
  5. * : V1.01
  6. * : 2021/06/09
  7. * : IIC模块库函数
  8. * :
  9. 使
  10. **********************************************************/
  11. #include "lib_iic.h"
  12. #include "system_ES8P5066.h"
  13. /*************************************
  14. IIC_Init
  15. IIC初始化
  16. I2C0/I2C1
  17. **************************************/
  18. void IIC_Init(I2C_TypeDef *IICx, IIC_InitStruType *IIC_InitStruct)
  19. {
  20. uint32_t tmp;
  21. if (IIC_InitStruct->IIC_Mode == IIC_Mode_Master)
  22. {
  23. if (IIC_InitStruct->IIC_16XSamp != Disable)
  24. tmp = SystemCoreClock / 24 / IIC_InitStruct->IIC_Clk - 1;
  25. else
  26. tmp = SystemCoreClock / 16 / IIC_InitStruct->IIC_Clk - 1;
  27. tmp = tmp > 255 ? 255 : tmp;
  28. IICx->CON.TJP = tmp;
  29. IICx->CON.TJE = 0x1;
  30. }
  31. IICx->CON.SDASE = IIC_InitStruct->IIC_16XSamp;
  32. IICx->CON.SCLSE = IIC_InitStruct->IIC_16XSamp;
  33. IICx->CON.SCLOD = IIC_InitStruct->IIC_SckOd;
  34. IICx->CON.SDAOD = IIC_InitStruct->IIC_SdaOd;
  35. IICx->MOD.MS = IIC_InitStruct->IIC_Mode;
  36. IICx->MOD.SPAE = IIC_InitStruct->IIC_AutoStop;
  37. IICx->MOD.SRAE = IIC_InitStruct->IIC_AutoCall;
  38. return;
  39. }
  40. /*************************************
  41. IIC_ITConfig
  42. 使
  43. I2C0/I2C1
  44. 使/
  45. **************************************/
  46. void IIC_ITConfig(I2C_TypeDef *IICx, IIC_TYPE_IT IIC_IT, TYPE_FUNCEN NewState)
  47. {
  48. if (NewState == Enable)
  49. IICx->IE.Word |= (uint32_t)IIC_IT;
  50. else
  51. IICx->IE.Word &= ~((uint32_t)IIC_IT);
  52. return;
  53. }
  54. /*************************************
  55. IIC_SendAddress
  56. I2C0/I2C1
  57. :/
  58. **************************************/
  59. void IIC_SendAddress(I2C_TypeDef *IICx, uint8_t IIC_Address, IIC_TYPE_RWMODE Mode)
  60. {
  61. IICx->CON.SA = IIC_Address >> 1;
  62. IICx->CON.RW = Mode;
  63. return;
  64. }
  65. /*************************************
  66. IIC_SetAddress
  67. I2C0/I2C1
  68. **************************************/
  69. void IIC_SetAddress(I2C_TypeDef *IICx, uint8_t IIC_Address)
  70. {
  71. IICx->CON.SA = IIC_Address >> 1;
  72. return;
  73. }
  74. /*************************************
  75. IIC_RecModeConfig
  76. I2C0/I2C1
  77. **************************************/
  78. void IIC_RecModeConfig(I2C_TypeDef *IICx, IIC_TYPE_RECMODE RecType)
  79. {
  80. IICx->MOD.RDM = RecType;
  81. return;
  82. }
  83. /*************************************
  84. IIC_TBIMConfig
  85. I2C0/I2C1
  86. **************************************/
  87. void IIC_TBIMConfig(I2C_TypeDef *IICx, IIC_TYPE_TRBIM Type)
  88. {
  89. IICx->IE.TBIM = Type;
  90. return;
  91. }
  92. /*************************************
  93. IIC_RBIMConfig
  94. I2C0/I2C1
  95. **************************************/
  96. void IIC_RBIMConfig(I2C_TypeDef *IICx, IIC_TYPE_TRBIM Type)
  97. {
  98. IICx->IE.RBIM = Type;
  99. return;
  100. }
  101. /*************************************
  102. IIC_AckDelay
  103. I2C0/I2C1
  104. 使/
  105. **************************************/
  106. void IIC_AckDelay(I2C_TypeDef *IICx, IIC_TYPE_ADLY Type, TYPE_FUNCEN NewStatus)
  107. {
  108. IICx->MOD.ADLY = Type;
  109. IICx->MOD.ADE = NewStatus;
  110. return;
  111. }
  112. /*************************************
  113. IIC_TISConfig
  114. I2C0/I2C1
  115. **************************************/
  116. void IIC_TISConfig(I2C_TypeDef *IICx, IIC_TYPE_TIS Time)
  117. {
  118. IICx->MOD.TIS = Time;
  119. return;
  120. }
  121. /*************************************
  122. IIC_SendByte
  123. I2C0/I2C1
  124. **************************************/
  125. void IIC_SendByte(I2C_TypeDef *IICx, uint8_t Byte)
  126. {
  127. IICx->TBW.Byte[0] = Byte;
  128. return;
  129. }
  130. /*************************************
  131. IIC_SendHalfWord
  132. I2C0/I2C1
  133. **************************************/
  134. void IIC_SendHalfWord(I2C_TypeDef *IICx, uint16_t HalfWord)
  135. {
  136. IICx->TBW.HalfWord[0] = HalfWord;
  137. return;
  138. }
  139. /*************************************
  140. IIC_SendWord
  141. I2C0/I2C1
  142. **************************************/
  143. void IIC_SendWord(I2C_TypeDef *IICx, uint32_t Word)
  144. {
  145. IICx->TBW.Word = Word;
  146. return;
  147. }
  148. /*************************************
  149. IIC_RecByte
  150. I2C0/I2C1
  151. **************************************/
  152. uint8_t IIC_RecByte(I2C_TypeDef *IICx)
  153. {
  154. return IICx->RBR.Byte[0];
  155. }
  156. /*************************************
  157. IIC_RecHalfWord
  158. I2C0/I2C1
  159. **************************************/
  160. uint16_t IIC_RecHalfWord(I2C_TypeDef *IICx)
  161. {
  162. return IICx->RBR.HalfWord[0];
  163. }
  164. /*************************************
  165. IIC_RecWord
  166. I2C0/I2C1
  167. **************************************/
  168. uint32_t IIC_RecWord(I2C_TypeDef *IICx)
  169. {
  170. return IICx->RBR.Word;
  171. }
  172. /*************************************
  173. IIC_GetRWMode
  174. IIC读写状态
  175. I2C0/I2C1
  176. **************************************/
  177. IIC_TYPE_RWMODE IIC_GetRWMode(I2C_TypeDef *IICx)
  178. {
  179. IIC_TYPE_RWMODE status;
  180. status = IICx->CON.RW == 0 ? IIC_Mode_Write : IIC_Mode_Read;
  181. return status;
  182. }
  183. /*************************************
  184. IIC_GetTBStatus
  185. TB0-TB3全空返回SETRESET
  186. I2C0
  187. SET/RESET
  188. **************************************/
  189. FlagStatus IIC_GetTBStatus(I2C_TypeDef *IICx)
  190. {
  191. FlagStatus status;
  192. if ((IICx->STA.Word & (uint32_t)0xf00) != (uint32_t)0xf00)
  193. status = RESET;
  194. else
  195. status = SET;
  196. return status;
  197. }
  198. /*************************************
  199. IIC_GetFlagStatus
  200. I2C0/I2C1
  201. SET/RESET
  202. **************************************/
  203. FlagStatus IIC_GetFlagStatus(I2C_TypeDef *IICx, IIC_TYPE_IF IIC_Flag)
  204. {
  205. FlagStatus status;
  206. if ((IICx->IF.Word & (uint32_t)IIC_Flag) != RESET)
  207. status = SET;
  208. else
  209. status = RESET;
  210. return status;
  211. }
  212. /*************************************
  213. IIC_GetITStatus
  214. 使
  215. I2C0/I2C1
  216. SET/RESET
  217. **************************************/
  218. FlagStatus IIC_GetITStatus(I2C_TypeDef *IICx, IIC_TYPE_IT IIC_Flag)
  219. {
  220. FlagStatus status = RESET;
  221. if ((IICx->IE.Word & (uint32_t)IIC_Flag) == RESET)
  222. return status;
  223. if ((IICx->IF.Word & (uint32_t)IIC_Flag) != RESET)
  224. status = SET;
  225. return status;
  226. }
  227. /*************************************
  228. IIC_GetITStatus
  229. I2C0/I2C1
  230. **************************************/
  231. void IIC_ClearITPendingBit(I2C_TypeDef *IICx, IIC_CLR_IF IIC_IT)
  232. {
  233. IICx->IF.Word = (uint32_t)IIC_IT;
  234. return;
  235. }