SPI协议代码

article/2025/8/26 20:51:50

软件模拟SPI程序代码

文章目录

    • SPI协议简介
      • ●SPI接口介绍
      • ●SPI数据传输方向
      • ●SPI传输模式
    • 通过两个单片机模拟SPI来加深理解
      • ※硬件连接方式
      • ✯SPI模式
      • ✯程序思路
      • ✯主机C代码+波形
      • ✯从机C代码+波形


概述:
   通过两个MCU(STM32F103)来模拟SPI的主从机,完成主机发送从机接收,便于理解SPI协议。

SPI协议简介

●SPI接口介绍

  SCK: 时钟信号,由主设备产生,所以主设备SCK信号为输出模式,从设备的SCK信号为输入模式。
  CS: 使能信号,由主设备控制从设备,,所以主设备CS信号为输出模式,从设备的CS信号为输入模式。
  MOSI: 主设备数据输出,从设备数据输入,所以主设备MOSI信号为输出模式,从设备的MOSI信号为输入模式。
  MISO: 主设备数据输入,从设备数据输出,所以主设备MISO信号为输入模式,从设备的MISO信号为输出模式。
  
SPI接口连接图
在这里插入图片描述
  注意:MOSI和MISO不能交叉连接(可以把主从机理解为一个整体系统,MOSI为系统主机发送从机接收的数据线,MISO为主机接收从机发送的数据线)。

●SPI数据传输方向

SPI作为全双工的的串行通信协议,数据传输时高位在前,低位在后。主机和从机公用由主机产生的SCK信号,所以在每个时钟周期内主机和从机有1bit的数据交换(因为MOSI和MISO数据线上的数据都是在时钟的边沿处被采样)。
  如下图:
 在这里插入图片描述
 SPI协议规定数据采样是在SCK的上升沿或下降沿时刻(由SPI模式决定,下面会说到),观察上图,在SCK的边沿处(上升沿或下降沿),主机会在MISO数据线上采样(接收来从机的数据),从机会在MOSI数据线上采样(接收来自主机的数据),所以每个时钟周期中会有一bit的数据交换。
 SPI数据交换

●SPI传输模式

SPI总线传输一共有4种模式,这4种模式分别由时钟极性(CPOL)和时钟相位(CPHA)来定义。
   在这里插入图片描述

CPOLCPHA
规定了SCK时钟信号空闲状态的电平规定了数据是在SCK时钟的上升沿还是下降沿被采样
-----------------------------------------------
模式0:CPOL=0,CPHA =0SCK空闲为低电平,数据在SCK的上升沿被采样(提取数据)
模式1:CPOL=0,CPHA =1SCK空闲为低电平,数据在SCK的下降沿被采样(提取数据)
模式2:CPOL=1,CPHA =0SCK空闲为高电平,数据在SCK的下降沿被采样(提取数据)
模式3:CPOL=1,CPHA =1SCK空闲为高电平,数据在SCK的上升沿被采样(提取数据)

以模式0为例:
SCK空闲为低电平,数据在SCK的上升沿被采样(提取数据),在SCK的下降沿切换数据线的数据。
在这里插入图片描述
  ◐在时钟的第1个上升沿(游标1处)(采样点)
  MOSI上数据为1,则在此边沿从机采样(提取)数据为1,采样点在MOSI数据线的中间。
  MISO上数据为0,则在此边沿主机采样(提取)数据为0,采样点在MISO数据线的中间。
  ◐在时钟的第1个下降沿(游标2处)(切换点)
  MOSI上数据由1切换为0,,数据在时钟下降沿时切换数据。
  MISO上数据由0切换为1,,数据在时钟下降沿时切换数据。
 ◐在时钟的第2~8个上升沿(采样点),主机在MISO上采样数据,从机在MOSI上采样数据。
 ◐在时钟的第2~8个下降沿(切换点),主机在MISO上切换数据,从机在MOSI上切换数据。

通过两个单片机模拟SPI来加深理解

利用了STM32F103VET6和STM32F103C8T6(身边只有这两块了)两款MUC。

※硬件连接方式

