协议基础——SPI

目录

一主多从通信思路

SPI协议

SPI引脚及连接

SPI时钟信号的极性和相位

SPI传输方式

SPI时序图

SPI通信举例


SPI,英文全称Serial Peripheral Interface。

Serial是串行的

Peripheral是外设

Interface是接口

连在一起,中文名就是串行外设接口

SPI协议是一种串行全双工同步通信协议。

不理解串行、全双工、同步概念的话,可以看下协议基础——UART中的背景知识。

UART协议 是串行全双工异步通信协议

SPI协议     是串行全双工同步通信协议

由于SPI是同步通信,要带有时钟同步信号传输,

所以SPI引脚除了发送、接收引脚之外,应该还有时钟引脚,

另外当初摩托罗拉(Motrorola)开发出SPI的目的是为了支持一个主设备与多个从设备之间的通信

不像UART是一对一的通信,这时候我们就会冒出一个疑问?主设备怎么知道跟哪个从设备通信呢?

一主多从通信思路

我们大概有两个思路:

(1)如果不能增加引脚

我们想到的就只能是给子设备做标签,以互相区分,比如我们规定主设备左边第一个子设备的标签是A,把A保存在子设备中,第二个子设备标签是B,同样把B保存,依次类推,这样每个子设备就因为标签不同而可以区分了。

这时候,假如我们要主设备和子设备A通信,主设备通过发送引脚Tx发送A给所有相连的子设备,子设备跟自己内部的标签进行比较,如果相同,就给主设备回个yes,不同,就装死。

这时候明显的只有A会回答yes,如果主设备发的是B,那就只有B回yes,从而实现了一对多通信。

(2)如果可以增加引脚

这个就爽歪歪啦,假设我们引脚资源无限,首先主设备看下有多少个子设备,就增加多少个子设备选中引脚,有A、B、C三个子设备,就增加3个“子设备选择引脚”,如AS、BS、CS,

主设备有子设备选中引脚了,但子设备还没有“被选中引脚”用来连线,所以给每个子设备添加一个接收引脚如RM,用于接收主设备通过“子设备选择引脚”发过来的选择信号。

这样,规定RM接收引脚收到高电平信号即1,就是被选中,那就能够通过AS、BS、CS三个引脚发送不同的信号来选中与哪个子设备通信,每次只能选中1个。

如果多个引脚同时发1,多个从设备一起向主设备发数据,会出现数据冲突,主设备直接懵逼,分不清哪个数据是哪个子设备发的。

比如主设备的AS、BS、CS的引脚电发出1、0、0的信号,子设备A收到使能通信信号1,子设备A开始向主设备发送数据,其它子设备未收到使能通信信号,继续等待,

若将主设备的AS、BS、CS的引脚发出0、1、0的信号,子设备B收到使能通信信号1,子设备B开始向主设备发送数据,其它子设备未收到使能通信信号,继续等待,这样就实现了一主多从通信。

好,思路讲完了,我们接下来进入正题,来看看SPI是怎么实现的吧

SPI协议

SPI引脚及连接

MISO(Master In Slave Out)主机输入从机输出,以主机为中心,类似于UART中的Rx引脚

MOSI(Master Out Slave In)主机输出从机输入,以主机为中心,类似于UART中的Tx引脚

SCK(Serial Clock)串行时钟,用于同步,两个设备通信时,通信速度受限于低速设备

SS/CS(Slave Select/Chip Select)从机选择/芯片选择,简称片选,既然是选择,那说明是支持1对多的,1个从机至少需要1个CS,n个从机至少需要n个CS引脚,

SPI要进行通信,有发就有收,所以除了主机外,SPI应该至少还有1个从机,SPI至少需要4根线

CS使能信号根据从机决定,一般是低电平有效,可以有多个从机,从下图接线可以看出,在通信的过程中,总线上只能是一个主机和一个从机进行通信,所以要使用CS引脚使能来选中要通信的主机。

也就是说SPI通信协议是单主设备通信协议。

主机有SPI时钟发生器,控制着整个串行时钟信号,完成整个发送的控制作用

主机SS片选引脚默认接高电平,表示作为主机。

从机SS片选引脚接主机GPIO口,主机通过GPIO口的高低电平变化对从机进行片选,低电平有效。

