【STM32】SPI通信

目录

学习视频

SPI 通信协议简介

I2C & SPI 对比

特点

同步 全双工

通信线

一主多从

如何确定引脚

硬件电路

SPI 典型电路 

注意: 

移位示意图

SPI 时序基本单元

起始条件

终止条件

交换一个字节

模式0

模式1

模式2

模式3

SPI 时序

发送指令

指定地址写 

指定地址读 


【STM32】SPI通信_第1张图片


学习视频

【STM32入门教程-2023版 细致讲解 中文字幕】 https://www.bilibili.com/video/BV1th411z7sn/?p=36&share_source=copy_web&vd_source=8af85e60c2df9af1f0fd23935753a933


SPI 通信协议简介

I2C & SPI 对比

  • I2C:硬件上最少的通信线,软件上实现最多的功能,非常优雅,但是I2C 开漏+上拉电阻的电路结构,使得高电平驱动能力不高,低电平到高电平的上升沿,耗时长,限制了I2C的最大通信速率I2C的标准模式只有100KHz的频率,快速模式也只有400KHz,高速模式3.4MHz(普及程度不高)
  • SPI传输更快,设计简单粗暴,硬件开销大,通信线多,通信过程中,经常用通信浪费的现象

【STM32】SPI通信_第2张图片

特点

  • SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
  • 四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)
  • 同步,全双工
  • 支持总线挂载多设备(一主多从)

【STM32】SPI通信_第3张图片

同步 全双工

同步:同步通信肯定要有时钟,SCK提供时钟信号,对照I2C总线,这个SCK,就相当于I2C的SCL数据线,两者作用相同

全双工:数据发送和数据接受单独各占一条线,MOSI和MISO就是分别用于发送和接收的两条线路

通信线

MOSI:主机输出,从机输入(主机向从机发送数据的线路)

MISO:主机输入,从机输出(主机从从机接收数据的线路)

这两条线相当于I2C的SDA数据线,I2C的SDA线兼具发送和接收,半双工

SPI是 一根发送线,一根接收线,全双工

一主多从

  • SPI仅支持一主多从,不支持多主机,这点,SPI从功能上不如I2C强大
  • I2C的一主多从:起始条件之后,主机必须先发送一个字节进行寻址,用来指定我要跟哪个设备进行通信,这里设计分配地址和寻址的问题
  • SPI的一主多从:我打手一会,再开辟一条通信线,专门用来指定主机和哪个从机进行通信,就是SS(Slave Select),并且SS可能不止一条,需要找哪个从机,就控制哪个从机的SS线,输出低电平取消控制就输出高电平

 SPI方便,但是得加钱,SPI就是任性

【STM32】SPI通信_第4张图片

如何确定引脚

【STM32】SPI通信_第5张图片

CLK就是SCK

DI引脚是MOSI,这个芯片接在STM32上,芯片是从机,STM32是主机,所以DI数据输入是从机的数据输入SI,对应接在主机的MO上,就是MOSI

另一个DO就是MISO,主机输入,从机输出

CS片选,就是SS从机选择线


硬件电路

  • 所有SPI设备的SCK、MOSI、MISO分别连在一起
  • 主机另外引出多条SS控制线,分别接到各从机的SS引脚
  • 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

SPI 典型电路 

【STM32】SPI通信_第6张图片

注意: 
  • 本图中,GND线没画,所有的GND要连接在一起,如果从机没有电源供电,还需要从主机接入VCC
  • 主机一般都是STM32控制器,从机一般都是存储器、显示屏、通信模块、传感器...
  • MOSI - 数据由主机流向从机
  • MISO - 数据由从机流向主机 
  • 片选芯片:主机想和哪个从机通信,就拉低那一条SS线;其他的从机SS都是高电平,都会保持沉默;只有主机和当前选中的从机进行通信,直至通信结束再将这一根SS置高电平。
  • 输出引脚配置为推挽输出,驱动能力强,上升沿、下降沿都非常迅速,SPI信号变化的快,传输速度就会更高,一般都是MHz级别
  • I2C并不是不想使用变化更快的推挽输出,而是I2C要实现半双工,经常要切换输入输出,另外I2C又要实现多主机的时钟同步和总线仲裁,这些功能都不允许I2C使用推挽输出,不然一个不小心电源就短路了,所以I2C选择了更多功能,放弃更强的性能
  • SPI不支持多主机,SPI是全双工,输出引脚始终输出,输入引脚始终输入,基本不会冲突,所以SPI可以大胆使用率推挽输出模式
  • 如果多个从机的MISO始终都是推挽输出,就会冲突,所以SPI协议里有一条规定——当从机的SS引脚为高电平时候(从机未被选中),这个从机的MISO必须为高阻态(相当于引脚断开,不输出任何电平),SS为低电平时候,MISO才允许变成推挽输出模式。这个变化都是在从机里进行的,我们写的是主机的程序,就不用管这个问题了。