主机- STM32F103VET6从机-STM32F103C8T6
(主机产生) SCK→→SCK(从机被动)
(主机产生) CS→→CS (从机被动)
(主机发送)MOSI →→MOSI (从机接收)
(主机接收) MISO ←←MISO (从机发送)

●注意:MOSI连接MOSI,MISO连接MISO(不能像串口那样交叉连接)。

✯SPI模式

采用模式0(CPOL=0,CPHA =0):SCK空闲为低电平,数据在SCK的上升沿被采样(提取数据) ,在SCK的下降沿被切换。

✯程序思路

★主机拉低CS开始传输数据,在SCK上升沿之前保持MOSI上有稳定的数据输出(因为从机要在SCK的上升沿去采样(提取数据),所以主机在SCK上升沿之前要完成发送数据的放置)。
  ★从机在CS拉低后(CS有下降沿)开始数据的接收(在SCK的上升沿采集MOSI上的数据)。

✯主机C代码+波形

/*SPI发送函数*/
//时钟的上升沿采样数据,下降沿切换数据   先发送高位
void SPI_Write(uint8_t Data)
{uint8_t i=0;CS_L;	//片选拉低开始传输数据/*循环8次,发送8bit数据*/for(i=0;i<8;i++)	{/*切换数据*/if(Data&0x80)//通过8次循环移位,将一个字节的数据,由高到低一位一位的放置到数据线上{MOSI_H;}else{MOSI_L;}SCK_L;//产生下降沿,准备切换数据delay_us(1);//(可忽略,这里是因为接收时此单片机外部中断上升沿触发有时延,SCK太快无法准确提取数据)SCK_H;	//产生上升沿(从机在此上升沿时采集数据)Data <<= 1;}MOSI_L;SCK_L;CS_H;	//片选拉高等待下次数据传输
}
int main()
{int i=0,j=0;SysTick_init();SPI_GPIO_Config();while(1){SPI_Write(0xA5);}
}

●注意:上面1us的延时[delay_us(1)]此处可以忽略,这里是因为接收时此单片机外部中断上升沿触发有时延,SCK太快无法准确提取数据,利用其他方式解析从机数据的请忽略。(详细了解请参考博文:STM32外部中断边沿触发存在延时问题)。
  ★代码解析:要了解代码思路,就要时刻记得我们采用SPI的是模式0(SCK空闲为低电平,数据在SCK的上升沿被采样(提取数据),下降沿被切换 ),所以1Byte数据放置完毕后,SCK要拉低,CS要拉高,MOSI要恢复默认电平,但是每Bit数据在SCK拉低时被放置到MOSI数据线(因为SCK上升沿前要确保稳定的数据(因为接收数据最好是在数据的中间采样),这样从机才可以在上升沿采样到正确的数据)。所谓放置数据,其实就是在每次SCK拉高之前对MOSI引脚赋值。比如我们发送的数据为0xA5(1010_0101)。
在这里插入图片描述
在上图中标号2处的下降沿处切换数据,上升沿之前保证了MOSI上(游标1)处有稳定的1bit数据(1),随后的7个上升沿也一样分析。
✯主机产生的波形
在这里插入图片描述)
  ★波形解析:通道1数据:SCK
        通道2数据:MOSI
        通道3数据:CS
   在上图中可以观察到整个数据的传输是在片选CS为低的时刻进行的。在SCK下降沿时主机对MOSI数据线上的数据进行了切换,在SCK上升沿之前完成了1bit数据的发送。完成1Byte数据的发送后,SC置高,CS置高,MOSI置低,为下一帧数据做准备。

✯从机C代码+波形

