#include "McuBspSpi.h" static SPI_HandleTypeDef gSpiHandle3; unsigned char gSpi3InitFlag = 0; int McuBspSpiInit(unsigned char SpiId) { if (SpiId == MCU_BSP_SPI3_ID) { if (MCU_BSP_SPI3_USE_FLAG == 0) { return -1; } if (gSpi3InitFlag == 1) { return 0; } gSpiHandle3.Instance = SPI3; gSpiHandle3.Init.BaudRatePrescaler = MCU_BSP_SPI3_BAUDRATEPRESCALER; gSpiHandle3.Init.Direction = MCU_BSP_SPI3_DIRECTION; gSpiHandle3.Init.CLKPhase = MCU_BSP_SPI3_CLKPHASE; gSpiHandle3.Init.CLKPolarity = MCU_BSP_SPI3_CLKPOLARITY; gSpiHandle3.Init.DataSize = MCU_BSP_SPI3_DATASIZE; gSpiHandle3.Init.FirstBit = MCU_BSP_SPI3_FIRSTBIT; gSpiHandle3.Init.TIMode = MCU_BSP_SPI3_TIMODE; gSpiHandle3.Init.CRCCalculation = MCU_BSP_SPI3_CRCCALCULATION; gSpiHandle3.Init.CRCPolynomial = MCU_BSP_SPI3_CRCPOLYNOMIAL; gSpiHandle3.Init.NSS = MCU_BSP_SPI3_NSS; gSpiHandle3.Init.Mode = MCU_BSP_SPI3_MODE; if(HAL_SPI_DeInit(&gSpiHandle3) != HAL_OK) { return -1; } if(HAL_SPI_Init(&gSpiHandle3) != HAL_OK) { return -1; } gSpi3InitFlag = 1; } else { return -1; } return 0; } /* SPI的读写 */ unsigned char McuBspSpiReadWriteByte(uint8_t SpiId, uint8_t Data) { uint8_t RxData; if (SpiId == MCU_BSP_SPI3_ID) { if (MCU_BSP_SPI3_USE_FLAG == 0) { return 0; } while (gSpiHandle3.State != HAL_SPI_STATE_READY) { } HAL_SPI_TransmitReceive_IT(&gSpiHandle3, &Data, &RxData, 1); while (gSpiHandle3.State != HAL_SPI_STATE_READY) { } } return RxData; } /* 设置通信速度 */ int McuBspSpiSetSpeed(uint8_t SpiId, uint8_t mode) { if (SpiId == MCU_BSP_SPI3_ID) { if (MCU_BSP_SPI3_USE_FLAG == 0) { return -1; } if (mode == MCU_BSP_SPI_SPEED_MODE_HIGH) { gSpiHandle3.Instance->CR1 &= 0xffffffc7; gSpiHandle3.Instance->CR1 |= SPI_BAUDRATEPRESCALER_4; } else if (mode == MCU_BSP_SPI_SPEED_MODE_MEDIUM) { gSpiHandle3.Instance->CR1 &= 0xffffffc7; gSpiHandle3.Instance->CR1 |= SPI_BAUDRATEPRESCALER_32; } else if (mode == MCU_BSP_SPI_SPEED_MODE_LOW) { gSpiHandle3.Instance->CR1 &= 0xffffffc7; gSpiHandle3.Instance->CR1 |= SPI_BAUDRATEPRESCALER_128; } else { return -1; } } else { return -1; } return 0; } /* CS片选 */ void McuBspSpiCs(uint8_t SpiId, uint8_t flag) { if (SpiId == MCU_BSP_SPI3_ID) { if (MCU_BSP_SPI3_USE_FLAG == 0) { return; } HAL_GPIO_WritePin(MCU_BSP_SPI3_CS_GPIO, MCU_BSP_SPI3_CS_PIN, (GPIO_PinState)flag); } } void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) { GPIO_InitTypeDef GPIO_InitStruct; if (hspi->Instance == SPI3) { __HAL_RCC_SPI3_CLK_ENABLE(); MCU_BSP_SPI3_SCK_CLK_ENABLE(); MCU_BSP_SPI3_MISO_CLK_ENABLE(); MCU_BSP_SPI3_MOSI_CLK_ENABLE(); MCU_BSP_SPI3_CS_CLK_ENABLE(); /* SPI SCK GPIO pin configuration */ GPIO_InitStruct.Pin = MCU_BSP_SPI3_SCK_PIN; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = MCU_BSP_SPI3_SCK_PIN_PULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(MCU_BSP_SPI3_SCK_GPIO, &GPIO_InitStruct); /* SPI MISO GPIO pin configuration */ GPIO_InitStruct.Pin = MCU_BSP_SPI3_MISO_PIN; GPIO_InitStruct.Pull = MCU_BSP_SPI3_MISO_PIN_PULL; HAL_GPIO_Init(MCU_BSP_SPI3_MISO_GPIO, &GPIO_InitStruct); /* SPI MOSI GPIO pin configuration */ GPIO_InitStruct.Pin = MCU_BSP_SPI3_MOSI_PIN; GPIO_InitStruct.Pull = MCU_BSP_SPI3_MOSI_PIN_PULL; HAL_GPIO_Init(MCU_BSP_SPI3_MOSI_GPIO, &GPIO_InitStruct); /* SPI NSS GPIO pin configuration */ GPIO_InitStruct.Pin = MCU_BSP_SPI3_CS_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = MCU_BSP_SPI3_CS_PIN_PULL; HAL_GPIO_Init(MCU_BSP_SPI3_CS_GPIO, &GPIO_InitStruct); /*##-3- Configure the NVIC for SPI #########################################*/ /* NVIC for SPI */ HAL_NVIC_SetPriority(SPI3_IRQn, 1, 0); HAL_NVIC_EnableIRQ(SPI3_IRQn); } } void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) { if (hspi->Instance == SPI3) { __HAL_RCC_SPI3_CLK_DISABLE(); HAL_GPIO_DeInit(MCU_BSP_SPI3_SCK_GPIO, MCU_BSP_SPI3_SCK_PIN); HAL_GPIO_DeInit(MCU_BSP_SPI3_MISO_GPIO, MCU_BSP_SPI3_MISO_PIN); HAL_GPIO_DeInit(MCU_BSP_SPI3_MOSI_GPIO, MCU_BSP_SPI3_MOSI_PIN); HAL_GPIO_DeInit(MCU_BSP_SPI3_CS_GPIO, MCU_BSP_SPI3_CS_PIN); HAL_NVIC_DisableIRQ(SPI3_IRQn); gSpi3InitFlag = 0; } } /* SPI SLEEP */ void McuBspSpiSleep(void) { GPIO_InitTypeDef GPIO_InitStruct; if (MCU_BSP_SPI3_USE_FLAG == 1) { if (gSpi3InitFlag == 1) { __HAL_RCC_SPI3_CLK_DISABLE(); HAL_NVIC_DisableIRQ(SPI3_IRQn); } MCU_BSP_SPI3_SCK_CLK_ENABLE(); MCU_BSP_SPI3_MISO_CLK_ENABLE(); MCU_BSP_SPI3_MOSI_CLK_ENABLE(); MCU_BSP_SPI3_CS_CLK_ENABLE(); /* SPI SCK GPIO pin configuration */ GPIO_InitStruct.Pin = MCU_BSP_SPI3_SCK_PIN; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(MCU_BSP_SPI3_SCK_GPIO, &GPIO_InitStruct); /* SPI MISO GPIO pin configuration */ GPIO_InitStruct.Pin = MCU_BSP_SPI3_MISO_PIN; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(MCU_BSP_SPI3_MISO_GPIO, &GPIO_InitStruct); /* SPI MOSI GPIO pin configuration */ GPIO_InitStruct.Pin = MCU_BSP_SPI3_MOSI_PIN; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(MCU_BSP_SPI3_MOSI_GPIO, &GPIO_InitStruct); /* SPI NSS GPIO pin configuration */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pin = MCU_BSP_SPI3_CS_PIN; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(MCU_BSP_SPI3_CS_GPIO, &GPIO_InitStruct); HAL_GPIO_WritePin(MCU_BSP_SPI3_CS_GPIO, MCU_BSP_SPI3_CS_PIN, GPIO_PIN_SET); } } /* SPI WakeUp */ void McuBspSpiWakeUp(void) { GPIO_InitTypeDef GPIO_InitStruct; if (MCU_BSP_SPI3_USE_FLAG == 1) { if (gSpi3InitFlag == 1) { MCU_BSP_SPI3_SCK_CLK_ENABLE(); MCU_BSP_SPI3_MISO_CLK_ENABLE(); MCU_BSP_SPI3_MOSI_CLK_ENABLE(); MCU_BSP_SPI3_CS_CLK_ENABLE(); /* SPI SCK GPIO pin configuration */ GPIO_InitStruct.Pin = MCU_BSP_SPI3_SCK_PIN; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = MCU_BSP_SPI3_SCK_PIN_PULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(MCU_BSP_SPI3_SCK_GPIO, &GPIO_InitStruct); /* SPI MISO GPIO pin configuration */ GPIO_InitStruct.Pin = MCU_BSP_SPI3_MISO_PIN; GPIO_InitStruct.Pull = MCU_BSP_SPI3_MISO_PIN_PULL; HAL_GPIO_Init(MCU_BSP_SPI3_MISO_GPIO, &GPIO_InitStruct); /* SPI MOSI GPIO pin configuration */ GPIO_InitStruct.Pin = MCU_BSP_SPI3_MOSI_PIN; GPIO_InitStruct.Pull = MCU_BSP_SPI3_MOSI_PIN_PULL; HAL_GPIO_Init(MCU_BSP_SPI3_MOSI_GPIO, &GPIO_InitStruct); /* SPI NSS GPIO pin configuration */ GPIO_InitStruct.Pin = MCU_BSP_SPI3_CS_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = MCU_BSP_SPI3_CS_PIN_PULL; HAL_GPIO_Init(MCU_BSP_SPI3_CS_GPIO, &GPIO_InitStruct); __HAL_RCC_SPI3_CLK_ENABLE(); HAL_NVIC_EnableIRQ(SPI3_IRQn); } } } /* SPI 3中断 */ void SPI3_IRQHandler(void) { HAL_SPI_IRQHandler(&gSpiHandle3); }