zoukankan      html  css  js  c++  java
  • GPIO模拟SPI通信

    版权声明:本文为CSDN博主「他乡&学子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_40779546/article/details/81772857

    这位作者写的很好,转载过来

    用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 spi_send_byte32(uint32_t data);
    SPI_EXT uint32_t spi_send_bytes32(uint32_t *buf,uint16_t len);
    SPI_EXT uint32_t spi_read_bytes32(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 spi_send_byte32(uint32_t data) 
    * 函数功能:  发送一个32位字
    * 函数说明:  gpio模拟spi
    * 输入参数:  data 待发送字
    * 输出参数:  
    * 返回值    :  接收一个32位字
    *******************************************************************************/ 
    uint32_t spi_send_byte32(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 spi_send_bytes32(uint32_t *buf,uint16_t len)
    * 函数功能:  发送多个32位字
    * 函数说明:  gpio模拟spi
    * 输入参数:  
    * 输出参数:  
    * 返回值    :  
    *******************************************************************************/ 
    uint32_t spi_send_bytes32(uint32_t *buf,uint16_t len)
    {
        uint16_t i;
        
        for(i=0;i<len;i++){
            spi_send_byte32(buf[i]);
        }
        
        return 0;
    }
    /*******************************************************************************
    * 函数名称:  uint32_t spi_read_byte32(void)
    * 函数功能:  读一个32位字
    * 函数说明:  gpio模拟spi
    * 输入参数:  
    * 输出参数:  
    * 返回值    :  
    *******************************************************************************/ 
    uint32_t spi_read_byte32(void)
    {
      return spi_send_byte32(0);
    }
    /*******************************************************************************
    * 函数名称:  uint32_t spi_read_bytes32(void)
    * 函数功能:  读多个32位字
    * 函数说明:  gpio模拟spi
    * 输入参数:  
    * 输出参数:  
    * 返回值  :  
    *******************************************************************************/
    uint32_t spi_read_bytes32(uint32_t *buf,uint16_t len)
    {
        uint16_t i;
        
        for(i=0;i<len;i++){
            buf[i] = spi_read_byte32();
        }
        
        return 0;
    }


    ————————————————
    版权声明:本文为CSDN博主「他乡&amp;学子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_40779546/article/details/81772857

  • 相关阅读:
    爬过的第一个坑
    Ecshop后台邮件群发
    ECShop 首页调用积分商城里面的的商品
    隐藏select右边的箭头按钮
    让IE6支持PNG透明图片
    PHP替换函数,一些正则!
    php判断终端是手机还是电脑访问网站代码
    ECshop在文章列表页调用文章简介
    Ecshop删除no_license点击查看 云登陆失败,您未有license
    Ecshop商品相册鼠标经过小图切换显示大图
  • 原文地址:https://www.cnblogs.com/yinseyingji/p/14516791.html
Copyright © 2011-2022 走看看