237 lines
8.3 KiB
C
237 lines
8.3 KiB
C
|
|
#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;
|
||
|
|
}
|
||
|
|
|
||
|
|
int McuBspSpiDeInit(uint8_t SpiId)
|
||
|
|
{
|
||
|
|
if (SpiId == MCU_BSP_SPI3_ID) {
|
||
|
|
if(HAL_SPI_DeInit(&gSpiHandle3) != HAL_OK) {
|
||
|
|
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);
|
||
|
|
}
|
||
|
|
|