目录

学习视频

SPI 通信协议简介

I2C & SPI 对比

特点

同步 全双工

通信线

一主多从

如何确定引脚

硬件电路

SPI 典型电路 

注意: 

移位示意图

SPI 时序基本单元

起始条件

终止条件

交换一个字节

模式0

模式1

模式2

模式3

SPI 时序

发送指令

指定地址写 

指定地址读 



学习视频

【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传输更快,设计简单粗暴,硬件开销大,通信线多,通信过程中,经常用通信浪费的现象
  • 特点

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

    同步:同步通信肯定要有时钟,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就是任性

    如何确定引脚

    CLK就是SCK

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

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

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


    硬件电路

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

    注意: 
  • 本图中,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才允许变成推挽输出模式。这个变化都是在从机里进行的,我们写的是主机的程序,就不用管这个问题了。

  • 移位示意图

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

    时钟源由主机提供

    假设数据是这样的

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

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

    MOSI是高电平,MISO是低电平

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

    再来一个上升沿

    再来一个下降沿

    第三个时钟结束…

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

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

    效果:发送同时接收

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

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

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

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


    SPI 时序基本单元

    起始条件

    SS从高电平切换到低电平

    终止条件

    SS从低电平切换到高电平

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

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

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

    交换一个字节

    模式0

  • CPOL=0:空闲状态时,SCK为低电平
  • CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
  • 这里注意MISO,在SS高电平期间,都是高阻态,并没有数据交换 

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

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

    模式1

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

  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
  • 模式2和模式0可以对比来看,就是SCK的极性取反,剩下的都一样 

    模式3

  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
  • 模式1和模式3的区别也是,SCK极性相反

    注意:

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

    发送指令

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

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

    指定地址写 

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

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

    指定地址读 

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

    随后在指定地址(Address[23:0])下,读取从机数据(Data)

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 SPI通信教程

    发表评论