注:以下文件进行移植,直接修改SPI.H的引脚,就可以使用了
SPI.C
/*
* softspi.c
*
* Created on: 2024年7月8日
* Author: Administrator
*/
#include "softspi.h"
#include "stdint.h"
#include "softiic.h"
/**
* @brief: 软件模拟SPI初始化
* @return {*}
*/
void bsp_analog_spi_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
/*Configure GPIO pins : PA0 */
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : PA1 */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : PA2 */
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : PA3 */
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
//GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
CS_H;
SCK_L;
}
uint8_t SPI_ReadWriteByte(uint8_t txData)
{
uint8_t i;
uint8_t rxData = 0;
for(i = 0; i < 8; i++)
{
SCK_L;
delay_1us(1);
//数据发送
if(txData & 0x80){
MOSI_H;
}
else{
MOSI_L;
}
txData <<= 1;
delay_1us(1);
SCK_H;
delay_1us(1);
//数据接收
rxData <<= 1;
if(MISO){
rxData |= 0x01;
}
delay_1us(1);
}
SCK_L;
return rxData;
}
uint8_t SPI_ReadByte(void)
{
return SPI_ReadWriteByte(Dummy_Byte);
}
void SPI_WriteByte(uint8_t txData)
{
(void)SPI_ReadWriteByte(txData);
}
SPI.H
/*
* softspi.h
*
* Created on: 2024年7月8日
* Author: Administrator
*/
#include "main.h"
#ifndef INC_SOFTSPI_H_
#define INC_SOFTSPI_H_
//SPI时钟
#define SCK_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
#define SCK_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)
//SPI片选信号
#define CS_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET)
#define CS_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET)
//SPI输出
#define MOSI_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET)
#define MOSI_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET)
//SPI输入
#define MISO HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3)
#define Dummy_Byte 0xFF //读取时MISO发送的数据,可以为任意数据
void bsp_analog_spi_init(void);
uint8_t SPI_ReadWriteByte(uint8_t txData);
void SPI_WriteByte(uint8_t txData);
uint8_t SPI_ReadByte(void);
#endif /* __SOFTSPI_H__ */