STM32 GPIO模拟SPI的实现

用GPIO模拟实现SPI通信,已在STM32平台验证,适用于各种MCU平台,废话不多说,直接上源代码:

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 (c)**************************************************
**                                                      他乡&学子
**                                      
**
**                                 https://mp.csdn.net/postedit/81772857
**
**--------------文件信息--------------------------------------------------------------------------------
**文件名    : spi.c
**创 建人   : 他乡&学子
**创建日期: 2017年6月15日
**描 述       : 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<len;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<len;i++){
        buf[i] = SpiReadByte32();
    }
    
    return 0;
}


 

猜你喜欢

转载自blog.csdn.net/weixin_40779546/article/details/81772857