stm32入门-----SPI通讯协议

 目录

前言

一、SPI通讯简介

1.基本概念

2.硬件电路

3.通讯过程

二、SPI时序基本单元

1.起始与终止

2.工作模式 

模式0(重点)

模式1

模式2

模式3

三、SPI时序

1.发送指令

2.指定地址写入 

3.指定地址读


前言

        本期我们就开始学习SPI通讯协议,在前面我们学习了I2C通信协议,相较于I2C通讯,SPI是属于另外一种方式的通讯方式,呢么SPI是如何进行通讯呢?对比I2C又有什么的优点呢?下面就一起来看看吧。(视频:[11-1] SPI通信协议_哔哩哔哩_bilibili

一、SPI通讯简介

1.基本概念

  • SPISerial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
  • 四根通信线:SCKSerial Clock)、MOSIMaster Output Slave Input)、MISOMaster Input Slave Output)、SSSlave Select
  • 同步,全双工
  • 支持总线挂载多设备(一主多从)

 对比于I2C通讯,我们可以看出SPI是需要4根通讯线的,其中SCK是时钟通讯线,MOSI是主机向从机发送数据的通讯线,MISO是主机向从机接收数据的通讯线,SS是从机选择指定的从机的通讯线。从这里我们就不难看出,SPI通讯的发送和接收是由两个独立的通讯线来完成的,所以是可以实现发送和接收同步,全双工。但对比于I2C的话这里是不支持多主多从的模式,只能有一个主机多个从机一主多从的模式。

2.硬件电路

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

在下面电路我们就可以看出,SPI通讯主机的SCK、MISO和MOSI是与从机的一一对应的连接, 不过对于不同的从机就需要一根独立的SS线去连接,这里就需要主机单独拉出一条SS线来去选择指定的从机进行通讯操作,这样做虽然标识性很强,不过相对的也是很占用IO口资源的。当我们要指定的从机通讯的时候,对应这个从机的SS是置为低电平0的,然后就可以开始通讯,而其他的从机SS是默认为高电平;在通讯的过程中除了在与主机通讯的从机,其他从机的MISO是为高阻态,也就是不输出任何电平,这样避免主机接收数据出现了冲突的情况。

3.通讯过程

下面我就来详细讲解SPI主机和从机之间数据是怎么进行传输的。

首先先看到下面这个图,主机和从机的移位寄存器都是有数据的,那么二者之间在进行通讯的时候是进行数据交换的形式,也就是最终主机的数据会发送给从机的移位寄存器,从机的移位寄存器的数据会发送给主机。

 比如在第一个时钟信号SCK边沿到来的时候,也就是数据发送,主机和从机的移位寄存器都向左移动一位,然后出来的数据分别进入到MOSI和MISO线上。下图所示:

 当第二个时钟边沿到来的时候,主机和从机都执行接收数据,也就是MISO的数据会放入到主机的最后一个位置,MOSI线上的数据就会放入到从机的最后一个位置,这里是不是很像数据结构的队列呢?这样子就完成了一个数据的收发,然后连续8次就完成了一个字节的发送和接收,准确的说应该是置换。下图所示:

这里就会有人问了,为什么非要主机和从机置换数据呢?就不能单独执行接收数据而不发送数据吗?其实也是可以的,只不过是SPI通信方式本身来讲就是主机和从机交换数据的,如果只执行接收数据而不发送数据,其实也就是我们只去看接收到的数据,而发送给从机的是一个随便的数据就行了(一般是0x00或者0xFF),同样的如果只发送数据而不接收数据,也是跟上面的一样的。

二、SPI时序基本单元

1.起始与终止

  • 起始条件:SS从高电平切换到低电平
  • 终止条件:SS从低电平切换到高电平

                        起始                                                                                 终止

2.工作模式 

  • CPOL:是指SCK在空闲模式下的默认状态
  • CPHA:是指主机和从机在SCK第几个电平的的时候移入数据,并不能决定在高电平还是在低电平移入数据
模式0(重点)
交换一个字节(模式 0
  • CPOL=0:空闲状态时,SCK为低电平
  • CPHA=0SCK第一个边沿移入数据,第二个边沿移出数据

模式0是在在SCK第一个边沿移入数据的,也就是说在SCK第一个边沿到来之前主机和从机的数据就已经进入到了MOSI和MISO上了,其实也就是在SS下降沿的时候进行这个操作,然后在SCK第二个边沿期间再移出数据。模式0是使用最广泛的,主要是可以兼容其他设备,也是我们重点学习的。 

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

模式1的话我们看上去就更加亲切一些,也是我们认为比较符合常理。当SCK第一个边沿的时候就移出数据,第二个边沿的时候就继续移入数据操作 。

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

模式2其实仔细看的话就是除了SCK跟模式0的反过来这点不同,其他都是一模一样的,因为CPOL=1的,空闲状态SCK为高电平。 

模式3

交换一个字节(模式3

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

同上,模式3也是SCK跟模式1反过来,其他都是一样的。  

三、SPI时序

1.发送指令

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

下图是发送一个指令的时序,对于W25Qxx系列的相关设备是需要一些相关指令去操作的 ,下一期再去详细讲解W25Qxx系列的相关指令,本期稍作了解即可。

2.指定地址写入 

指定地址写
SS 指定的设备,发送写指令( 0x02 ),随后在指定地址(Address[23:0] )下,写入指定数据( Data

在前面发送了SS指令后,选择了我们指定的从机设备,然后要进行写入操作,同样的我们需要去选择指定的寄存器地址来去写入数据。如下图时序,第一个字节是表示执行的操作读取还是写入,中间三个字节刚好24位是指定要进行操作的寄存器,最后一个字节就是表示写入的数据 。

3.指定地址读

指定地址读
SS 指定的设备,发送读指令( 0x03 ), 随后在指定地址( Address[23:0] )下,读取从机数据( Data

 对于指定地址读取,还是一样,第一个字节是选择要进行的操作,中间三个字节是指定的寄存器地址,最后一个字节是读取到的数据返回出来。

 

 以上就是本期的全部内容了,我们下次见!

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fitz&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值