SPI是什么
SPI,是一种高速的,全双工,同步的通信总通信协议,由一个主设备,一个或多个从设备组成,具有四根信号线:SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。
MISO: 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
MOSI: 主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
SCLK:串行时钟信号,由主设备产生。
CS/SS:从设备片选信号,由主设备控制。它的功能是用来作为“片选引脚”,也就是选择指定的从设备,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。
SPI的优缺点:
优点
- 支持全双工操作;
- 四个管教实现数据传输及控制,操作简单;
- 数据传输速率较高。
缺点
- 需要占用主机较多的口线(每个从机都需要一根片选线);
- 只支持单个主机。
- 没有相应的流控和应当机制,数据的可靠性得不到保证
SPI的传输模式
SPI有四种传输模式,通过时钟信号的时钟极性(CPOL)和时钟脉冲(CPHA)来控制。CPOL和CPHA控制着两个设备间何时进行数据交换以及何时对接受的数据进行采样,以保证设备间的同步传输。
CPOL时钟极性,会直接影响SPI总线空闲时的时钟信号是高电平还是低电平。
CPOL = 1:表示空闲时是高电平 CPOL = 0:表示空闲时是低电平
由于数据传输往往是从跳变沿开始的,也就表示开始传输数据的时候,是下降沿还是上升沿。
如下图:
CPHL时钟相位:一个时钟周期会有2个跳变沿上升沿和下降沿,而相位,直接决定SPI总线从那个跳变沿开始采样数据。
CPHA = 0:表示从第一个跳变沿开始采样 CPHA = 1:表示从第二个跳变沿开始采样
如下图:
至于跳变沿究竟是上升沿还是下降沿,这取决于 CPOL。记住, CPHA 只决定是哪个跳变沿采样。
根据时钟极性CPOL和时钟相位的不同配置,SPI有则有四种传输模式,其时序如图:
模式0 (CPOL=0; CPHA=0):
CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿 CPHA = 0:数据在第1个跳(上升沿)采样
模式1 (CPOL=0; CPHA=1):
CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿 CPHA = 1:数据在第2个跳变沿(下降沿)采样
模式2 (CPOL=1; CPHA=0):
CPOL
= 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿 CPHA = 0:数据在第1个跳变沿(下降沿)采样
模式3 (CPOL=1; CPHA=1)
CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿 CPHA = 1:数据在第2个跳变沿(上升沿)采样
在四个模式中较为常用的是模式0和模式3,下面通信时序展示的为模式3的通信时序
SPI通信时序
如上图所示,在模式0下总线空闲时,时钟线SCK为低电平,当片选信号SSEL被主机拉低以后,数据传输开始,MOSI和MISO的数据切换(Toggling)发生在时钟的下降沿(第一个时钟沿),数据采用(Sampling)发生在时钟的上升沿(时钟的第二个时钟沿)。
SPI数据发送接收
SPI主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。
首先拉低对应SS信号线,表示与该设备进行通信
主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据
主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。
SPI多从机的连接方式
前面说到SPI总线必须有一个主机,可以有多个从机,那么具体连接到SPI总线的方法有以下两种:
第一种方法:多片选脚
- 通常,每个从机都需要一条单独的SS线。主设备可以通过”拉低/拉高“(取决于从设备)的片选引脚,来与使能的从设备进行通讯。
- 如果要和特定的从机进行通讯,可以将相应的
NSS
信号线拉低,并保持其他NSS
信号线的状态为高电平;如果同时将两个NSS
信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO
线上传输数据,最终导致接收数据乱码。
具体连接方式如下图所示;
第二种方法:菊花链
在数字通信世界中,在设备信号(总线信号或中断信号)以串行的方式从一 个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式被称为菊花链。
- 菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;
- 另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;
具体的连接如下图所示(其中红线加粗为数据的流向);
所以最终的数据流向图可以表示为:
SCK为时钟信号,8clks表示8个边沿信号;其中D为数据,X为无效数据;
所以不难发现,菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出。
SPI通讯的基本要素
1.通讯数据长度:常见的为8bit、16bit,少数还有32bit。作为Master,根据实际芯片的需求配置即可。
2.传输起始位:MSB(二进制数最高位)、LSB(二进制数最低位)。
3.片选有效性:低有效(常见)、高有效。
4.片选实现方式:硬件自动处理、软件手动处理。
5.读取的边沿:Leading edge(上升沿)、Trailing edge(下降沿)。
6.时钟极性:低(常见)、高。
7.SPI通讯方式:同步(主选)、异步(解决数据量过大等问题)。
8.SPI波形的间隙:
• 片选有效与第一个数据之间的间隙• 最后一个数据与片选无效之间间隙• 两个片选之间的间隙