1. SPI总线介绍
SPI(Serial Peripheral Interface,串行外设接口)是由Motorola提出的一种全双工同步串行通信接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息,通信波特率可以高达5Mbps。SPI接口主要应用在EEPROM、FLASH、实时时钟、网络控制器、LCD显示驱动器、AD转换器,数字信号处理器、数字信号解码器等设备之间。
SPI接口一般使用4条线:
(1)MOSI:主设备数据输出,从设备数据输入
(2)MISO:主设备数据输入,从设备数据输出
(3)SCLK:时钟信号,由主设备产生
(4)NSS:从设备使能信号,由主设备控制
SPI设备连接示意图
在某些情况下,我们也可以用3根线的SPI或者2根线的SPI进行通信。比如主机只给从机发送命令,从机不需要回复数据的时候,那么MISO就可以不要;而在主机只读取从机的数据,不需要给从机发送指令的时候,那MOSI就可以不要。
当一个主机一个从机的时候,从机的片选有时可以固定为有效电平而一直处于使能状态,那么SSEL就可以不要;此时如果再加上主机只给从机发送数据,那么SSEL和MISO都可以不要;如果主机只读取从机送来的数据,SSEL和MOSI都可以不要。
3线和2线的SPI大家要知道怎么回事,实际使用也是有应用的,但是当我们提及SPI的时候,一般都是指标准SPI,都是指4根线的这种形式。
SPI接口主要优点:
● 支持全双工操作
● 操作简单
● 数据传输速率较高
SPI接口主要缺点:
● 需要占用主机较多的线(每个从机都需要一条片选线)
● 只支持单个主机
● 没有指定的流控制
● 没有应答机制确认是否接收到数据
2. SPI接口工作特点
2.1 SPI接口采用主-从模式(Master-Slave)控制方式
两个SPI设备之间的通信必须由主设备(Master)来控制从设备(Slave)。主设备可以通过提供时钟信号以及对从设备进行片选来控制多个从设备。从设备本身并不产生时钟信号,其时钟信号由主设备提供。
2.2 SPI接口采用同步方式(Synchronous)传输数据
主设备会根据将要交换的数据来产生相应的时钟脉冲,时钟脉冲组成时钟信号,时钟信号通过时钟极性和时钟相位控制两个SPI设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的。
SPI有四种数据传输模式,如下表所示,主要差别在于:输出串行同步时钟极性(CPOL)和相位(CPHA)可以进行配置。
SPI mode | CPOL | CPHA | Comments |
0 | 0 | 0 | 时钟的空闲状态为低电平;上升沿采样 |
1 | 0 | 1 | 时钟的空闲状态为低电平;下降沿采样 |
2 | 1 | 0 | 时钟的空闲状态为高电平;下降沿采样 |
3 | 1 | 1 | 时钟的空闲状态为高电平;上升沿采样 |
2.3 SPI接口数据交换(Data Exchanges)
SPI设备间的数据传输又被称为数据交换。SPI协议规定一个SPI设备不能在数据通信过程中仅仅只充当发送者或者接收者,在每个时钟周期内,SPI设备都会发送并接收一个bit大小的数据,相当于该设备有一个bit大小的数据被交换。
从设备要接收到主设备发过来的控制信号,必须在此之前能够被主设备访问,所以主设备必须首先对从设备进行片选。
在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前进行采样。如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,因此,应用程序一般都会在SPI传输完数据后进行读取。
3. SPI协议四种工作模式
3.1 CPOL与CPHA
SPI通信的主机就是我们的单片机,在读写数据时序的过程中,有四种模式。要了解这四种模式,首先我们得学习两个名词。
CHOL
CPOL即Clock Polarity,就是时钟的极性。
时钟的极性是什么概念呢?
通信的整个过程分为空闲时刻和通信时刻,如果SCLK在数据发送之前和之后的空闲状态是高电平,那么就是CPOL=1;如果空闲状态SCLK是低电平,那么就是 CPOL=0。
CPHA
CPHA即Clock Phase,就是时钟的相位。
主机和从机要交换数据,牵涉到一个问题:主机在什么时刻输出数据到MOSI上而从机在什么时刻采样这个数据?
同步通信的一个特点就是所有数据的变化和采样都是伴随着时钟沿进行的,也就是说数据总是在时钟的边沿附近变化或被采样。而一个时钟周期必定包含了一个上升沿和一个下降沿,这是周期的定义所决定的,只是这两个沿的先后并无规定。
又因为数据从产生的时刻到它的稳定是需要一定时间的,那么,如果主机在上升沿输出数据到MOSI上,从机就只能在下降沿去采样这个数据了。反之如果一方在下降沿输出数据,那么另一方就必须在上升沿采样这个数据。
CPHA=1,就表示数据的输出是在一个时钟周期的第一个沿上,至于这个沿是上升沿还是下降沿,这要视CPOL的值而定,CPOL=1 那就是下降沿,反之就是上升沿。那么数据的采样自然就是在第二个沿上了。
CPHA=0,就表示数据的采样是在一个时钟周期的第一个沿上,同样它是什么沿由 CPOL 决定。那么数据的输出自然就在第二个沿上了。仔细想一下,这里会有一个问题:就是当一帧数据开始传输第一个 bit 时,在第一个时钟沿上就采样该数据了,那么它是在什么时候输出来的呢?有两种情况:一是 SSEL 使能的边沿,二是上一帧数据的最后一个时钟沿,有时两种情况还会同时生效。
3.2 四种工作模式
SPI接口允许同时在两线(MOSI和MISO)发送和接收数据。时钟极性(CPOL)和时钟相位(CPHA)是定义SPI所使用的时钟格式的主要参数。根据时钟极性(CPOL),SPI时钟可以反转或不变。时钟相位(CPHA)用于改变采样相位。
如果CPHA=0,那么将于第一个时钟边沿进行数据采样。
如果CPHA=1,那么无论时钟边缘上升或下降,将于第二个时钟边沿进行数据采样。
脉冲传输前和完成后都保持在低电平状态,即CPOL=0。在第一个边沿(上升沿)采样数据,第二个边沿(下降沿)输出数据,即CPHA=0。
脉冲传输前和完成后都保持在低电平状态,即CPOL=0。在第二个边沿(下降沿)采样数据,第一个边沿(上升沿)输出数据,即CPHA=1。
脉冲传输前和完成后都保持在高电平状态,即CPOL=1。在第一个边沿(下降沿)采样数据,第二个边沿(上升沿)输出数据,即CPHA=0。
脉冲传输前和完成后都保持在高电平状态,即CPOL=1。在第二个边沿(上升沿)采样数据,第一个边沿(下降沿)输出数据,即CPHA=1。
SPI读数据时序:
SPI写数据时序: