首页 > 其他分享 >Alkaitu:STM32的IO模拟SPI

Alkaitu:STM32的IO模拟SPI

时间:2023-04-10 12:23:32浏览次数:41  
标签:SET Pin spi STM32 SPI user IO GPIO Alkaitu

 #include "user_spi.h"
#include "stm32f10x.h"
#include "user_config.h"


/*移植需改动六处*/


/***************************************************************/
/*挂在是SPI总线上的外设的个数和延迟时间,移植修改第一处*/
/***************************************************************/
#define SPI_NUM_ALL 1
#define SPI_DELAY_TIME 0
/***************************************************************/

/*SPI的SCK引脚电平设置,移植修改第二处*/
/***************************************************************/
#define SPI_SCK_SET_1       GPIO_SetBits(GPIOE, GPIO_Pin_6)
#define SPI_SCK_SET_0       GPIO_ResetBits(GPIOE, GPIO_Pin_6)
/***************************************************************/

/*SPI的MOSI引脚电平设置,输出引脚,移植修改第三处*/
/***************************************************************/
#define SPI_MOSI_SET_1       GPIO_SetBits(GPIOE, GPIO_Pin_4)
#define SPI_MOSI_SET_0       GPIO_ResetBits(GPIOE, GPIO_Pin_4)
/***************************************************************/

/*SPI的MISO引脚电平设置,输入引脚,移植修改第四处*/
/***************************************************************/
#define SPI_MISO_READ  GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14)
/***************************************************************/

/*SPI的CS引脚电平设置,移植修改第五处*/
/***************************************************************/
#define SPI_CS1_SET_1       GPIO_SetBits(GPIOE, GPIO_Pin_0)
#define SPI_CS1_SET_0       GPIO_ResetBits(GPIOE, GPIO_Pin_0)

#if SPI_NUM_ALL > 1
#define SPI_CS2_SET_1       GPIO_SetBits(GPIOB, GPIO_Pin_12)
#define SPI_CS2_SET_0       GPIO_ResetBits(GPIOB, GPIO_Pin_12)
#endif

#if SPI_NUM_ALL > 2
#define SPI_CS3_SET_1       GPIO_SetBits(GPIOB, GPIO_Pin_12)
#define SPI_CS3_SET_0       GPIO_ResetBits(GPIOB, GPIO_Pin_12)
#endif

#if SPI_NUM_ALL > 3
#define SPI_CS4_SET_1       GPIO_SetBits(GPIOB, GPIO_Pin_12)
#define SPI_CS4_SET_0       GPIO_ResetBits(GPIOB, GPIO_Pin_12)
#endif
/***************************************************************/


/***************************************************************************/
/*SPI引脚初始化,移植修改第六处*/
/***************************************************************************/
void user_spi_init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_2 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/***************************************************************************/


/***************************************************************/
/*SPI的SCK引脚设置*/
/***************************************************************/
void spi_sck_set(unsigned char IOvalue)
{
  if(IOvalue != 0)
    {SPI_SCK_SET_1;user_delay_us(SPI_DELAY_TIME);}
    else{SPI_SCK_SET_0;user_delay_us(SPI_DELAY_TIME);}
}
/***************************************************************/


/***************************************************************/
/*SPI的MOSI引脚设置*/
/***************************************************************/
void spi_mosi_set(unsigned char IOvalue)
{
    if(IOvalue != 0){SPI_MOSI_SET_1;user_delay_us(SPI_DELAY_TIME);}
    else{SPI_MOSI_SET_0;user_delay_us(SPI_DELAY_TIME);}
}
/***************************************************************/


/***************************************************************/
/*SPI的MISO引脚设置*/
/***************************************************************/
unsigned char spi_miso_read(void)
{
  unsigned char bit_value;
  bit_value = SPI_MISO_READ;
    user_delay_us(SPI_DELAY_TIME);
    return bit_value;
}
/***************************************************************/


/***************************************************************/
/*SPI起始信号*/
/***************************************************************/
void user_spi_start(unsigned char spi_id)
{
  switch(spi_id)
    {
      case 1: SPI_CS1_SET_0;user_delay_us(SPI_DELAY_TIME);break;
        
        #if SPI_NUM_ALL > 1
        case 2: SPI_CS2_SET_0;user_delay_us(SPI_DELAY_TIME);break;
    #endif

    #if SPI_NUM_ALL > 2
        case 3: SPI_CS3_SET_0;user_delay_us(SPI_DELAY_TIME);break;
    #endif

    #if SPI_NUM_ALL > 3
        case 4: SPI_CS4_SET_0;user_delay_us(SPI_DELAY_TIME);break;
    #endif
    }
}
/***************************************************************/


/***************************************************************/
/*SPI停止信号*/
/***************************************************************/
void user_spi_stop(unsigned char spi_id)
{
  switch(spi_id)
    {
      case 1: SPI_CS1_SET_1;user_delay_us(SPI_DELAY_TIME);break;
        
        #if SPI_NUM_ALL > 1
        case 2: SPI_CS2_SET_1;user_delay_us(SPI_DELAY_TIME);break;
    #endif

    #if SPI_NUM_ALL > 2
        case 3: SPI_CS3_SET_1;user_delay_us(SPI_DELAY_TIME);break;
    #endif

    #if SPI_NUM_ALL > 3
        case 4: SPI_CS4_SET_1;user_delay_us(SPI_DELAY_TIME);break;
    #endif
    }
}
/***************************************************************/


