本文介绍如何使用STM32标准外设库的GPIO端口模拟SPI,本例程使用PA5、PA6和PA7模拟一路SPI。SPI有4种工作模式,模拟SPI使用模式0,即空闲时SCK为低电平,在奇数边沿采样。

本文适合对单片机及C语言有一定基础的开发人员阅读,MCU使用STM32F103VE系列。

1. 简介

SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在要求通讯速率较高的场合。SPI用于多设备之间通讯,分为主机Master和从机Slave,主机只有一个,从机可以有多个,通过片选信号对从机进行选择,一次只能选择一个从机。通讯只能由主机发起,支持的操作分为读取和写入,即主机读取从机的数据,以及向从机写入数据。

SPI一般有4根线,分别是片选线SS、时钟线SCK、主设备输出\从设备输入MOSI、主设备输入\从设备输出MISO,其中除MISO对于主机为输入引脚外,其他引脚对于主机均为输出引脚。因为有独立的输入和输出引脚,因此SPI支持全双工工作模式,即可以同时接收和发送。

2. 总线传输信号

空闲状态:片选信号SS低电平有效,那么空闲状态片选信号SS为高。
开始信号及结束信号:开始信号需要将片选信号SS拉低,结束信号需要将片选信号SS拉高。
通讯模式:SPI有4种通讯模式,分别为0、1、2、3,根据时钟极性和时钟相位确定,时钟极性分别为空闲低电平和空闲高电平,时钟相位分别为SCK奇数边沿采样和偶数边沿采样。常用的模式为模式0和模式3。
SPI模式 时钟极性(空闲时SCK时钟) 时钟相位(采样时刻)
0 低电平 奇数边沿
1 低电平 偶数边沿
2 高电平 奇数边沿
3 高电平 偶数边沿

3. 时序说明

以模式0举例说明:

空闲状态:片选信号SS为高,SCK输出低电平。
开始信号:片选信号SS变低,SCK输出低电平。
结束信号:片选信号SS变高,SCK输出低电平。
读取:SCK由低变高之后,读取MISO引脚信号。
写入:SCK输出低电平,MOSI引脚输出相应的电平,然后SCK输出高电平。
一个时钟周期同时读取和写入:SCK输出低电平,主设备控制MOSI输出相应电平,从设备控制MISO输出相应电平,然后SCK输出高电平,从设备读取MOSI引脚电平,主设备读取MISO引脚电平。即无论主设备还是从设备,均在SCK为低电平时输出信号,在SCK为高电平时读取信号。

4. 初始化

初始化跟普通GPIO类似,SCK和MOSI设置为推挽输出,而MISO设置为浮空输入。

GPIO初始化完成之后,SCK置为低电平,进入空闲状态。

5. 模拟信号

由于SPI支持一个周期内同时读取和写入,因此读取和写入操作可以用一个函数实现,而单独的读取函数和写入函数可以通过调用该读写函数实现。

完整代码(仅自己编写的部分)

