hal_spi.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #include "hal_spi.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "stm32f1xx_hal_gpio.h"
  5. #include "stdbool.h"
  6. #include "board.h"
  7. #include "sys_log.h"
  8. static void SPI1_CsPinInit(void);
  9. static void SPI1_Init(void);
  10. static void SPI1_EXTI_Init(void);
  11. static void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler);
  12. SPI_HandleTypeDef SPI1_Handler;
  13. static spi_inter_callback_fp g_s_int_callback = NULL;
  14. /*
  15. PA5 SPI1_SCK
  16. PA6 SPI1_MISO
  17. PA7 SPI1_MOSI
  18. PA2 CS
  19. PA0 INT
  20. */
  21. void HAL_SpiGpioInit(void)
  22. {
  23. SPI1_Init();
  24. SPI1_SetSpeed(SPI_BAUDRATEPRESCALER_64);
  25. }
  26. void HAL_SpiInit(spi_inter_callback_fp fp)
  27. {
  28. g_s_int_callback = fp;
  29. SPI1_CsPinInit();
  30. SPI1_EXTI_Init();
  31. HAL_SpiGpioInit();
  32. }
  33. void HAL_SpiUnint(void)
  34. {
  35. HAL_SPI_DeInit(&SPI1_Handler);
  36. }
  37. static void SPI1_CsPinInit(void)
  38. {
  39. GPIO_InitTypeDef GPIO_Initure;
  40. __HAL_RCC_GPIOA_CLK_ENABLE();
  41. GPIO_Initure.Pin = SPI1_CS_PIN;
  42. GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;
  43. GPIO_Initure.Pull = GPIO_NOPULL;
  44. GPIO_Initure.Speed = GPIO_SPEED_FREQ_LOW;
  45. HAL_GPIO_Init(SPI1_CS_GPIO, &GPIO_Initure);
  46. HAL_GPIO_WritePin(SPI1_CS_GPIO, SPI1_CS_PIN, GPIO_PIN_SET);
  47. }
  48. void HAL_SpiSetCsPin(bool flag)
  49. {
  50. if(flag)
  51. {
  52. HAL_GPIO_WritePin(SPI1_CS_GPIO, SPI1_CS_PIN, GPIO_PIN_SET);
  53. }
  54. else
  55. {
  56. HAL_GPIO_WritePin(SPI1_CS_GPIO, SPI1_CS_PIN, GPIO_PIN_RESET);
  57. }
  58. }
  59. static void SPI1_Init(void)
  60. {
  61. SPI1_Handler.Instance = SPI1;
  62. SPI1_Handler.Init.Mode = SPI_MODE_MASTER;
  63. SPI1_Handler.Init.Direction = SPI_DIRECTION_2LINES;
  64. SPI1_Handler.Init.DataSize = SPI_DATASIZE_8BIT;
  65. SPI1_Handler.Init.CLKPolarity = SPI_POLARITY_HIGH;
  66. SPI1_Handler.Init.CLKPhase = SPI_PHASE_2EDGE;
  67. SPI1_Handler.Init.NSS = SPI_NSS_SOFT;
  68. SPI1_Handler.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  69. SPI1_Handler.Init.FirstBit = SPI_FIRSTBIT_MSB;
  70. SPI1_Handler.Init.TIMode = SPI_TIMODE_DISABLE;
  71. SPI1_Handler.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  72. SPI1_Handler.Init.CRCPolynomial = 10;
  73. HAL_SPI_Init(&SPI1_Handler);
  74. __HAL_SPI_ENABLE(&SPI1_Handler);
  75. }
  76. void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
  77. {
  78. GPIO_InitTypeDef GPIO_Initure;
  79. __HAL_RCC_GPIOA_CLK_ENABLE();
  80. __HAL_RCC_SPI1_CLK_ENABLE();
  81. GPIO_Initure.Pin = SPI1_CLK_PIN | SPI1_MISO_PIN | SPI1_MOSI_PIN;
  82. GPIO_Initure.Mode = GPIO_MODE_AF_PP;
  83. GPIO_Initure.Pull = GPIO_NOPULL;
  84. GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
  85. HAL_GPIO_Init(SPI1_GPIO, &GPIO_Initure);
  86. }
  87. static void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
  88. {
  89. assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
  90. __HAL_SPI_DISABLE(&SPI1_Handler);
  91. SPI1_Handler.Instance->CR1 &= 0XFFC7;
  92. SPI1_Handler.Instance->CR1 |= SPI_BaudRatePrescaler;
  93. __HAL_SPI_ENABLE(&SPI1_Handler);
  94. }
  95. static void SPI1_EXTI_Init(void)
  96. {
  97. //PA0
  98. GPIO_InitTypeDef GPIO_Initure;
  99. __HAL_RCC_GPIOA_CLK_ENABLE();
  100. GPIO_Initure.Pin = SPI1_INT_PIN;
  101. GPIO_Initure.Mode = GPIO_MODE_IT_RISING;
  102. GPIO_Initure.Pull = GPIO_NOPULL;
  103. HAL_GPIO_Init(SPI1_INT_GPIO, &GPIO_Initure);
  104. HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 2);
  105. HAL_NVIC_EnableIRQ(EXTI0_IRQn);
  106. }
  107. void EXTI0_IRQHandler(void)
  108. {
  109. HAL_GPIO_EXTI_IRQHandler(SPI1_INT_PIN);
  110. }
  111. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  112. {
  113. switch (GPIO_Pin)
  114. {
  115. case SPI1_INT_PIN:
  116. if (g_s_int_callback)
  117. {
  118. g_s_int_callback(0);
  119. }
  120. break;
  121. default:
  122. break;
  123. }
  124. }
  125. static int SPI1_Tx_Data(uint8_t *data, uint8_t data_len)
  126. {
  127. if (HAL_SPI_Transmit(&SPI1_Handler, data, data_len, 1000) != HAL_OK)
  128. {
  129. return -1;
  130. }
  131. return data_len;
  132. }
  133. static int SPI1_Rx_Data(uint8_t *data, uint8_t data_len)
  134. {
  135. if (HAL_SPI_Receive(&SPI1_Handler, data, data_len, 1000) != HAL_OK)
  136. {
  137. return -1;
  138. }
  139. return data_len;
  140. }
  141. int HAL_SpiTxData(uint8_t *data, uint8_t data_len)
  142. {
  143. int ret = 0;
  144. HAL_SpiSetCsPin(0);
  145. ret = SPI1_Tx_Data(data, data_len);
  146. HAL_SpiSetCsPin(1);
  147. return ret;
  148. }
  149. int HAL_SpiRxData(uint8_t *data, uint8_t data_len)
  150. {
  151. int ret = 0;
  152. HAL_SpiSetCsPin(0);
  153. ret = SPI1_Rx_Data(data, data_len);
  154. HAL_SpiSetCsPin(1);
  155. return ret;
  156. }
  157. void HAL_SpiClockPinReset(void)
  158. {
  159. GPIO_InitTypeDef GPIO_Initure;
  160. __HAL_RCC_GPIOA_CLK_ENABLE();
  161. GPIO_Initure.Pin = SPI1_CLK_PIN;
  162. GPIO_Initure.Mode = GPIO_MODE_INPUT;
  163. GPIO_Initure.Pull = GPIO_PULLUP;
  164. GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
  165. HAL_GPIO_Init(SPI1_CLK_GPIO,&GPIO_Initure);
  166. }
  167. void HAL_SpiCsGpioUninit(void)
  168. {
  169. GPIO_InitTypeDef GPIO_Initure;
  170. __HAL_RCC_GPIOA_CLK_ENABLE();
  171. GPIO_Initure.Pin = SPI1_CS_PIN;
  172. GPIO_Initure.Mode = GPIO_MODE_INPUT;
  173. GPIO_Initure.Pull = GPIO_PULLUP;
  174. GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
  175. HAL_GPIO_Init(SPI1_CS_GPIO,&GPIO_Initure);
  176. HAL_GPIO_WritePin(SPI1_CS_GPIO, SPI1_CS_PIN, GPIO_PIN_RESET);
  177. }