/*SPI接收数据*/
uint8_t SPI_Read()
{/*CS下降沿*/if(CS_Trigger_Falling == 1){CS_Trigger_Falling = 0;/*SCK上升沿*/for(i=0;i<8;i++){while(SCK_Trigger_Rising != 1);//等待上升沿SCK_Trigger_Rising = 0;Data_Rec<<=1;if(MOSI_State)//在SCK上升沿时提取数据{		Data_Rec ++;	Rec_Data1[i] = 1;	}else{}}}return Data_Rec;
}
int main()
{SysTick_init();SPI_GPIO_Config();EXTI_PB1_Config();EXTI_PA2_Config();while(1){Get_Data = SPI_Read();}
}
/*外部中断0中断*/
void EXTI1_IRQHandler(void)//中断服务函数
{if(EXTI_GetITStatus(EXTI_Line1) != RESET )//reset为清零(!=reset等价于IT=1){SCK_Trigger_Rising = 1;EXTI_ClearITPendingBit(EXTI_Line1);}}
void EXTI2_IRQHandler(void)//中断服务函数
{if(EXTI_GetITStatus(EXTI_Line2) != RESET )//reset为清零(!=reset等价于IT=1){CS_Trigger_Falling = 1;EXTI_ClearITPendingBit(EXTI_Line2);}}

★代码解析:从机采用了外部中断的方式去采集CS的下降沿和SCK的上升沿(从机以CS下降沿为数据接收的开始,以SCK的上升沿作为每bit数据的采样点)。(★★★有好的方法欢迎指导)
  ●CS下降沿提取波形:图中紫色信号为CS下降沿点。
  在这里插入图片描述
  ●SCK上升沿提取波形:下图中紫色信号为SCK上升沿的提取(即从机接收MOSI数据线上的采样点)。
在这里插入图片描述
  ●提取数据(数据采样):紫色信号处(采样点)MOSI上的数据即为从机接收到的数据,仔细观察采样点几乎在稳定数据的中间点(因为之前所说的边沿检测存在延迟,所以采样点略微偏移中心点,参考链接STM32外部中断边沿触发存在延时问题)。
在这里插入图片描述
✯从机接收数据结果:0xA5
在这里插入图片描述

如有兴趣可查看类似的
IIC协议详解

★★★如有错误欢迎指导。


http://chatgpt.dhexx.cn/article/WBxFiyAD.shtml

相关文章

SPI协议讲解与总结

1.SPI通讯协议 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线 1.1 SPI引脚与工作过程 SPI的通信原理很简单&#xff0c;它以主从方式工作&#xff0c;这种模式通常有一…

【STM32】SPI协议通信详解

目录 一.SPI协议简介二.SPI物理层三.SPI协议层 1.通讯的起始和停止信号2.数据有效性3.时钟信号的相位和极性&#xff08;重点&#xff09; 四.SPI 特性及架构&#xff08;重点&#xff09; 1.通信引脚2.时钟控制逻辑3.数据控制逻辑&#xff08;非常重要&#xff09;4.全双工发…

FPGA实现的SPI协议(一)----SPI驱动

写在前面 SPI协议系列文章&#xff1a; FPGA实现的SPI协议&#xff08;一&#xff09;----SPI驱动 FPGA实现的SPI协议&#xff08;二&#xff09;----基于SPI接口的FLASH芯片M25P16的使用 1、什么是SPI协议 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外围设备…

SPI总线协议概述

一.概述 SPI(serial peripheral interface)是一种同步串行通信协议&#xff0c;由一个主设备和一个或多个从设备组成&#xff0c;主设备启动与从设备的同步通信&#xff0c;从而完成数据的交换。SPI是一种高速全双工同步通信总线&#xff0c;标准的SPI仅仅使用4个引脚&#xff…

SPI协议详解(总结)

关于SPI协议 1&#xff09;SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff1b; 2&#xff09;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff1b; 3&#xff09;在芯片的管脚上只占用四根线&#xff0c;节约了芯片的…

SPI通讯协议介绍

来到SPI通讯协议了。废话两句&#xff0c;“SPI很重要”&#xff0c;这是我在学校时候听那些单片机开发工程师说的。出来实习&#xff0c;到后来工作&#xff0c;确实如此&#xff0c;SPI的使用很常见&#xff0c;那么自然重要咯。 SPI(Serial peripheral interface)即串行外围…

spi协议及工作原理分析

说明.文章摘自&#xff1a;SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一、概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro…

SPI总线协议介绍

SPI总线协议介绍 一、技术性能 SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构;支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first);SPI接…

SPI 协议的解析

目录 1、SPI 的硬件层 1.1、SPI接口的信号线 1.2、SPI通信常见的连接方式 2、SPI的通信协议 2.1、起始信号 2.2、停止信号 2.3、数据有效性 2.4、时钟的同步 3、SPI的四种工作模式 SPI协议是由摩托罗拉公司提出的一种串行外围设备通信接口&#xff0c;是一种高速全双工…

SPI协议详解

1.SPI协议简介 1.1.SPI协议概括 SPI&#xff0c;是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM&#xff0c;FLASH&#xff0c;实时时钟&#xff0c;AD转换器&a…

一文看懂SPI协议

文章目录 SPI协议简介4线还是3线&#xff1f;4种工作模式多种传输速率SPI协议的基本时序SPI协议的升级版FPGA实现SPI协议SPI和IIC的对比总结 SPI协议简介 板卡内不同芯片间通讯最常用的三种串行协议&#xff1a;UART、I2C、SPI&#xff0c;之前写过串口协议及其FPGA实现&#…

SPI协议简单介绍

导言 SPI是串行扩展总线。 串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时系统的更改和扩充极为容易。 常用的串行扩展总线有&#xff1a;I2C&#xff08;Inter IC Bus)总线、单总线&#xff08;1-WIRE BUS)、SPI&#xff08;Serial Peripher…

SPI通信协议详解

SPI协议基本概念 SPI接口 &#xff08;1&#xff09;SPI&#xff08;Serial Peripheral interface&#xff09;是一种同步串行传输规范&#xff0c;也是单片机外设芯片串行外设扩展接口&#xff0c;该接口是一种高速&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;…

SPI 协议详解

SPI 协议详解 1、SPI 简介2、SPI四线3、SPI四种工作模式4、SPI时序图 1、SPI 简介 SPI 全称是 Serial Perripheral Interface&#xff0c;也就是串行外围设备接口。 SPI 是 Motorola 公司推出的一种同步串行接口技术&#xff0c;是一种高速、全双工的同步通信总线&#xff0c;…

SPI协议简介—学习笔记

SPI协议简介—学习笔记 1、SPI百度百科 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&…

一文搞懂SPI通信协议

目录 1、简介 2、通信原理 3、通信特性 3.1、设备选择 3.2、设备时钟 3.2.1、时钟速率 3.2.2、时钟极性 3.2.3、时钟相位 3.3、四种模式 4、多从机模式 5、SPI优缺点 1、简介 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xf…

SPI协议详解(图文并茂+超详细)

加入技术交流群 领取资料 文章目录 先说串口SPI通讯协议SPI特性时钟频率时钟极性 CKP/Clock Polarity时钟相位 CKE /Clock Phase (Edge)时钟配置总结 模式编号多从机模式优缺点SPI通讯的优势SPI的缺点 编程实现 先说串口 因为之前写过一篇UART&#xff0c;通用串行异步通讯协…

Xms Xmx Xss 释义

Xms 是指设定程序启动时占用内存大小。一般来讲&#xff0c;大点&#xff0c;程序会启动的快一点&#xff0c;但是也可能会导致机器暂时间变慢。 Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存&#xff0c;超出了这个设置值&#xff0c;就会…

JVM中的Xms和Xmx

JVM内存参数 -Xms和-Xmx 参考资料&#xff1a;(1) JVM常用内存参数配置 (2)深入理解Java虚拟机 -Xms和-Xmx &#xff08;1&#xff09;这两个参数老是搞混&#xff0c;特地记一下。-Xms 为JVM启动时申请的初始Heap值&#xff0c;默认为操作系统物理内存的1/64但小于1G。默认当…

通过两个小例子,更快了解-Xms -Xmx

我们偶尔就会遇到OutOfMemoryError&#xff0c;面试的时候总是能够被问道&#xff0c;可明明背好的面试题临时又不会了&#xff0c;答出来也很生硬&#xff0c;自己都想让自己快点“回家等通知”&#xff0c;那我们就通过下面的两个例子了解一下吧。 开发环境&#xff1a;ide…