#define SPI_SCK_1    GPIO_SetBits(GPIOA, GPIO_Pin_5)            /* SCK = 1 */
#define SPI_SCK_0    GPIO_ResetBits(GPIOA, GPIO_Pin_5)        /* SCK = 0 */#define SPI_MOSI_1    GPIO_SetBits(GPIOA, GPIO_Pin_7)            /* MOSI = 1 */
#define SPI_MOSI_0    GPIO_ResetBits(GPIOA, GPIO_Pin_7)        /* MOSI = 0 */#define SPI_READ_MISO    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)    /* 读MISO口线状态 */#define Dummy_Byte    0xFF    //读取时MISO发送的数据,可以为任意数据//初始化SPI
void SPI_IoInit(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);//CS引脚初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;           //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);//SCK和MOSI引脚初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;           //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//MISO引脚初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;               //浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);SPI_CS_1;SPI_SCK_1;
}//SPI可以同时读取和写入数据,因此一个函数即可满足要求
uint8_t SPI_ReadWriteByte(uint8_t txData)
{uint8_t i;uint8_t rxData = 0;for(i = 0; i < 8; i++){SPI_SCK_0;delay_us(1);//数据发送if(txData & 0x80){SPI_MOSI_1;}else{SPI_MOSI_0;}txData <<= 1;delay_us(1);SPI_SCK_1;delay_us(1);//数据接收rxData <<= 1;if(SPI_READ_MISO){rxData |= 0x01;}delay_us(1);}SPI_SCK_0;return rxData;
}uint8_t SPI_ReadByte(void)
{return SPI_ReadWriteByte(Dummy_Byte);
}void SPI_WriteByte(uint8_t txData)
{(void)SPI_ReadWriteByte(txData);
}

stm32使用gpio模拟spi相关推荐

  1. 用GPIO模拟SPI接口读取传感器数据

    本文基于平头哥开发板RVB2601,简要介绍了用GPIO模拟SPI时序逻辑,实现SPI协议,按照特定温度传感器的时序,读取其数据,及示例程序 一.概述 SPI(Serial Peripheral In ...

  2. 【全志T113-S3_100ask】15-2 linux系统gpio模拟spi驱动屏幕——ILI9341

    [全志T113-S3_100ask]15-2 linux系统gpio模拟spi驱动屏幕--ILI9341 背景 (一)查阅参考文档 (二)使能内核模块 (三)修改设备树 (四)测试 (五)后语 背景 ...

  3. 外设驱动库开发笔记43:GPIO模拟SPI驱动

      SPI总线是我们常用的串行设备接口,一般情况下我们都会适应硬件SPI接口,但有些时候当硬件端口不足时,我们也希望可以使用软件来模拟SPI硬件接口,特别是要求不是很高的时候.在这一篇中我们将来讨论如 ...

  4. STM32 通用GPIO模拟I2C实现

    STM32 通用GPIO模拟I2C实现 通用GPIO模拟I2C通信实现样例 1 GPIO初始化 #ifdef HW_I2C1 //硬件I2C初始化//PA8-I2C1_SCLGPIO_StructIn ...

  5. GPIO模拟SPI通讯接口

    一.SPI总述 SPI 是一种允许一个主设备启动一个与从设备的同步通讯的协议,从而完成数据的交换.也就是说,SPI是一种规定好的通讯方式.这种通信方式的优点是占用端口较少,一般4根就够基本通讯了.同时 ...

  6. SPI总线协议、SPI时序图详解、GPIO模拟SPI

    SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚 ...

  7. TQ2440 GPIO模拟SPI读取AD转换器TLC2543芯片

    其实接触CSDN好久了,一直没有想写自己的博客,遇到问题的时候才去上CSDN参考别人的资料,想到以后不能脚踩西瓜皮,滑倒哪里是哪里,要一个萝卜一个坑,用CSDN博客记录下自己的每一个脚印,一来自己以后 ...

  8. 在ARM Linux下使用GPIO模拟SPI时序详解

    Author:杨正  Data:2016.1.1  Mail:yz2012ww@gmail.com 一.       概述 SPI是英文SerialPeripheral Interface的缩写,顾名 ...

  9. 海思平台gpio模拟spi驱动总结

    1. 海思平台gpio如何映射到编号 #define GPIO_TO_PIN(bank, gpio) (8 * (bank) + (gpio)) 海思gpio引脚每组总是从0~7,而且引脚从头都有唯一 ...

最新文章

  1. UC伯克利博士尤洋回国创业,曾刷新ImageNet纪录!已获超千万融资
  2. ios 团购信息客户端demo(三)
  3. signature=60e238a971088f65081a607ed25e04b3,Healthcare Claims Loss Control Systems And Methods
  4. flex布局一行三个_CSS Flex布局
  5. 第九届蓝桥杯 Java B组 第三题 复数幂 (详解)
  6. Python学习笔记6(列表生成式)
  7. 永冻土层matlab图片,北极圈都32℃了!千年永冻土层快“热化”了?
  8. 程序员未来的职业生涯路该怎么走,如何避免35岁中年危机?
  9. Adidas、金拱门、KFC、乐天玛特,零售巨头的选址秘诀都在数据里了
  10. java二级考试真题_计算机等级考试真题2(JAVA)
  11. 半兽人野性重新觉醒 当初掘金将其放弃 如今野兽感恩回报火箭
  12. HTML5 桌面通知:Notification API的基础用法
  13. Confluence 6 Oracle 创建数据库用户
  14. Linux Ubuntu 安装Tomcat 7,亲测有效
  15. 手机怎么将视频制作成GIF?手机端动态图片制作的方法
  16. python构建电商用户画像(1)
  17. 程序员如何保护自己的头发
  18. 中国设备工程杂志中国设备工程杂志社中国设备工程编辑部2022年第18期目录
  19. [转贴]Debian的汉化步骤【转自http://www.linuxsir.org】
  20. excel如何实现数据钻取

热门文章

  1. Windows 11亮相!商店游戏抽成12%,PC能运行安卓应用
  2. jack server 常见错误解决方法【转】
  3. 2022年中级会计中级经济法考试练习题及答案
  4. Mifare S50读写卡的笔记(RC522源码(待整理)、Mifare控制字等、Mifare卡片结构等)
  5. 商业计划书,没有策划成分,不行
  6. Video Object Segmentation with Adaptive Feature Bank and Uncertain-Region Refinement论文解读和代码实践
  7. 勒索软件:帮派联手,拍卖被盗数据
  8. 第4章编辑css样式,第4章 使用CSS样式.ppt
  9. 《SaltStack技术入门与实践》—— 实践案例 中小型Web架构1 初始化和Haproxy
  10. 数据分析方法和思维—相关性分析法