| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- #include "hal_spi.h"
- #include "delay.h"
- #include "usart.h"
- #include "stm32f1xx_hal_gpio.h"
- #include "stdbool.h"
- #include "board.h"
- #include "sys_log.h"
- static void SPI1_CsPinInit(void);
- static void SPI1_Init(void);
- static void SPI1_EXTI_Init(void);
- static void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler);
- SPI_HandleTypeDef SPI1_Handler;
- static spi_inter_callback_fp g_s_int_callback = NULL;
- /*
- PA5 SPI1_SCK
- PA6 SPI1_MISO
- PA7 SPI1_MOSI
- PA2 CS
- PA0 INT
- */
- void HAL_SpiGpioInit(void)
- {
- SPI1_Init();
- SPI1_SetSpeed(SPI_BAUDRATEPRESCALER_64);
- }
- void HAL_SpiInit(spi_inter_callback_fp fp)
- {
- g_s_int_callback = fp;
- SPI1_CsPinInit();
- SPI1_EXTI_Init();
- HAL_SpiGpioInit();
- }
- void HAL_SpiUnint(void)
- {
- HAL_SPI_DeInit(&SPI1_Handler);
- }
- static void SPI1_CsPinInit(void)
- {
- GPIO_InitTypeDef GPIO_Initure;
- __HAL_RCC_GPIOA_CLK_ENABLE();
- GPIO_Initure.Pin = SPI1_CS_PIN;
- GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_Initure.Pull = GPIO_NOPULL;
- GPIO_Initure.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(SPI1_CS_GPIO, &GPIO_Initure);
- HAL_GPIO_WritePin(SPI1_CS_GPIO, SPI1_CS_PIN, GPIO_PIN_SET);
- }
- void HAL_SpiSetCsPin(bool flag)
- {
- if(flag)
- {
- HAL_GPIO_WritePin(SPI1_CS_GPIO, SPI1_CS_PIN, GPIO_PIN_SET);
- }
- else
- {
- HAL_GPIO_WritePin(SPI1_CS_GPIO, SPI1_CS_PIN, GPIO_PIN_RESET);
- }
- }
- static void SPI1_Init(void)
- {
- SPI1_Handler.Instance = SPI1;
- SPI1_Handler.Init.Mode = SPI_MODE_MASTER;
- SPI1_Handler.Init.Direction = SPI_DIRECTION_2LINES;
- SPI1_Handler.Init.DataSize = SPI_DATASIZE_8BIT;
- SPI1_Handler.Init.CLKPolarity = SPI_POLARITY_HIGH;
- SPI1_Handler.Init.CLKPhase = SPI_PHASE_2EDGE;
- SPI1_Handler.Init.NSS = SPI_NSS_SOFT;
- SPI1_Handler.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
- SPI1_Handler.Init.FirstBit = SPI_FIRSTBIT_MSB;
- SPI1_Handler.Init.TIMode = SPI_TIMODE_DISABLE;
- SPI1_Handler.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
- SPI1_Handler.Init.CRCPolynomial = 10;
- HAL_SPI_Init(&SPI1_Handler);
- __HAL_SPI_ENABLE(&SPI1_Handler);
- }
- void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
- {
- GPIO_InitTypeDef GPIO_Initure;
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_SPI1_CLK_ENABLE();
- GPIO_Initure.Pin = SPI1_CLK_PIN | SPI1_MISO_PIN | SPI1_MOSI_PIN;
- GPIO_Initure.Mode = GPIO_MODE_AF_PP;
- GPIO_Initure.Pull = GPIO_NOPULL;
- GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(SPI1_GPIO, &GPIO_Initure);
- }
- static void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
- {
- assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
- __HAL_SPI_DISABLE(&SPI1_Handler);
- SPI1_Handler.Instance->CR1 &= 0XFFC7;
- SPI1_Handler.Instance->CR1 |= SPI_BaudRatePrescaler;
- __HAL_SPI_ENABLE(&SPI1_Handler);
- }
- static void SPI1_EXTI_Init(void)
- {
- //PA0
- GPIO_InitTypeDef GPIO_Initure;
- __HAL_RCC_GPIOA_CLK_ENABLE();
- GPIO_Initure.Pin = SPI1_INT_PIN;
- GPIO_Initure.Mode = GPIO_MODE_IT_RISING;
- GPIO_Initure.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(SPI1_INT_GPIO, &GPIO_Initure);
- HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 2);
- HAL_NVIC_EnableIRQ(EXTI0_IRQn);
- }
- void EXTI0_IRQHandler(void)
- {
- HAL_GPIO_EXTI_IRQHandler(SPI1_INT_PIN);
- }
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- switch (GPIO_Pin)
- {
- case SPI1_INT_PIN:
- if (g_s_int_callback)
- {
- g_s_int_callback(0);
- }
- break;
- default:
- break;
- }
- }
- static int SPI1_Tx_Data(uint8_t *data, uint8_t data_len)
- {
- if (HAL_SPI_Transmit(&SPI1_Handler, data, data_len, 1000) != HAL_OK)
- {
- return -1;
- }
- return data_len;
- }
- static int SPI1_Rx_Data(uint8_t *data, uint8_t data_len)
- {
- if (HAL_SPI_Receive(&SPI1_Handler, data, data_len, 1000) != HAL_OK)
- {
- return -1;
- }
- return data_len;
- }
- int HAL_SpiTxData(uint8_t *data, uint8_t data_len)
- {
- int ret = 0;
- HAL_SpiSetCsPin(0);
- ret = SPI1_Tx_Data(data, data_len);
- HAL_SpiSetCsPin(1);
- return ret;
- }
- int HAL_SpiRxData(uint8_t *data, uint8_t data_len)
- {
- int ret = 0;
- HAL_SpiSetCsPin(0);
- ret = SPI1_Rx_Data(data, data_len);
- HAL_SpiSetCsPin(1);
- return ret;
- }
- void HAL_SpiClockPinReset(void)
- {
- GPIO_InitTypeDef GPIO_Initure;
-
- __HAL_RCC_GPIOA_CLK_ENABLE();
- GPIO_Initure.Pin = SPI1_CLK_PIN;
- GPIO_Initure.Mode = GPIO_MODE_INPUT;
- GPIO_Initure.Pull = GPIO_PULLUP;
- GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(SPI1_CLK_GPIO,&GPIO_Initure);
- }
- void HAL_SpiCsGpioUninit(void)
- {
- GPIO_InitTypeDef GPIO_Initure;
-
- __HAL_RCC_GPIOA_CLK_ENABLE();
- GPIO_Initure.Pin = SPI1_CS_PIN;
- GPIO_Initure.Mode = GPIO_MODE_INPUT;
- GPIO_Initure.Pull = GPIO_PULLUP;
- GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(SPI1_CS_GPIO,&GPIO_Initure);
- HAL_GPIO_WritePin(SPI1_CS_GPIO, SPI1_CS_PIN, GPIO_PIN_RESET);
- }
|