lib_spi.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. /**
  2. ******************************************************************************
  3. * @file lib_spi.c
  4. * @author Application Team
  5. * @version V4.4.0
  6. * @date 2018-09-27
  7. * @brief SPI library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_spi.h"
  14. #define SPI_MISC_RSTValue (0UL)
  15. /**
  16. * @brief Reset SPI controller.
  17. * @param SPIx:SPI1~SPI2
  18. * @retval None
  19. */
  20. void SPI_DeviceInit(SPI_TypeDef *SPIx)
  21. {
  22. __IO uint32_t dummy_data = 0UL;
  23. /* Check parameters */
  24. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  25. /* Disable SPI */
  26. SPIx->CTRL = 0;
  27. /* SPI soft reset */
  28. SPIx->CTRL |= SPI_CTRL_SPIRST;
  29. SPIx->CTRL &= ~SPI_CTRL_SPIRST;
  30. /* Clear flag */
  31. dummy_data = SPIx->RXDAT;
  32. dummy_data += 1;
  33. SPIx->TXSTS = SPI_TXSTS_TXIF;
  34. SPIx->RXSTS = SPI_RXSTS_RXIF;
  35. /* write default values */
  36. SPIx->MISC_ = SPI_MISC_RSTValue;
  37. }
  38. /**
  39. * @brief Fills each SPI_InitType member with its default value.
  40. * @param InitStruct: pointer to an SPI_InitType structure which will be initialized.
  41. * @retval None
  42. */
  43. void SPI_StructInit(SPI_InitType *InitStruct)
  44. {
  45. /*--------------- Reset SPI init structure parameters values ---------------*/
  46. /* Initialize the ClockDivision member */
  47. InitStruct->ClockDivision = SPI_CLKDIV_2;
  48. /* Initialize the CSNSoft member */
  49. InitStruct->CSNSoft = SPI_CSNSOFT_DISABLE;
  50. /* Initialize the Mode member */
  51. InitStruct->Mode = SPI_MODE_MASTER;
  52. /* Initialize the SPH member */
  53. InitStruct->SPH = SPI_SPH_0;
  54. /* Initialize the SPO member */
  55. InitStruct->SPO = SPI_SPO_0;
  56. /* Initialize the SWAP member */
  57. InitStruct->SWAP = SPI_SWAP_DISABLE;
  58. }
  59. /**
  60. * @brief SPI initialization.
  61. * @param SPIx:SPI1~SPI2
  62. InitStruct: SPI configuration.
  63. Mode:
  64. SPI_MODE_MASTER
  65. SPI_MODE_SLAVE
  66. SPH:
  67. SPI_SPH_0
  68. SPI_SPH_1
  69. SPO:
  70. SPI_SPO_0
  71. SPI_SPO_1
  72. ClockDivision:
  73. SPI_CLKDIV_2
  74. SPI_CLKDIV_4
  75. SPI_CLKDIV_8
  76. SPI_CLKDIV_16
  77. SPI_CLKDIV_32
  78. SPI_CLKDIV_64
  79. SPI_CLKDIV_128
  80. CSNSoft:
  81. SPI_CSNSOFT_ENABLE
  82. SPI_CSNSOFT_DISABLE
  83. SWAP:
  84. SPI_SWAP_ENABLE
  85. SPI_SWAP_DISABLE
  86. * @retval None
  87. */
  88. void SPI_Init(SPI_TypeDef *SPIx, SPI_InitType *InitStruct)
  89. {
  90. uint32_t tmp;
  91. /* Check parameters */
  92. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  93. assert_parameters(IS_SPI_MODE(InitStruct->Mode));
  94. assert_parameters(IS_SPI_SPH(InitStruct->SPH));
  95. assert_parameters(IS_SPI_SPO(InitStruct->SPO));
  96. assert_parameters(IS_SPI_CLKDIV(InitStruct->ClockDivision));
  97. assert_parameters(IS_SPI_CSN(InitStruct->CSNSoft));
  98. assert_parameters(IS_SPI_SWAP(InitStruct->SWAP));
  99. tmp = SPIx->CTRL;
  100. tmp &= ~(SPI_CTRL_MOD\
  101. |SPI_CTRL_SCKPHA\
  102. |SPI_CTRL_SCKPOL\
  103. |SPI_CTRL_CSGPIO\
  104. |SPI_CTRL_SWAP\
  105. |SPI_CTRL_SCKSEL);
  106. tmp |= (InitStruct->Mode\
  107. |InitStruct->SPH\
  108. |InitStruct->SPO\
  109. |InitStruct->CSNSoft\
  110. |InitStruct->SWAP\
  111. |InitStruct->ClockDivision);
  112. SPIx->CTRL = tmp;
  113. }
  114. /**
  115. * @brief Enables or disables SPI.
  116. * @param SPIx:SPI1~SPI2
  117. NewState:
  118. ENABLE
  119. DISABLE
  120. * @retval None
  121. */
  122. void SPI_Cmd(SPI_TypeDef *SPIx, uint32_t NewState)
  123. {
  124. /* Check parameters */
  125. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  126. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  127. if (NewState == ENABLE)
  128. SPIx->CTRL |= SPI_CTRL_SPIEN;
  129. else
  130. SPIx->CTRL &= ~SPI_CTRL_SPIEN;
  131. }
  132. /**
  133. * @brief SPI interrupt config.
  134. * @param SPIx:SPI1~SPI2
  135. INTMask: can use the ¡®|¡¯ operator
  136. SPI_INT_TX
  137. SPI_INT_RX
  138. NewState:
  139. ENABLE
  140. DISABLE
  141. * @retval None
  142. */
  143. void SPI_INTConfig(SPI_TypeDef *SPIx, uint32_t INTMask, uint32_t NewState)
  144. {
  145. uint32_t tmp, tmp_INTMask;
  146. /* Check parameters */
  147. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  148. assert_parameters(IS_SPI_INT(INTMask));
  149. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  150. tmp_INTMask = INTMask;
  151. if (tmp_INTMask & 0x80000000)
  152. {
  153. INTMask &= 0xFFFF;
  154. tmp = SPIx->TXSTS;
  155. tmp &= ~SPI_TXSTS_TXIF;
  156. if (NewState == ENABLE)
  157. {
  158. tmp |= INTMask;
  159. SPIx->TXSTS = tmp;
  160. }
  161. else
  162. {
  163. tmp &= ~INTMask;
  164. SPIx->TXSTS = tmp;
  165. }
  166. }
  167. if (tmp_INTMask & 0x40000000)
  168. {
  169. INTMask &= 0xFFFF;
  170. tmp = SPIx->RXSTS;
  171. tmp &= ~SPI_RXSTS_RXIF;
  172. if (NewState == ENABLE)
  173. {
  174. tmp |= INTMask;
  175. SPIx->RXSTS = tmp;
  176. }
  177. else
  178. {
  179. tmp &= ~INTMask;
  180. SPIx->RXSTS = tmp;
  181. }
  182. }
  183. }
  184. /**
  185. * @brief Get status flag.
  186. * @param SPIx:SPI1~SPI2
  187. Status:
  188. SPI_STS_TXIF
  189. SPI_STS_TXEMPTY
  190. SPI_STS_TXFUR
  191. SPI_STS_RXIF
  192. SPI_STS_RXFULL
  193. SPI_STS_RXFOV
  194. SPI_STS_BSY
  195. SPI_STS_RFF
  196. SPI_STS_RNE
  197. SPI_STS_TNF
  198. SPI_STS_TFE
  199. * @retval Flag status.
  200. */
  201. uint8_t SPI_GetStatus(SPI_TypeDef *SPIx, uint32_t Status)
  202. {
  203. /* Check parameters */
  204. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  205. assert_parameters(IS_SPI_STSR(Status));
  206. if ((Status&0xE0000000) == 0x80000000)
  207. {
  208. if (Status&SPIx->TXSTS)
  209. return 1;
  210. else
  211. return 0;
  212. }
  213. else if ((Status&0xE0000000) == 0x40000000)
  214. {
  215. if (Status&SPIx->RXSTS)
  216. return 1;
  217. else
  218. return 0;
  219. }
  220. else
  221. {
  222. if (Status&SPIx->MISC_)
  223. return 1;
  224. else
  225. return 0;
  226. }
  227. }
  228. /**
  229. * @brief Clear status flag.
  230. * @param SPIx:SPI1~SPI2
  231. Status: can use the ¡®|¡¯ operator
  232. SPI_STS_TXIF
  233. SPI_STS_RXIF
  234. * @retval None
  235. */
  236. void SPI_ClearStatus(SPI_TypeDef *SPIx, uint32_t Status)
  237. {
  238. uint32_t tmp_status;
  239. /* Check parameters */
  240. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  241. assert_parameters(IS_SPI_STSC(Status));
  242. tmp_status = Status;
  243. if (tmp_status & 0x80000000)
  244. {
  245. Status &= 0xFFFF;
  246. SPIx->TXSTS |= Status;
  247. }
  248. if (tmp_status & 0x40000000)
  249. {
  250. Status &= 0xFFFF;
  251. SPIx->RXSTS |= Status;
  252. }
  253. }
  254. /**
  255. * @brief Load send data register.
  256. * @param SPIx:SPI1~SPI2
  257. ch: data write to send data register
  258. * @retval None
  259. */
  260. void SPI_SendData(SPI_TypeDef *SPIx, uint8_t ch)
  261. {
  262. /* Check parameters */
  263. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  264. SPIx->TXDAT = ch;
  265. }
  266. /**
  267. * @brief Read receive data register.
  268. * @param SPIx:SPI1~SPI2
  269. * @retval receive data value
  270. */
  271. uint8_t SPI_ReceiveData(SPI_TypeDef *SPIx)
  272. {
  273. /* Check parameters */
  274. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  275. return (SPIx->RXDAT);
  276. }
  277. /**
  278. * @brief Transmit fifo level configure.
  279. * @param SPIx:SPI1~SPI2
  280. FIFOLevel:
  281. SPI_TXFLEV_0
  282. SPI_TXFLEV_1
  283. SPI_TXFLEV_2
  284. SPI_TXFLEV_3
  285. SPI_TXFLEV_4
  286. SPI_TXFLEV_5
  287. SPI_TXFLEV_6
  288. SPI_TXFLEV_7
  289. * @retval None
  290. */
  291. void SPI_TransmitFIFOLevelConfig(SPI_TypeDef *SPIx, uint32_t FIFOLevel)
  292. {
  293. uint32_t tmp;
  294. /* Check parameters */
  295. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  296. assert_parameters(IS_SPI_TXFLEV(FIFOLevel));
  297. tmp = SPIx->TXSTS;
  298. tmp &= ~(SPI_TXSTS_TXFLEV | SPI_TXSTS_TXIF);
  299. tmp |= FIFOLevel;
  300. SPIx->TXSTS = tmp;
  301. }
  302. /**
  303. * @brief Receive fifo level configure.
  304. * @param SPIx:SPI1~SPI2
  305. FIFOLevel:
  306. SPI_RXFLEV_0
  307. SPI_RXFLEV_1
  308. SPI_RXFLEV_2
  309. SPI_RXFLEV_3
  310. SPI_RXFLEV_4
  311. SPI_RXFLEV_5
  312. SPI_RXFLEV_6
  313. SPI_RXFLEV_7
  314. * @retval None
  315. */
  316. void SPI_ReceiveFIFOLevelConfig(SPI_TypeDef *SPIx, uint32_t FIFOLevel)
  317. {
  318. uint32_t tmp;
  319. /* Check parameters */
  320. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  321. assert_parameters(IS_SPI_RXFLEV(FIFOLevel));
  322. tmp = SPIx->RXSTS;
  323. tmp &= ~(SPI_RXSTS_RXFLEV | SPI_RXSTS_RXIF);
  324. tmp |= FIFOLevel;
  325. SPIx->RXSTS = tmp;
  326. }
  327. /**
  328. * @brief Get transmit fifo level.
  329. * @param SPIx:SPI1~SPI2
  330. * @retval Transmit fifo level.
  331. */
  332. uint8_t SPI_GetTransmitFIFOLevel(SPI_TypeDef *SPIx)
  333. {
  334. /* Check parameters */
  335. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  336. return (SPIx->TXSTS & SPI_TXSTS_TXFFLAG);
  337. }
  338. /**
  339. * @brief Get receive fifo level.
  340. * @param SPIx:SPI1~SPI2
  341. * @retval Receive fifo level.
  342. */
  343. uint8_t SPI_GetReceiveFIFOLevel(SPI_TypeDef *SPIx)
  344. {
  345. /* Check parameters */
  346. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  347. return (SPIx->RXSTS & SPI_RXSTS_RXFFLAG);
  348. }
  349. /**
  350. * @brief FIFO smart mode.
  351. * @param SPIx:SPI1~SPI2
  352. NewState:
  353. ENABLE
  354. DISABLE
  355. * @retval None
  356. */
  357. void SPI_SmartModeCmd(SPI_TypeDef *SPIx, uint32_t NewState)
  358. {
  359. /* Check parameters */
  360. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  361. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  362. if (NewState == ENABLE)
  363. {
  364. SPIx->MISC_ |= SPI_MISC_SMART;
  365. }
  366. else
  367. {
  368. SPIx->MISC_ &= ~SPI_MISC_SMART;
  369. }
  370. }
  371. /**
  372. * @brief FIFO over write mode.
  373. * @param SPIx:SPI1~SPI2
  374. NewState:
  375. ENABLE
  376. DISABLE
  377. * @retval None
  378. */
  379. void SPI_OverWriteModeCmd(SPI_TypeDef *SPIx, uint32_t NewState)
  380. {
  381. /* Check parameters */
  382. assert_parameters(IS_SPI_ALL_INSTANCE(SPIx));
  383. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  384. if (NewState == ENABLE)
  385. {
  386. SPIx->MISC_ |= SPI_MISC_OVER;
  387. }
  388. else
  389. {
  390. SPIx->MISC_ &= ~SPI_MISC_OVER;
  391. }
  392. }
  393. /*********************************** END OF FILE ******************************/