cmem7_spi.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /**
  2. *****************************************************************************
  3. * @file cmem7_spi.c
  4. *
  5. * @brief CMEM7 SPI source file
  6. *
  7. *
  8. * @version V1.0
  9. * @date 3. September 2013
  10. *
  11. * @note
  12. *
  13. *****************************************************************************
  14. * @attention
  15. *
  16. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  17. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  18. * TIME. AS A RESULT, CAPITAL-MICRO SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  19. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  20. * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  21. * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  22. *
  23. * <h2><center>&copy; COPYRIGHT 2013 Capital-micro </center></h2>
  24. *****************************************************************************
  25. */
  26. #include "cmem7_spi.h"
  27. void SPI_Init(SPI0_Type* SPIx, SPI_InitTypeDef *init) {
  28. assert_param(IS_SPI_ALL_PERIPH(SPIx));
  29. assert_param(init);
  30. assert_param(IS_SPI_MODE(init->SPI_Mode));
  31. assert_param(init->SPI_BitLength != 0);
  32. if (init->SPI_Mode == SPI_MODE_CPOL_0_CPHA_0) {
  33. SPIx->CTRL_b.CLK_HIGH = FALSE;
  34. SPIx->CTRL_b.NEG_EDGE = TRUE;
  35. } else if (init->SPI_Mode == SPI_MODE_CPOL_0_CPHA_1) {
  36. SPIx->CTRL_b.CLK_HIGH = FALSE;
  37. SPIx->CTRL_b.NEG_EDGE = FALSE;
  38. } else if (init->SPI_Mode == SPI_MODE_CPOL_1_CPHA_0) {
  39. SPIx->CTRL_b.CLK_HIGH = TRUE;
  40. SPIx->CTRL_b.NEG_EDGE = FALSE;
  41. } else {
  42. SPIx->CTRL_b.CLK_HIGH = TRUE;
  43. SPIx->CTRL_b.NEG_EDGE = TRUE;
  44. }
  45. SPIx->CTRL_b.RX_EN = init->SPI_RxEn;
  46. SPIx->BCNT_b.CNT = init->SPI_BitLength - 1;
  47. SPIx->DIV = init->SPI_ClockDividor;
  48. SPIx->GAP = (init->SPI_Gap == 0) ? 0 : init->SPI_Gap / 2 + 1;
  49. }
  50. void SPI_Enable(SPI0_Type* SPIx, BOOL enable) {
  51. assert_param(IS_SPI_ALL_PERIPH(SPIx));
  52. SPIx->CTRL_b.EN = enable;
  53. }
  54. void SPI_EnableInt(SPI0_Type* SPIx, uint32_t Int, BOOL enable) {
  55. assert_param(IS_SPI_ALL_PERIPH(SPIx));
  56. assert_param(IS_SPI_INT(Int));
  57. if (enable) {
  58. SPIx->INT_MASK &= ~Int;
  59. } else {
  60. SPIx->INT_MASK |= Int;
  61. }
  62. SPIx->INT_MASK &= SPI_INT_ALL;
  63. }
  64. BOOL SPI_GetIntStatus(SPI0_Type* SPIx, uint32_t Int) {
  65. assert_param(IS_SPI_ALL_PERIPH(SPIx));
  66. assert_param(IS_SPI_INT(Int));
  67. if (0 != (SPIx->INT_STATUS & Int)) {
  68. return TRUE;
  69. }
  70. return FALSE;
  71. }
  72. void SPI_ClearInt(SPI0_Type* SPIx, uint32_t Int) {
  73. assert_param(IS_SPI_ALL_PERIPH(SPIx));
  74. assert_param(IS_SPI_INT(Int));
  75. SPIx->INT_STATUS = Int;
  76. }
  77. uint8_t SPI_ReadFifo(SPI0_Type* SPIx, uint8_t size, uint32_t* data) {
  78. uint8_t count;
  79. assert_param(IS_SPI_ALL_PERIPH(SPIx));
  80. assert_param(data);
  81. if (!SPIx->CTRL_b.EN) {
  82. return 0;
  83. }
  84. count = 0;
  85. while (!SPIx->STATUS_b.RFIFO_EMPTY && count < size) {
  86. uint32_t d = SPIx->RW_DATA;
  87. d <<= (32 - SPIx->BCNT_b.CNT - 1);
  88. d >>= (32 - SPIx->BCNT_b.CNT - 1);
  89. *(data + count++) = d;
  90. }
  91. return count;
  92. }
  93. uint8_t SPI_WriteFifo(SPI0_Type* SPIx, uint8_t Size, uint32_t* data) {
  94. uint8_t count;
  95. assert_param(IS_SPI_ALL_PERIPH(SPIx));
  96. assert_param(data);
  97. if (!SPIx->CTRL_b.EN) {
  98. return 0;
  99. }
  100. count = 0;
  101. while (!SPIx->STATUS_b.TFIFO_FULL && count < Size) {
  102. uint32_t d = *(data + count++);
  103. d <<= (32 - SPIx->BCNT_b.CNT - 1);
  104. SPIx->RW_DATA = d;
  105. }
  106. return count;
  107. }
  108. BOOL SPI_Transcation(SPI0_Type* SPIx, uint8_t size) {
  109. assert_param(IS_SPI_ALL_PERIPH(SPIx));
  110. assert_param(size);
  111. if (!SPIx->CTRL_b.EN) {
  112. return FALSE;
  113. }
  114. SPIx->TRANS_CNT = size - 1;
  115. SPIx->TRANS_START_b.TX_TRIGGER = TRUE;
  116. return TRUE;
  117. }