lib_spi.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /***************************************************************
  2. *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
  3. *文件名: lib_spi.c
  4. *作 者: Liut
  5. *版 本: V1.00
  6. *日 期: 2017/07/14
  7. *描 述: SPI模块库函数
  8. *备 注: 适用于 ES8P508x芯片
  9. 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
  10. ***************************************************************/
  11. #include "lib_spi.h"
  12. /***************************************************************
  13. 函数名:SPI0_Init
  14. 描 述:SPI初始化
  15. 输入值:初始化配置结构体地址
  16. 输出值:无
  17. 返回值:无
  18. ***************************************************************/
  19. void SPI_Init(SPI_InitStruType* SPI_InitStruct)
  20. {
  21. uint32_t Temp = 0;
  22. Temp = SystemCoreClock / (SPI_InitStruct->SPI_Freq * 2);
  23. if(Temp > 254)
  24. Temp = 255;
  25. SPI0->CKS.CKS = Temp;
  26. SPI0->CON.DFS = SPI_InitStruct->SPI_Df;
  27. SPI0->CON.MS = SPI_InitStruct->SPI_Mode;
  28. SPI0->CON.DW = SPI_InitStruct->SPI_DW;
  29. SPI0->CON.DRE = SPI_InitStruct->SPI_DelayRec;
  30. SPI0->CON.TME = SPI_InitStruct->SPI_DelaySend;
  31. Temp = (uint32_t)SPI_InitStruct->SPI_SendDelayPeroid - 1;
  32. if(Temp > 62)
  33. Temp = 63;
  34. SPI0->CON.TMP = Temp;
  35. }
  36. /***************************************************************
  37. 函数名:SPI0_ITConfig
  38. 描 述:SPI中断配置
  39. 输入值:SPI_IE:中断类型 、 NewState:使能、失能
  40. 输出值:无
  41. 返回值:无
  42. ***************************************************************/
  43. void SPI_ITConfig(SPI_TYPE_IT SPI_IE,TYPE_FUNCEN NewState)
  44. {
  45. if(NewState != DISABLE)
  46. SPI0->IE.Word |= (uint32_t)SPI_IE;
  47. else
  48. SPI0->IE.Word &= ~((uint32_t)SPI_IE);
  49. }
  50. /***************************************************************
  51. 函数名:SPI0_DataFormatConfig
  52. 描 述:SPI数据格式配置
  53. 输入值:数据格式
  54. 输出值:无
  55. 返回值:无
  56. ***************************************************************/
  57. void SPI_DataFormatConfig(SPI_TYPE_DFS Type)
  58. {
  59. SPI0->CON.DFS = Type;
  60. }
  61. /***************************************************************
  62. 函数名:SPI0_SendByte
  63. 描 述:SPI发送一个字节(8位)
  64. 输入值:要发送的数据
  65. 输出值:无
  66. 返回值:无
  67. ***************************************************************/
  68. void SPI_SendByte(uint8_t Temp)
  69. {
  70. SPI0->TBW.Byte[0] = Temp;
  71. }
  72. /***************************************************************
  73. 函数名:SPI0_SendHalfWord
  74. 描 述:SPI发送一个半字(16位)
  75. 输入值:要发送的数据
  76. 输出值:无
  77. 返回值:无
  78. ***************************************************************/
  79. void SPI_SendHalfWord(uint16_t Temp)
  80. {
  81. SPI0->TBW.HalfWord[0] = Temp;
  82. }
  83. /***************************************************************
  84. 函数名:SPI0_SendWord
  85. 描 述:SPI发送一个字(32位)
  86. 输入值:要发送的数据
  87. 输出值:无
  88. 返回值:无
  89. ***************************************************************/
  90. void SPI_SendWord(uint32_t Temp)
  91. {
  92. SPI0->TBW.Word = Temp;
  93. }
  94. /***************************************************************
  95. 函数名:SPI0_RecByte
  96. 描 述:SPI接收一个字节
  97. 输入值:无
  98. 输出值:无
  99. 返回值:接收的数据
  100. ***************************************************************/
  101. uint8_t SPI_RecByte(void)
  102. {
  103. return SPI0->RBR.Byte[0];
  104. }
  105. /***************************************************************
  106. 函数名:SPI0_RecHalfWord
  107. 描 述:SPI接收一个半字
  108. 输入值:无
  109. 输出值:无
  110. 返回值:接收的数据
  111. ***************************************************************/
  112. uint16_t SPI_RecHalfWord(void)
  113. {
  114. return SPI0->RBR.HalfWord[0];
  115. }
  116. /***************************************************************
  117. 函数名:SPI0_RecWord
  118. 描 述:SPI接收一个字
  119. 输入值:无
  120. 输出值:无
  121. 返回值:接收的数据
  122. ***************************************************************/
  123. uint32_t SPI_RecWord(void)
  124. {
  125. return SPI0->RBR.Word;
  126. }
  127. /***************************************************************
  128. 函数名:SPI0_TBIMConfig
  129. 描 述:SPI发送缓冲器空中断模式选择
  130. 输入值:空中断模式
  131. 输出值:无
  132. 返回值:无
  133. ***************************************************************/
  134. void SPI_TBIMConfig(SPI_TYPE_TRBIM Type)
  135. {
  136. SPI0->IE.TBIM = Type;
  137. }
  138. /***************************************************************
  139. 函数名:SPI0_RBIMConfig
  140. 描 述:SPI接收缓冲器满中断模式选择
  141. 输入值:满中断模式
  142. 输出值:无
  143. 返回值:无
  144. ***************************************************************/
  145. void SPI_RBIMConfig(SPI_TYPE_TRBIM Type)
  146. {
  147. SPI0->IE.RBIM = Type;
  148. }
  149. /***************************************************************
  150. 函数名:SPI0_GetFlagStatus
  151. 描 述:SPI检查标志位状态
  152. 输入值:标志位
  153. 输出值:无
  154. 返回值:SET/RESET
  155. ***************************************************************/
  156. FlagStatus SPI_GetFlagStatus(SPI_TYPE_FLAG Flag)
  157. {
  158. FlagStatus bitstatus = RESET;
  159. /* 读取寄存器 */
  160. if((uint32_t)Flag <= 0x00000040)
  161. {
  162. if ((SPI0->IF.Word & Flag) != (uint32_t)RESET)
  163. bitstatus = SET;
  164. else
  165. bitstatus = RESET;
  166. }
  167. else
  168. {
  169. if ((SPI0->STA.Word & Flag) != (uint32_t)RESET)
  170. bitstatus = SET;
  171. else
  172. bitstatus = RESET;
  173. }
  174. return bitstatus;
  175. }
  176. /***************************************************************
  177. 函数名:SPI0_GetITStatus
  178. 描 述:SPI检查中断状态,未使能相应中断时不会返回SET
  179. 输入值:中断标志位
  180. 输出值:无
  181. 返回值:SET/RESET
  182. ***************************************************************/
  183. ITStatus SPI_GetITStatus(SPI_TYPE_IT Flag)
  184. {
  185. FlagStatus bitstatus = RESET;
  186. uint32_t itstatus = 0x0, itenable = 0x0;
  187. itstatus = SPI0->IF.Word & (uint32_t)Flag;
  188. itenable = SPI0->IE.Word & (uint32_t)Flag;
  189. if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET))
  190. bitstatus = SET;
  191. else
  192. bitstatus = RESET;
  193. return bitstatus;
  194. }
  195. /***************************************************************
  196. 函数名:SPI0_ClearITPendingBit
  197. 描 述:SPI中断标志清除
  198. 输入值:标志位
  199. 输出值:无
  200. 返回值:无
  201. ***************************************************************/
  202. void SPI_ClearITPendingBit(SPI_CLR_IF Flag)
  203. {
  204. SPI0->IF.Word = (uint32_t)Flag;
  205. }
  206. /*************************END OF FILE**********************/