lib_iic.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. /***************************************************************
  2. *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
  3. *文件名: lib_iic.c
  4. *作 者: Liut
  5. *版 本: V1.00
  6. *日 期: 2017/07/14
  7. *描 述: IIC模块库函数
  8. *备 注: 适用于 ES8P508x芯片
  9. 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
  10. ***************************************************************/
  11. #include "lib_iic.h"
  12. /***************************************************************
  13. 函数名:I2C_Init
  14. 描 述:I2C初始化
  15. 输入值:I2C_InitStruct:初始化配置结构体地址
  16. 输出值:无
  17. 返回值:无
  18. ***************************************************************/
  19. void I2C_Init(I2C_InitStruType* I2C_InitStruct)
  20. {
  21. uint32_t temp;
  22. if(I2C_InitStruct->I2C_Mode == I2C_Mode_Master)
  23. {
  24. if(I2C_InitStruct->I2C_16XSamp != DISABLE)
  25. temp = SystemCoreClock/24/I2C_InitStruct->I2C_Clk - 1;
  26. else
  27. temp = SystemCoreClock/16/I2C_InitStruct->I2C_Clk - 1;
  28. if(temp > 254)
  29. temp = 255;
  30. I2C0->CON.TJP = temp; //设置时基定时器周期
  31. I2C0->CON.TJE = 0x1; //使能时基定时器
  32. }
  33. I2C0->CON.SDASE = I2C_InitStruct->I2C_16XSamp; //16倍采样设置
  34. I2C0->CON.SCKSE = I2C_InitStruct->I2C_16XSamp;
  35. I2C0->CON.SCKOD = I2C_InitStruct->I2C_SclOd; //端口开漏设置
  36. I2C0->CON.SDAOD = I2C_InitStruct->I2C_SdaOd;
  37. I2C0->MOD.MS = I2C_InitStruct->I2C_Mode; //主从模式设置
  38. I2C0->MOD.SPAE = I2C_InitStruct->I2C_AutoStop; //自动停止设置
  39. I2C0->MOD.SRAE = I2C_InitStruct->I2C_AutoCall; //自动寻呼设置
  40. }
  41. /***************************************************************
  42. 函数名:I2C_ITConfig
  43. 描 述:I2C中断配置
  44. 输入值:I2C_IT:需要配置的中断 、 NewState:使能或关闭
  45. 输出值:无
  46. 返回值:无
  47. ***************************************************************/
  48. void I2C_ITConfig(I2C_TYPE_IT I2C_IT,TYPE_FUNCEN NewState)
  49. {
  50. if (NewState != DISABLE)
  51. I2C0->IE.Word |= (uint32_t)I2C_IT;
  52. else
  53. I2C0->IE.Word &= ~((uint32_t)I2C_IT);
  54. }
  55. /***************************************************************
  56. 函数名:I2C_SendAddress
  57. 描 述:I2C发送从机地址
  58. 输入值:I2C_Address:7位从机地址,左对齐 0x00~0xfe 、 Mode:读或写
  59. 输出值:无
  60. 返回值:无
  61. ***************************************************************/
  62. void I2C_SendAddress(uint8_t I2C_Address,I2C_TYPE_RWMODE Mode)
  63. {
  64. I2C0->CON.SA = I2C_Address>>1;
  65. I2C0->CON.RW = Mode;
  66. }
  67. /***************************************************************
  68. 函数名:I2C_SetAddress
  69. 描 述:I2C设置地址(适用于从机模式)
  70. 输入值:I2C_Address:7位从机地址,左对齐 0x00~0xfe
  71. 输出值:无
  72. 返回值:无
  73. ***************************************************************/
  74. void I2C_SetAddress(uint8_t I2C_Address)
  75. {
  76. I2C0->CON.SA = I2C_Address>>1;
  77. }
  78. /***************************************************************
  79. 函数名:I2C_RecModeConfig
  80. 描 述:I2C配置接收模式
  81. 输入值:RecType:接收模式
  82. 输出值:无
  83. 返回值:无
  84. ***************************************************************/
  85. void I2C_RecModeConfig(I2C_TYPE_RECMODE RecType)
  86. {
  87. I2C0->MOD.RDM = RecType;
  88. }
  89. /***************************************************************
  90. 函数名:I2C_TBIMConfig
  91. 描 述:I2C发送缓冲器空中断模式选择
  92. 输入值:Type:空中断模式
  93. 输出值:无
  94. 返回值:无
  95. ***************************************************************/
  96. void I2C_TBIMConfig(I2C_TYPE_TRBIM Type)
  97. {
  98. I2C0->IE.TBIM = Type;
  99. }
  100. /***************************************************************
  101. 函数名:I2C_RBIMConfig
  102. 描 述:I2C接收缓冲器满中断模式选择
  103. 输入值:Type:满中断模式
  104. 输出值:无
  105. 返回值:无
  106. ***************************************************************/
  107. void I2C_RBIMConfig(I2C_TYPE_TRBIM Type)
  108. {
  109. I2C0->IE.RBIM = Type;
  110. }
  111. /***************************************************************
  112. 函数名:I2C_AckDelay
  113. 描 述:I2C应答延时配置
  114. 输入值:Type:延时时间 、 NewStatus:使能、失能
  115. 输出值:无
  116. 返回值:无
  117. ***************************************************************/
  118. void I2C_AckDelay(I2C_TYPE_ADLY Type,TYPE_FUNCEN NewStatus)
  119. {
  120. I2C0->MOD.ADLY = Type;
  121. I2C0->MOD.ADE = NewStatus;
  122. }
  123. /***************************************************************
  124. 函数名:I2C_TISConfig
  125. 描 述:I2C数据帧传输间隔设置
  126. 输入值:Time:传输间隔
  127. 输出值:无
  128. 返回值:无
  129. ***************************************************************/
  130. void I2C_TISConfig(I2C_TYPE_TIS Time)
  131. {
  132. I2C0->MOD.TIS = Time;
  133. }
  134. /***************************************************************
  135. 函数名:I2C_SendByte
  136. 描 述:I2C字节发送
  137. 输入值:Byte:字节数据
  138. 输出值:无
  139. 返回值:无
  140. ***************************************************************/
  141. void I2C_SendByte(uint8_t Byte)
  142. {
  143. I2C0->TBW.Byte[0] = Byte;
  144. }
  145. /***************************************************************
  146. 函数名:I2C_SendHalfWord
  147. 描 述:I2C半字发送
  148. 输入值:HalfWord:半节数据
  149. 输出值:无
  150. 返回值:无
  151. ***************************************************************/
  152. void I2C_SendHalfWord(uint16_t HalfWord)
  153. {
  154. I2C0->TBW.HalfWord[0] = HalfWord;
  155. }
  156. /***************************************************************
  157. 函数名:I2C_SendWord
  158. 描 述:I2C字发送
  159. 输入值:Word:字数据
  160. 输出值:无
  161. 返回值:无
  162. ***************************************************************/
  163. void I2C_SendWord(uint32_t Word)
  164. {
  165. I2C0->TBW.Word = Word;
  166. }
  167. /***************************************************************
  168. 函数名:I2C_RecByte
  169. 描 述:I2C接收-字节
  170. 输入值:无
  171. 输出值:无
  172. 返回值:接收的数据
  173. ***************************************************************/
  174. uint8_t I2C_RecByte(void)
  175. {
  176. return I2C0->RBR.Byte[0] ;
  177. }
  178. /***************************************************************
  179. 函数名:I2C_RecHalfWord
  180. 描 述:I2C接收-半字
  181. 输入值:无
  182. 输出值:无
  183. 返回值:接收的数据
  184. ***************************************************************/
  185. uint16_t I2C_RecHalfWord(void)
  186. {
  187. return I2C0->RBR.HalfWord[0];
  188. }
  189. /***************************************************************
  190. 函数名:I2C_RecWord
  191. 描 述:I2C接收-字
  192. 输入值:无
  193. 输出值:无
  194. 返回值:接收的数据
  195. ***************************************************************/
  196. uint32_t I2C_RecWord(void)
  197. {
  198. return I2C0->RBR.Word ;
  199. }
  200. /***************************************************************
  201. 函数名:I2C_GetRWMode
  202. 描 述:I2C工作读写状态读取
  203. 输入值:无
  204. 输出值:无
  205. 返回值:读/写
  206. ***************************************************************/
  207. I2C_TYPE_RWMODE I2C_GetRWMode(void)
  208. {
  209. I2C_TYPE_RWMODE Status = I2C_Mode_Write;
  210. if(I2C0->CON.RW != 0)
  211. Status = I2C_Mode_Read;
  212. else
  213. Status = I2C_Mode_Write;
  214. return Status;
  215. }
  216. /***************************************************************
  217. 函数名:I2C_GetTBStatus
  218. 描 述:I2C获取发送缓冲寄存器状态,TB0-TB3全空则返回SET,否则返回RESET
  219. 输入值:无
  220. 输出值:无
  221. 返回值:SET/RESET
  222. ***************************************************************/
  223. FlagStatus I2C_GetTBStatus(void)
  224. {
  225. FlagStatus bitstatus = RESET;
  226. if((I2C0->STA.Word&(uint32_t)0x0f00) != (uint32_t)0x0f00)
  227. bitstatus = RESET;
  228. else
  229. bitstatus = SET;
  230. return bitstatus;
  231. }
  232. /***************************************************************
  233. 函数名:I2C_GetFlagStatus
  234. 描 述:I2C获取标志位状态
  235. 输入值:I2C_Flag:选择需要的标志位
  236. 输出值:无
  237. 返回值:SET/RESET
  238. ***************************************************************/
  239. FlagStatus I2C_GetFlagStatus(I2C_TYPE_FLAG I2C_Flag)
  240. {
  241. FlagStatus bitstatus = RESET;
  242. if ((I2C0->IF.Word & (uint32_t)I2C_Flag) != RESET)
  243. bitstatus = SET;
  244. else
  245. bitstatus = RESET;
  246. return bitstatus;
  247. }
  248. /*************************************
  249. 函数名:I2C_GetITStatus
  250. 描 述:获取中断使能状态
  251. 输入值:I2C_Flag 中断使能位
  252. 中断类型
  253. 返回值:SET/RESET
  254. **************************************/
  255. FlagStatus I2C_GetITStatus( I2C_TYPE_IT I2C_Flag)
  256. {
  257. FlagStatus status = RESET;
  258. if ((I2C0->IE.Word & (uint32_t)I2C_Flag) == RESET)
  259. return status;
  260. if ((I2C0->IF.Word & (uint32_t)I2C_Flag) != RESET)
  261. status = SET;
  262. return status;
  263. }
  264. /***************************************************************
  265. 函数名:I2C_ClearITPendingBit
  266. 描 述:I2C中断标志清除
  267. 输入值:I2C_IT:标志位
  268. 输出值:无
  269. 返回值:无
  270. ***************************************************************/
  271. void I2C_ClearITPendingBit(I2C_CLR_IF I2C_IT)
  272. {
  273. I2C0->IF.Word = (uint32_t)I2C_IT;
  274. }
  275. /*************************END OF FILE**********************/