用GPIO模拟实现SPI通信,已在STM32平台验证,适用于各种MCU平台,废话不多说,直接上源代码:
远程抓娃娃APP找上海捌跃网络科技有限公司
spi.h
#ifndef __SPI_H
#define __SPI_H
#include “stm32l0xx.h”
#ifdef SPI_GLOBALS
#define SPI_EXT
#else
#define SPI_EXT extern
#endif
#define M_CS_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET)
#define M_CS_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET)
#define S_CS_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)
#define S_CS_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
#define SCLK_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)
#define SCLK_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
#define MOSI_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET)
#define MOSI_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
#define MISO HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7)
SPI_EXT uint32_t SpiSendByte32(uint32_t data);
SPI_EXT uint32_t SpiSendBytes32(uint32_t *buf,uint16_t len);
SPI_EXT uint32_t SpiReadBytes32(uint32_t *buf,uint16_t len);
#endif
spi.c
/Copyright ©**********
**描 述 : STM32平台gpio模拟SPI通信实现
**
********************************************************************************************************/
#define SPI_GLOBALS
#include “string.h”
#include “spi.h”
/*******************************************************************************
函数名称: uint32_t SpiSendByte32(uint32_t data)
函数功能: 发送一个32位字
函数说明: gpio模拟spi
输入参数: data 待发送字
输出参数:
返回值 : 接收一个32位字
*******************************************************************************/
uint32_t SpiSendByte32(uint32_t data)
{
uint8_t i = 0;
uint32_t temp=0x00000000;
for(i=32;i>0;i–){
if(data&0x80000000){ //if((data&0x80000000) == 0x80000000){
GPIOA->BSRR = GPIO_PIN_6;//MOSI_H;//写1
}else{
GPIOA->BRR = GPIO_PIN_6;//MOSI_L;//写0
}
data<<=1;//高位在前
GPIOA->BSRR = GPIO_PIN_5;//SCLK_H;//sck高
temp<<=1;
if(MISO ==1){
temp++;//读到1
}
GPIOA->BRR = GPIO_PIN_5;//SCLK_L;//sck低
}
return temp;
}
/*******************************************************************************
函数名称: uint32_t SpiSendBytes32(uint32_t *buf,uint16_t len)
函数功能: 发送多个32位字
函数说明: gpio模拟spi
输入参数:
输出参数:
返回值 :
*******************************************************************************/
uint32_t SpiSendBytes32(uint32_t *buf,uint16_t len)
{
uint16_t i;
for(i=0;i
SpiSendByte32(buf[i]);
}
return 0;
}
/*******************************************************************************
函数名称: uint32_t SpiReadByte32(void)
函数功能: 读一个32位字
函数说明: gpio模拟spi
输入参数:
输出参数:
返回值 :
/
uint32_t SpiReadByte32(void)
{
return SpiSendByte32(0);
}
/
函数名称: uint8_t Spi1ReadBytes(void)
函数功能: 读多个32位字
函数说明: gpio模拟spi
输入参数:
输出参数:
返回值 :
*******************************************************************************/
uint32_t SpiReadBytes32(uint32_t *buf,uint16_t len)
{
uint16_t i;
for(i=0;i
buf[i] = SpiReadByte32();
}
return 0;
}
网友评论