spi.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /* Copyright 2023 Dual Tachyon
  2. * https://github.com/DualTachyon
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include "ARMCM0.h"
  17. #include "bsp/dp32g030/spi.h"
  18. #include "bsp/dp32g030/syscon.h"
  19. #include "bsp/dp32g030/irq.h"
  20. #include "driver/spi.h"
  21. void SPI0_Init(void)
  22. {
  23. SPI_Config_t Config;
  24. SPI_Disable(&SPI0->CR);
  25. Config.TXFIFO_EMPTY = 0;
  26. Config.RXFIFO_HFULL = 0;
  27. Config.RXFIFO_FULL = 0;
  28. Config.RXFIFO_OVF = 0;
  29. Config.MSTR = 1;
  30. Config.SPR = 2;
  31. Config.CPHA = 1;
  32. Config.CPOL = 1;
  33. Config.LSB = 0;
  34. Config.TF_CLR = 0;
  35. Config.RF_CLR = 0;
  36. Config.TXFIFO_HFULL = 0;
  37. SPI_Configure(SPI0, &Config);
  38. SPI_Enable(&SPI0->CR);
  39. }
  40. void SPI_WaitForUndocumentedTxFifoStatusBit(void)
  41. {
  42. uint32_t Timeout;
  43. Timeout = 0;
  44. do {
  45. // Undocumented bit!
  46. if ((SPI0->IF & 0x20) == 0) {
  47. break;
  48. }
  49. Timeout++;
  50. } while (Timeout <= 100000);
  51. }
  52. void SPI_Disable(volatile uint32_t *pCR)
  53. {
  54. *pCR = (*pCR & ~SPI_CR_SPE_MASK) | SPI_CR_SPE_BITS_DISABLE;
  55. }
  56. void SPI_Configure(volatile SPI_Port_t *pPort, SPI_Config_t *pConfig)
  57. {
  58. if (pPort == SPI0) {
  59. SYSCON_DEV_CLK_GATE = (SYSCON_DEV_CLK_GATE & ~SYSCON_DEV_CLK_GATE_SPI0_MASK) | SYSCON_DEV_CLK_GATE_SPI0_BITS_ENABLE;
  60. } else if (pPort == SPI1) {
  61. SYSCON_DEV_CLK_GATE = (SYSCON_DEV_CLK_GATE & ~SYSCON_DEV_CLK_GATE_SPI1_MASK) | SYSCON_DEV_CLK_GATE_SPI1_BITS_ENABLE;
  62. }
  63. SPI_Disable(&pPort->CR);
  64. pPort->CR = 0
  65. | (pPort->CR & ~(SPI_CR_SPR_MASK | SPI_CR_CPHA_MASK | SPI_CR_CPOL_MASK | SPI_CR_MSTR_MASK | SPI_CR_LSB_MASK | SPI_CR_RF_CLR_MASK))
  66. | ((pConfig->SPR << SPI_CR_SPR_SHIFT) & SPI_CR_SPR_MASK)
  67. | ((pConfig->CPHA << SPI_CR_CPHA_SHIFT) & SPI_CR_CPHA_MASK)
  68. | ((pConfig->CPOL << SPI_CR_CPOL_SHIFT) & SPI_CR_CPOL_MASK)
  69. | ((pConfig->MSTR << SPI_CR_MSTR_SHIFT) & SPI_CR_MSTR_MASK)
  70. | ((pConfig->LSB << SPI_CR_LSB_SHIFT) & SPI_CR_LSB_MASK)
  71. | ((pConfig->RF_CLR << SPI_CR_RF_CLR_SHIFT) & SPI_CR_RF_CLR_MASK)
  72. | ((pConfig->TF_CLR << SPI_CR_TF_CLR_SHIFT) & SPI_CR_TF_CLR_MASK)
  73. ;
  74. pPort->IE = 0
  75. | ((pConfig->RXFIFO_OVF << SPI_IE_RXFIFO_OVF_SHIFT) & SPI_IE_RXFIFO_OVF_MASK)
  76. | ((pConfig->RXFIFO_FULL << SPI_IE_RXFIFO_FULL_SHIFT) & SPI_IE_RXFIFO_FULL_MASK)
  77. | ((pConfig->RXFIFO_HFULL << SPI_IE_RXFIFO_HFULL_SHIFT) & SPI_IE_RXFIFO_HFULL_MASK)
  78. | ((pConfig->TXFIFO_EMPTY << SPI_IE_TXFIFO_EMPTY_SHIFT) & SPI_IE_TXFIFO_EMPTY_MASK)
  79. | ((pConfig->TXFIFO_HFULL << SPI_IE_TXFIFO_HFULL_SHIFT) & SPI_IE_TXFIFO_HFULL_MASK)
  80. ;
  81. if (pPort->IE) {
  82. if (pPort == SPI0) {
  83. NVIC_EnableIRQ((IRQn_Type)DP32_SPI0_IRQn);
  84. } else if (pPort == SPI1) {
  85. NVIC_EnableIRQ((IRQn_Type)DP32_SPI1_IRQn);
  86. }
  87. }
  88. }
  89. void SPI_ToggleMasterMode(volatile uint32_t *pCR, bool bIsMaster)
  90. {
  91. if (bIsMaster) {
  92. *pCR = (*pCR & ~SPI_CR_MSR_SSN_MASK) | SPI_CR_MSR_SSN_BITS_ENABLE;
  93. } else {
  94. *pCR = (*pCR & ~SPI_CR_MSR_SSN_MASK) | SPI_CR_MSR_SSN_BITS_DISABLE;
  95. }
  96. }
  97. void SPI_Enable(volatile uint32_t *pCR)
  98. {
  99. *pCR = (*pCR & ~SPI_CR_SPE_MASK) | SPI_CR_SPE_BITS_ENABLE;
  100. }