spi.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include "drivers/spi/spi.h"
  2. #include "stm32l1xx_hal.h"
  3. #include "stm32l1xx_hal_spi.h"
  4. #include "core/gpio.h"
  5. #include "core/config_pins.h"
  6. static SPI_HandleTypeDef handle_spi = {
  7. #if CONFIG_PERIF_EXTMEMSPI == CONFIG_PERIF_SPI1
  8. .Instance = SPI1
  9. #elif CONFIG_PERIF_EXTMEMSPI == CONFIG_PERIF_SPI2
  10. .Instance = SPI2
  11. #else
  12. #error Invalid SPI specified in 'config_pins.h': see 'CONFIG_PERIF_EXTMEMSPI'
  13. #endif
  14. };
  15. static void SPI_SetNSS();
  16. static void SPI_ClrNSS();
  17. static void SPI_Init();
  18. static void SPI_DeInit();
  19. static void SPI_TransmitReceive( uint8_t * pTxBuf, uint8_t * pRxBuf, size_t size );
  20. static void SPI_Receive( uint8_t * pRxBuf, size_t size );
  21. static void SPI_Transmit( uint8_t * pTxBuf, size_t size );
  22. const SPI_Handle_t SPIHandle = {
  23. .Init = SPI_Init,
  24. .DeInit = SPI_DeInit,
  25. .SetNSS = SPI_SetNSS,
  26. .ClrNSS = SPI_ClrNSS,
  27. .Transmit = SPI_Transmit,
  28. .Receive = SPI_Receive,
  29. .TransmitReceive = SPI_TransmitReceive
  30. };
  31. static void SPI_Init()
  32. {
  33. // Initialize SPI handle
  34. #if CONFIG_PERIF_EXTMEMSPI == CONFIG_PERIF_SPI1
  35. handle_spi.Instance = SPI1;
  36. #elif CONFIG_PERIF_EXTMEMSPI == CONFIG_PERIF_SPI2
  37. handle_spi.Instance = SPI2;
  38. #else
  39. #error Invalid SPI specified in 'config_pins.h': see 'CONFIG_PERIF_EXTMEMSPI'
  40. #endif
  41. handle_spi.Init.Mode = SPI_MODE_MASTER;
  42. handle_spi.Init.Direction = SPI_DIRECTION_2LINES;
  43. handle_spi.Init.DataSize = SPI_DATASIZE_8BIT;
  44. handle_spi.Init.CLKPolarity = SPI_POLARITY_LOW;
  45. handle_spi.Init.CLKPhase = SPI_PHASE_1EDGE;
  46. handle_spi.Init.NSS = SPI_NSS_SOFT;
  47. handle_spi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  48. handle_spi.Init.FirstBit = SPI_FIRSTBIT_MSB;
  49. handle_spi.Init.TIMode = SPI_TIMODE_DISABLED;
  50. handle_spi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
  51. handle_spi.Init.CRCPolynomial = 7;
  52. {
  53. GPIO_InitTypeDef GPIO_InitStruct = {0};
  54. // Configure GPIO pins for SPI
  55. GPIO_InitStruct.Pin = CONFIG_PIN__EXTMEMSPI__CK|CONFIG_PIN__EXTMEMSPI__SO|CONFIG_PIN__EXTMEMSPI__SI;
  56. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  57. GPIO_InitStruct.Pull = GPIO_NOPULL;
  58. #if CONFIG_PERIF_EXTMEMSPI == CONFIG_PERIF_SPI1
  59. GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
  60. #elif CONFIG_PERIF_EXTMEMSPI == CONFIG_PERIF_SPI2
  61. GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
  62. #else
  63. #error Invalid SPI specified in 'config_pins.h': see 'CONFIG_PERIF_EXTMEMSPI'
  64. #endif
  65. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  66. HAL_GPIO_Init(CONFIG_PORT__EXTMEMSPI__SO_SI_CK, &GPIO_InitStruct);
  67. }
  68. {
  69. GPIO_InitTypeDef GPIO_InitStruct = {0};
  70. // Configure GPIO pins for SPI : PB11 = Software NSS
  71. GPIO_InitStruct.Pin = CONFIG_PIN__EXTMEMSPI__CS;
  72. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  73. GPIO_InitStruct.Pull = GPIO_PULLUP;
  74. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
  75. HAL_GPIO_Init(CONFIG_PORT__EXTMEMSPI__CS, &GPIO_InitStruct);
  76. HAL_GPIO_WritePin( CONFIG_PORT__EXTMEMSPI__CS, CONFIG_PIN__EXTMEMSPI__CS, GPIO_PIN_SET );
  77. }
  78. #if CONFIG_PERIF_EXTMEMSPI == CONFIG_PERIF_SPI1
  79. // Enable SPI1 Clocking
  80. __HAL_RCC_SPI1_CLK_ENABLE();
  81. #elif CONFIG_PERIF_EXTMEMSPI == CONFIG_PERIF_SPI2
  82. // Enable SPI2 Clocking
  83. __HAL_RCC_SPI2_CLK_ENABLE();
  84. #else
  85. #error Invalid SPI specified in 'config_pins.h': see 'CONFIG_PERIF_EXTMEMSPI'
  86. #endif
  87. // Initialize SPI HAL
  88. HAL_SPI_Init( &handle_spi );
  89. // Set NSS to HIGH by default
  90. SPI_SetNSS();
  91. }
  92. static void SPI_DeInit()
  93. {
  94. #if CONFIG_PERIF_EXTMEMSPI == CONFIG_PERIF_SPI1
  95. // Disable SPI1 Clocking
  96. handle_spi.Instance = SPI1;
  97. __HAL_RCC_SPI1_CLK_DISABLE();
  98. #elif CONFIG_PERIF_EXTMEMSPI == CONFIG_PERIF_SPI2
  99. // Disable SPI2 Clocking
  100. handle_spi.Instance = SPI2;
  101. __HAL_RCC_SPI2_CLK_DISABLE();
  102. #else
  103. #error Invalid SPI specified in 'config_pins.h': see 'CONFIG_PERIF_EXTMEMSPI'
  104. #endif
  105. // Deinitialize ports
  106. // It is required to pull NSS (CS) to VCC to prevent
  107. // the slave activating!!!!
  108. // Configure GPIO pins for SPI
  109. {
  110. GPIO_InitTypeDef GPIO_InitStruct = {0};
  111. GPIO_InitStruct.Pin = CONFIG_PIN__EXTMEMSPI__CK|CONFIG_PIN__EXTMEMSPI__SO|CONFIG_PIN__EXTMEMSPI__SI;
  112. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  113. GPIO_InitStruct.Pull = GPIO_NOPULL;
  114. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  115. HAL_GPIO_Init(CONFIG_PORT__EXTMEMSPI__SO_SI_CK, &GPIO_InitStruct);
  116. }
  117. {
  118. GPIO_InitTypeDef GPIO_InitStruct = {0};
  119. GPIO_InitStruct.Pin = CONFIG_PIN__EXTMEMSPI__CS;
  120. #if SPI_KEEP_NSS_PULLEDUP
  121. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  122. GPIO_InitStruct.Pull = GPIO_PULLUP;
  123. #else
  124. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  125. GPIO_InitStruct.Pull = GPIO_NOPULL;
  126. #endif
  127. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  128. HAL_GPIO_Init(CONFIG_PORT__EXTMEMSPI__CS, &GPIO_InitStruct);
  129. }
  130. // DeInitialize SPI HAL
  131. HAL_SPI_DeInit( &handle_spi );
  132. }
  133. static void SPI_SetNSS()
  134. {
  135. HAL_GPIO_WritePin( CONFIG_PORT__EXTMEMSPI__CS, CONFIG_PIN__EXTMEMSPI__CS, GPIO_PIN_SET );
  136. }
  137. static void SPI_ClrNSS()
  138. {
  139. HAL_GPIO_WritePin( CONFIG_PORT__EXTMEMSPI__CS, CONFIG_PIN__EXTMEMSPI__CS, GPIO_PIN_RESET );
  140. }
  141. static void SPI_Transmit( uint8_t * pTxBuf, size_t size )
  142. {
  143. HAL_SPI_Transmit( &handle_spi, pTxBuf, size, HAL_MAX_DELAY );
  144. }
  145. static void SPI_Receive( uint8_t * pRxBuf, size_t size )
  146. {
  147. HAL_SPI_Receive( &handle_spi, pRxBuf, size, HAL_MAX_DELAY );
  148. }
  149. static void SPI_TransmitReceive( uint8_t * pTxBuf, uint8_t * pRxBuf, size_t size )
  150. {
  151. HAL_SPI_TransmitReceive( &handle_spi, pTxBuf, pRxBuf, size, HAL_MAX_DELAY );
  152. }