switchboard_control.c 5.5 KB

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