移位示意图

【STM32】SPI通信_第7张图片

SPI一般都是高位先行,每来一个脉冲,主机和从机的移位寄存器就会向左移动一位

时钟源由主机提供

假设数据是这样的

【STM32】SPI通信_第8张图片

这时,驱动时钟来一个上升沿,所有的位,都会左移一次

【STM32】SPI通信_第9张图片

左边被移出去的一位都会放到数据线上,实际是放到了输出数据寄存器里如下图所示:

【STM32】SPI通信_第10张图片

MOSI是高电平,MISO是低电平

这时候再来一个下降沿,主机和从机都会进行数据采样输入,采集数据高低电平,所以MOSI的1,被采集到从机里,MISO的0被采集到主机里,如下图所示:

【STM32】SPI通信_第11张图片

再来一个上升沿

【STM32】SPI通信_第12张图片

再来一个下降沿

【STM32】SPI通信_第13张图片

第三个时钟结束...

【STM32】SPI通信_第14张图片

8个时钟之后,实现了主机和从机一个字节的数据交换

【STM32】SPI通信_第15张图片

这就是SPI字节交换的示意图

效果:发送同时接收

如果只想发送,不想接收,就忽视接收到的数据;

如果只想接收,不想发送,就随便发送一个字节数据(一般是0x00或0xFF),把从机数据置换过来即可。

这个动画,江科大真的是YYDS

【STM32】SPI通信_第16张图片

以上就是SPI的基本原理,总结一下就是:SPI的基础是交换一个字节,这样就可以实现发送一个字节接收一个字节发送同时接收一个字节


SPI 时序基本单元

起始条件

SS从高电平切换到低电平

【STM32】SPI通信_第17张图片

终止条件

SS从低电平切换到高电平

【STM32】SPI通信_第18张图片

下面就是数据传输的基本单元,建立在移位模型的基础上

这个基本单元什么时候开始移位?是上升沿移位还是下降沿移位?都是可以配置的,SPI没有限定死,给我们更多选择的空间,SO,SPI可以兼容更多的芯片了

我们可以配置 CPOL时钟极性、CPHA时钟相位,每一位可以配置为1或0,总共有4种模式(模式0、模式1、模式2、模式3)

交换一个字节

模式0

  • CPOL=0:空闲状态时,SCK为低电平
  • CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

【STM32】SPI通信_第19张图片

这里注意MISO,在SS高电平期间,都是高阻态,并没有数据交换 

模式0:在第0个边沿移出数据,在第1个边沿移入数据,模式0比模式1的相位要提前(相当于SS下降沿就移出数据、SCk上升沿就采样输入数据

【STM32】SPI通信_第20张图片

下一个字节的Bit7会露个头 ,实际应用中,模式0最多

模式1

  • CPOL=0:空闲状态时,SCK为低电平
  • CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

【STM32】SPI通信_第21张图片

模式2

  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

【STM32】SPI通信_第22张图片

模式2和模式0可以对比来看,就是SCK的极性取反,剩下的都一样 

模式3

  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

【STM32】SPI通信_第23张图片

模式1和模式3的区别也是,SCK极性相反

注意:

  • CPHA只能决定是第几个边沿采样,并不能确定是上升沿还是下降沿,还需要参考CPOL的电平。
  • 如果CPOL=0,就是上升沿(1)和下降沿(2);
    如果CPOL=1,就是下降沿(1)和上升沿(2)。
  • 模式0和模式3都是SCK上升沿采样;模式1和模式2都是SCK下降沿采样

SPI 时序

发送指令

向SS指定的设备,发送指令(0x06)

【STM32】SPI通信_第24张图片

主机发送0x06给从机(W25Q64),这个指令是写使能

指定地址写 

向SS指定的设备,发送写指令(0x02)

随后在指定地址(Address[23:0])下,写入指定数据(Data)

【STM32】SPI通信_第25张图片

指定地址读 

向SS指定的设备,发送读指令(0x03)

随后在指定地址(Address[23:0])下,读取从机数据(Data)【STM32】SPI通信_第26张图片

【STM32】SPI通信_第27张图片

你可能感兴趣的:(STM32,蓝桥杯,stm32,单片机,嵌入式硬件)