SoftSPI_HAL_Lib/softspi.c

199 lines
4.6 KiB
C
Raw Permalink Normal View History

2021-10-12 12:11:33 +08:00
/**
* @file softspi.c
* @author Myth
2021-10-12 18:07:30 +08:00
* @version 0.2
2021-10-12 12:11:33 +08:00
* @date 2021.10.12
* @brief STM32 SoftSPI Library
*/
#include "softspi.h"
2021-10-12 18:07:30 +08:00
#define SCLK_Set HAL_GPIO_WritePin(SoftSPIx->SCLK_GPIO, SoftSPIx->SCLK_Pin, GPIO_PIN_SET)
#define SCLK_Clr HAL_GPIO_WritePin(SoftSPIx->SCLK_GPIO, SoftSPIx->SCLK_Pin, GPIO_PIN_RESET)
2021-10-12 12:11:33 +08:00
2021-10-12 18:07:30 +08:00
#define MOSI_Set HAL_GPIO_WritePin(SoftSPIx->MOSI_GPIO, SoftSPIx->MOSI_Pin, GPIO_PIN_SET)
#define MOSI_Clr HAL_GPIO_WritePin(SoftSPIx->MOSI_GPIO, SoftSPIx->MOSI_Pin, GPIO_PIN_RESET)
2021-10-12 12:11:33 +08:00
2021-10-12 18:07:30 +08:00
#define MISO_Read HAL_GPIO_ReadPin(SoftSPIx->MISO_GPIO, SoftSPIx->MISO_Pin)
#define SS_Set HAL_GPIO_WritePin(SoftSPIx->SS_GPIO, SoftSPIx->SS_Pin, GPIO_PIN_SET)
#define SS_Clr HAL_GPIO_WritePin(SoftSPIx->SS_GPIO, SoftSPIx->SS_Pin, GPIO_PIN_RESET)
#define Delay SoftSPI_Delay_us(SoftSPIx->Delay_Time)
uint8_t SoftSPI_GPIOx_Pin_Init(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode, uint32_t Pull);
HAL_StatusTypeDef SoftSPI_Init(SoftSPI_TypeDef *SoftSPIx)
2021-10-12 12:11:33 +08:00
{
2021-10-12 18:07:30 +08:00
SoftSPIx->SCLK_GPIO = SoftSPIx->SCLK_GPIO;
SoftSPIx->SCLK_Pin = SoftSPIx->SCLK_Pin;
2021-10-12 12:11:33 +08:00
2021-10-12 18:07:30 +08:00
if (!SoftSPI_GPIOx_Pin_Init(SoftSPIx->SCLK_GPIO, SoftSPIx->SCLK_Pin, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL))
2021-10-12 12:11:33 +08:00
return HAL_ERROR;
2021-10-12 18:07:30 +08:00
SoftSPIx->MOSI_GPIO = SoftSPIx->MOSI_GPIO;
SoftSPIx->MOSI_Pin = SoftSPIx->MOSI_Pin;
2021-10-12 12:11:33 +08:00
2021-10-12 18:07:30 +08:00
if (!SoftSPI_GPIOx_Pin_Init(SoftSPIx->MOSI_GPIO, SoftSPIx->MOSI_Pin, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL))
2021-10-12 12:11:33 +08:00
return HAL_ERROR;
2021-10-12 18:07:30 +08:00
SoftSPIx->MISO_GPIO = SoftSPIx->MISO_GPIO;
SoftSPIx->MISO_Pin = SoftSPIx->MISO_Pin;
2021-10-12 12:11:33 +08:00
2021-10-12 18:07:30 +08:00
if (!SoftSPI_GPIOx_Pin_Init(SoftSPIx->MISO_GPIO, SoftSPIx->MISO_Pin, GPIO_MODE_INPUT, GPIO_PULLUP))
2021-10-12 12:11:33 +08:00
return HAL_ERROR;
2021-10-12 18:07:30 +08:00
SoftSPIx->SS_GPIO = SoftSPIx->SS_GPIO;
SoftSPIx->SS_Pin = SoftSPIx->SS_Pin;
2021-10-12 12:11:33 +08:00
2021-10-12 18:07:30 +08:00
if (!SoftSPI_GPIOx_Pin_Init(SoftSPIx->SS_GPIO, SoftSPIx->SS_Pin, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL))
2021-10-12 12:11:33 +08:00
return HAL_ERROR;
2021-10-12 18:07:30 +08:00
SoftSPIx->Delay_Time = SoftSPIx->Delay_Time;
2021-10-12 12:11:33 +08:00
return HAL_OK;
}
void SoftSPI_SetSS(SoftSPI_TypeDef *SoftSPIx)
{
SS_Set;
}
void SoftSPI_ClrSS(SoftSPI_TypeDef *SoftSPIx)
{
SS_Clr;
}
2021-10-12 18:07:30 +08:00
uint8_t SoftSPI_WriteRead(SoftSPI_TypeDef *SoftSPIx, uint8_t byte)
2021-10-12 12:11:33 +08:00
{
uint8_t data = 0;
uint8_t i;
for (i = 0; i < 8; i++)
{
2021-10-12 18:07:30 +08:00
SCLK_Clr;
Delay;
2021-10-12 12:11:33 +08:00
if (byte & 0x80)
2021-10-12 18:07:30 +08:00
MOSI_Set;
2021-10-12 12:11:33 +08:00
else
2021-10-12 18:07:30 +08:00
MOSI_Clr;
2021-10-12 12:11:33 +08:00
2021-10-12 18:07:30 +08:00
Delay;
2021-10-12 12:11:33 +08:00
byte <<= 1;
2021-10-12 18:07:30 +08:00
SCLK_Set;
Delay;
2021-10-12 12:11:33 +08:00
data <<= 1;
2021-10-12 18:07:30 +08:00
if (MISO_Read == GPIO_PIN_SET)
2021-10-12 12:11:33 +08:00
data |= 0x01;
2021-10-12 18:07:30 +08:00
Delay;
2021-10-12 12:11:33 +08:00
}
return data;
}
2021-10-12 18:07:30 +08:00
void SoftSPI_WriteReadBuff(SoftSPI_TypeDef *SoftSPIx, uint8_t *pWrite, uint8_t *pRead, uint32_t len)
2021-10-12 12:11:33 +08:00
{
uint8_t data;
uint8_t byte;
uint8_t i, j;
for (j = 0; j < len; j++)
{
data = 0;
byte = pWrite[j];
for (i = 0; i < 8; i++)
{
2021-10-12 18:07:30 +08:00
SCLK_Clr;
Delay;
2021-10-12 12:11:33 +08:00
if (byte & 0x80)
2021-10-12 18:07:30 +08:00
MOSI_Set;
2021-10-12 12:11:33 +08:00
else
2021-10-12 18:07:30 +08:00
MOSI_Clr;
2021-10-12 12:11:33 +08:00
2021-10-12 18:07:30 +08:00
Delay;
2021-10-12 12:11:33 +08:00
byte <<= 1;
2021-10-12 18:07:30 +08:00
SCLK_Set;
Delay;
2021-10-12 12:11:33 +08:00
data <<= 1;
2021-10-12 18:07:30 +08:00
if (MISO_Read == GPIO_PIN_SET)
2021-10-12 12:11:33 +08:00
data |= 0x01;
2021-10-12 18:07:30 +08:00
Delay;
2021-10-12 12:11:33 +08:00
}
pRead[j] = data;
}
}
2021-10-12 18:07:30 +08:00
uint8_t SoftSPI_GPIOx_Pin_Init(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode, uint32_t Pull)
2021-10-12 12:11:33 +08:00
{
switch ((uint32_t)(GPIOx))
{
case (uint32_t)GPIOA:
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_Initure.Pin = Pin;
GPIO_Initure.Mode = Mode;
GPIO_Initure.Pull = Pull;
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_Initure);
}
break;
case (uint32_t)GPIOB:
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_Initure.Pin = Pin;
GPIO_Initure.Mode = Mode;
GPIO_Initure.Pull = Pull;
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_Initure);
}
break;
case (uint32_t)GPIOC:
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_Initure.Pin = Pin;
GPIO_Initure.Mode = Mode;
GPIO_Initure.Pull = Pull;
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_Initure);
}
break;
case (uint32_t)GPIOD:
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOD_CLK_ENABLE();
GPIO_Initure.Pin = Pin;
GPIO_Initure.Mode = Mode;
GPIO_Initure.Pull = Pull;
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_Initure);
}
break;
default:
return 0;
}
return 1;
}