/************************************************************************************************/
/*SPI移位寄存器收发一个字节数据*/
/************************************************************************************************/
unsigned char user_spi_swap_byte(unsigned char send_byte)
{
  unsigned char i,receice_byte = 0x00;
    for(i = 0;i < 8;i++)
    {
      if((send_byte & (0x80 >> i)) != 0){spi_mosi_set(1);}else{spi_mosi_set(0);}
        spi_sck_set(1);
        if(spi_miso_read() != 0){receice_byte |= (0x80 >> i);}else{receice_byte &= (~(0x80 >> i));}
        spi_sck_set(0);
    }
    return receice_byte; 
}
/***********************************************************************************************/
#ifndef _user_spi_h_
#define _user_spi_h_

/*头文件移植无需改动*/

/*************************************************************************/
/*SPI引脚初始化函数,移植需在.C文件改动*/
/*************************************************************************/

void user_spi_init(void);

/*************************************************************************/



/***********************************************************************/
/*移植无需改动,函数实现SPI的脚位电平设置,无需改动*/
/***********************************************************************/

void spi_sck_set(unsigned char IOvalue);
void spi_mosi_set(unsigned char IOvalue);
unsigned char spi_miso_read(void);

/***********************************************************************/

/***********************************************************************/
/*实际IO模拟主要引用这三个函数,无需改动*/
/***********************************************************************/

void user_spi_start(unsigned char spi_id);
void user_spi_stop(unsigned char spi_id);
unsigned char user_spi_swap_byte(unsigned char send_byte);

/***********************************************************************/
#endif

 

标签:SET,Pin,spi,STM32,SPI,user,IO,GPIO,Alkaitu
From: https://www.cnblogs.com/Alkiatu/p/17302534.html

相关文章

  • 第5章 使用路由将URL映射到Razor Pages(ASP.NET Core in Action, 2nd Edition)
    本章包括(请点击这里阅读其他章节)将URL映射到Razor页面使用约束和默认值匹配URL从路由参数生成URL在第4章中,您了解了MVC设计模式,以及ASP.NETCore如何使用它为使用RazorPages的应用程序生成UI。RazorPages包含类似小型控制器的页面处理程序。页面处理程序......
  • 第6章 绑定模型:检索和验证用户输入(ASP.NET in Action, 2nd Edition)
    本章包括使用请求值创建绑定模型自定义模型绑定过程使用DataAnnotations属性验证用户输入在第5章中,我向您展示了如何使用参数定义路由——可能是日历中的当天,也可能是产品页面的唯一ID。但是,如果用户请求一个给定的产品页面,那么呢?类似地,如果请求包含表单中的数据,例如更改产......
  • 第4章 使用Razor Pages创建网站(ASP.NET Core in Action, 2nd Edition)
    本章重点(请点击这里阅读其他章节)RazorPages和模型-视图-控制器(MVC)设计模式简介在ASP.NETCore中使用RazorPages在RazorPages和MVC控制器之间进行选择使用Action结果控制应用程序流通过第3章您已经了解了中间件管道,它定义了ASP.NETCore应用程序如何响应请......
  • 第1章 开始使用ASP.NET Core(ASP.NET Core in Action, 2nd Edition)
    第1部分ASP.NETCore入门如今,从社交媒体Web应用程序、新闻网站到手机应用程序,电子商务应用程序无处不在。在幕后,几乎总是有一台服务器在运行Web应用程序或HTTPAPI。Web应用程序具有无限的可扩展性、部署到云上以及高性能。在最好的情况下,开始可能会让人不知所措,带着如此......
  • C# System.lnvalidOperationException:"A second operation started on this context
    项目中使用了依赖注入,这个错误在我项目中的原因:在async修饰的异步方法中,调用执行数据库操作的方法时,没有使用await关键字调用,因为没有等待该调用,所以在调用完成之前将继续执行该方法。因此,已处理了注入的依赖项。......
  • ios的百度网盘web版本视频播放器的字幕插件功能
    详情见https://coding.net/u/qidizi/p/pan.baidu.com.srt.plugin/git这里放一张效果图。......
  • oracle导出impdp导入已存在表设置TABLE_EXISTS_ACTION参数
    目录oracle导出impdp导入已存在表设置TABLE_EXISTS_ACTION参数1、TABLE_EXISTS_ACTION参数说明2、使用示例oracle导出impdp导入已存在表设置TABLE_EXISTS_ACTION参数1、TABLE_EXISTS_ACTION参数说明有四个参数:skip:默认操作,跳过已存在的表不做处理。append:在原有的数据上追加......
  • Abnormal build process termination--解决IDEA启动web项目报错
    在projectstructure中,把sdk中的jdk重新添加,却发现选择了正确的jdk目录却提示不是正确的jdk路径。于是,我重新安装了jdk。在idea中又重新引了jdk。这个问题就解决了。所以有时候当你一直运行正确的时候,突然发现有问题了。可能就是近期修改的东西导致的。基本就是jdk的问题  把......
  • GhostDoc Enterprise.v2022.2.22190.VS2017-VS2022.Extension安装包分享
    这个网站似乎是屏蔽了中国大陆和中国香港的IP,不知道怎么想的。似乎是有点看不起我们?原版安装包v2022.2.22190,支持vs2017到vs2022,可以通过百度网盘下载。链接:https://pan.baidu.com/s/13hrjHHn_51RDUMiIcylu-A?pwd=dxym提取码:dxym -------------------------------------......
  • 一统天下 flutter - widget 列表类: ExpansionTile - 列表项(可展开)
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget列表类:ExpansionTile-列表项(可展开)示例如下:lib\widget\list\expansion_tile.dart/**ExpansionTile-列表项(可展开)*/import'package:flutter/material.dart'......