#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); }