当主机GPIO1引脚为低电平,其它GPIO2~GPIOn引脚为高电平时,

左边第一个从机的SS引脚电平为低电平,表示被选中,主机与左边第一个从机通信,其它从机SS引脚高电平待机。

SPI时钟信号的极性和相位

SPI接口可由CPOL和CPHA设定4种不同传输格式的时序。

CPOL英文全称Clock Polarity,时钟极性,CPOL决定时钟脉冲SCK的有效脉冲方式(正、负),可设置0(看红色箭头)或1(看绿色箭头),如下图

0表示SCK的正脉冲有效,上升沿触发(由低电平0转为高电平1),空闲时是低电平0

1表示SCK的负脉冲有效,下降沿触发(由高电平1转为低电平0),空闲时是高电平1

CPHA英文名称Clock Phase,时钟相位,CPHA决定数据线MOSI什么时候输出数据或采集数据。

可设置0(看红色箭头)或1(看绿色箭头),如下图

0表示在SCK未触发之前,第一位数据Bit0开始传输,数据输出超前触发,第1个边沿采样

1表示在SCK触发的时候,第一位数据Bit0开始传输,数据输出触发同步,第2个边沿采样

触发:启动数据传输

采样:进行读取数据

根据CPOL和CPHA的组合数目,一共有2x2=4种设置情况。

CPOL/CPHA的设定第一位数据Bit0的输出其它位的输出数据采样
CPOL=0,CPHA=0在第一个SCK上升沿前SCK下降沿SCK上升沿
CPOL=0,CPHA=1第一个SCK上升沿SCK上升沿SCK下降沿
CPOL=1,CPHA=0在第一个SCK下降沿前SCK上升沿SCK下降沿
CPOL=1,CPHA=1第一个SCK下降沿SCK下降沿SCK上升沿

如何快速判断CPOL和CPHA,其实上边已经给出:

CPOL=空闲时的电平

CPHA=n/2取整(n=1或2,表示第n个边沿采样)

了解清楚了CPOL时钟极性和CPHA时钟相位,接下来就可以看时序图啦。

SPI传输方式

SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步

MOSI及MISO数据线在SCK的每个时钟周期传输1bit数据,且数据的输入输出是同时的(全双工)

数据传输时,MSB(Most Significant Bit,最高有效位)高位先行 或 LSB(Least Significant Bit)并没有做硬性规定,可以程序设定,但是要保证两个SPI通信设备之间使用同样的协定,一般都会采用MSB高位先行模式。

SPI时序图

给我们一个时序图,

(1)先看NSS片选信号的变化

左边①处,NSS片选信号拉低,表示该从设备被主机选中,开始准备与主机开始通信,是SPI通信的起始信号

右边⑥处,NSS片选信号拉高,表示该从设备与主机通讯结束,从机的选中状态被取消,是SPI通信的停止信号

(2)接下来看SCK时钟信号的变化

从最左边看,我们发现SCK空闲时是低电平,根据上边时钟极性CPOL的特点,可知CPOL=0。

(3)然后我们看数据线MOSI、MISO信号的变化,联系上SCK时钟同步信号一起看

从最左边看,第一次数据输出是在SCK上升沿的时候,采样是在SCK第2个边沿,由上边时钟相位CPHA的特点,可知CPHA=2/2=1。

采样时数据线发送1就是1,发送0就是0。

SPI通信举例

nCS片选信号拉低,表示从设备被主机选中,开始准备和主机通信,是SPI通信的起始信号。

接着我们看CLK时钟信号变化,CLK信号空闲时默认低电平,由时钟极性CPOL特性知:CPOL=0

CPOL=0,表示CLK正脉冲触发(即上升沿触发),数据开始传输,

接着看

MOSI和MISO数据线信号的第一个bit数据输出在触发之前,由时钟相位CPHA特性知:CPHA=0

CPHA=0,由CPHA=n/2取整(n表示在第n个边沿采样)知,n=1,即在CLK的上升沿采样

即黄色虚线处触发并采样,高电平表示1,低电平表示0

由上可知,

MOSI传输的数据是1→0→1→0→0→1→0→1

MISO传输的数据是1→0→1→1→1→0→1→0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值