SWM320_i2c.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /******************************************************************************************************************************************
  2. * 文件名称: SWM320_i2c.c
  3. * 功能说明: SWM320单片机的I2C串行接口功能驱动库
  4. * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
  5. * 注意事项:
  6. * 版本日期: V1.1.0 2017年10月25日
  7. * 升级记录:
  8. *
  9. *
  10. *******************************************************************************************************************************************
  11. * @attention
  12. *
  13. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIES AT PROVIDING CUSTOMERS WITH CODING INFORMATION
  14. * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIEE. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
  15. * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIES ARISING FROM THE CONTENT
  16. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
  17. * -ECTION WITH THEIR PRODUCTS.
  18. *
  19. * COPYRIGHT 2012 Synwit Technology
  20. *******************************************************************************************************************************************/
  21. #include "SWM320.h"
  22. #include "SWM320_i2c.h"
  23. /******************************************************************************************************************************************
  24. * 函数名称: I2C_Init()
  25. * 功能说明: I2C初始化
  26. * 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
  27. * I2C_InitStructure * initStruct 包含I2C相关设定值的结构体
  28. * 输 出: 无
  29. * 注意事项: 模块只能工作于主机模式
  30. ******************************************************************************************************************************************/
  31. void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
  32. {
  33. switch ((uint32_t)I2Cx)
  34. {
  35. case ((uint32_t)I2C0):
  36. SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C0_Pos);
  37. break;
  38. case ((uint32_t)I2C1):
  39. SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C1_Pos);
  40. break;
  41. }
  42. I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置
  43. if (initStruct->Master == 1)
  44. {
  45. I2Cx->CLKDIV = SystemCoreClock / 5 / initStruct->MstClk;
  46. I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //使能中断之前先清除中断标志
  47. I2Cx->CTRL &= ~I2C_CTRL_MSTIE_Msk;
  48. I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos);
  49. switch ((uint32_t)I2Cx)
  50. {
  51. case ((uint32_t)I2C0):
  52. if (initStruct->MstIEn)
  53. {
  54. NVIC_EnableIRQ(I2C0_IRQn);
  55. }
  56. else
  57. {
  58. NVIC_DisableIRQ(I2C0_IRQn);
  59. }
  60. break;
  61. case ((uint32_t)I2C1):
  62. if (initStruct->MstIEn)
  63. {
  64. NVIC_EnableIRQ(I2C1_IRQn);
  65. }
  66. else
  67. {
  68. NVIC_DisableIRQ(I2C1_IRQn);
  69. }
  70. break;
  71. }
  72. }
  73. else
  74. {
  75. I2Cx->SLVCR |= (1 << I2C_SLVCR_SLAVE_Pos);
  76. I2Cx->SLVCR &= ~(I2C_SLVCR_ADDR7b_Msk | I2C_SLVCR_ADDR_Msk);
  77. I2Cx->SLVCR |= (1 << I2C_SLVCR_ACK_Pos) |
  78. (initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) |
  79. (initStruct->SlvAddr << I2C_SLVCR_ADDR_Pos);
  80. I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //清中断标志
  81. I2Cx->SLVCR &= ~(I2C_SLVCR_IM_RXEND_Msk | I2C_SLVCR_IM_TXEND_Msk | I2C_SLVCR_IM_STADET_Msk | I2C_SLVCR_IM_STODET_Msk |
  82. I2C_SLVCR_IM_RDREQ_Msk | I2C_SLVCR_IM_WRREQ_Msk);
  83. I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos) |
  84. ((initStruct->SlvTxEndIEn ? 0 : 1) << I2C_SLVCR_IM_TXEND_Pos) |
  85. ((initStruct->SlvSTADetIEn ? 0 : 1) << I2C_SLVCR_IM_STADET_Pos) |
  86. ((initStruct->SlvSTODetIEn ? 0 : 1) << I2C_SLVCR_IM_STODET_Pos) |
  87. ((initStruct->SlvRdReqIEn ? 0 : 1) << I2C_SLVCR_IM_RDREQ_Pos) |
  88. ((initStruct->SlvWrReqIEn ? 0 : 1) << I2C_SLVCR_IM_WRREQ_Pos);
  89. switch ((uint32_t)I2Cx)
  90. {
  91. case ((uint32_t)I2C0):
  92. if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
  93. initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
  94. {
  95. NVIC_EnableIRQ(I2C0_IRQn);
  96. }
  97. else
  98. {
  99. NVIC_DisableIRQ(I2C0_IRQn);
  100. }
  101. break;
  102. case ((uint32_t)I2C1):
  103. if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
  104. initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
  105. {
  106. NVIC_EnableIRQ(I2C1_IRQn);
  107. }
  108. else
  109. {
  110. NVIC_DisableIRQ(I2C1_IRQn);
  111. }
  112. break;
  113. }
  114. }
  115. }
  116. /******************************************************************************************************************************************
  117. * 函数名称: I2C_Open()
  118. * 功能说明: I2C打开,允许收发
  119. * 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
  120. * 输 出: 无
  121. * 注意事项: 无
  122. ******************************************************************************************************************************************/
  123. void I2C_Open(I2C_TypeDef *I2Cx)
  124. {
  125. I2Cx->CTRL |= (0x01 << I2C_CTRL_EN_Pos);
  126. }
  127. /******************************************************************************************************************************************
  128. * 函数名称: I2C_Close()
  129. * 功能说明: I2C关闭,禁止收发
  130. * 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
  131. * 输 出: 无
  132. * 注意事项: 无
  133. ******************************************************************************************************************************************/
  134. void I2C_Close(I2C_TypeDef *I2Cx)
  135. {
  136. I2Cx->CTRL &= ~I2C_CTRL_EN_Msk;
  137. }