20230731_XiaoFuZi_emb/ZheDaXiaoFuZi/Src/Usr/Bsp/McuBspSpi.c

227 lines
8.1 KiB
C
Raw Normal View History

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