SPI 是英语 Serial Peripheral Interface 的缩写,望文生义便是串行外围设备接口。SPI 是一种高速的、全双工、同步通讯总线,规范的 SPI 也仅仅运用 4 个引脚,常用于单片机和 EEPROM、FLASH、实时时钟、数字信号处理器等器材的通讯。SPI 通讯原理比 I2C要简略,它主要是主从方法通讯,这种方式一般只要一个主机和一个或许多个从机,规范的 SPI 是 4 根线,分别是 SSEL(片选,也写作 SCS)、SCLK(时钟,也写作 SCK)、MOSI(主机输出从机输入Master Output/Slave Input)和 MISO(主机输入从机输出 Master Input/Slave Output)。
SSEL:从设备片选使能信号。假如从设备是低电平使能的话,当拉低这个引脚后,从设备就会被选中,主机和这个被选中的从机进行通讯。
SCLK:时钟信号,由主机发生,和 I2C通讯的 SCL 有点相似。
MOSI:主机给从机发送指令或许数据的通道。
MISO:主机读取从机的状况或许数据的通道。
在某些状况下,咱们也能够用 3 根线的 SPI 或许 2 根线的 SPI 进行通讯。比方主机只给从机发送指令,从机不需求回复数据的时分,那么 MISO 就能够不要;而在主机只读取从机的数据,不需求给从机发送指令的时分,那 MOSI 就能够不要;当一个主机一个从机的时分,从机的片选有时能够固定为有用电平而一向处于使能状况,那么 SSEL 就能够不要;此时假如再加上主机只给从机发送数据,那么 SSEL 和 MISO 都能够不要;假如主机只读取从机送来的数据,SSEL 和 MOSI 都能够不要。
3 线和 2 线的 SPI 咱们要知道怎么回事,实际运用也是有使用的,可是当咱们提及 SPI的时分,一般都是指规范 SPI,都是指 4 根线的这种方式。
SPI 通讯的主机也是咱们的单片机,在读写数据时序的进程中,有四种方式,要了解这四种方式,首要咱们得学习以下两个名词。
CPOL:Clock Polarity,便是时钟的极性。时钟的极性是什么概念呢?通讯的整个进程分为闲暇时刻和通讯时刻,假如 SCLK 在数据发送之前和之后的闲暇状况是高电平,那么便是CPOL=1,假如闲暇状况 SCLK 是低电平,那么便是 CPOL=0。
CPHA:Clock Phase,便是时钟的相位。
主机和从机要交流数据,就牵涉到一个问题,即主机在什么时刻输出数据到 MOSI 上而从机在什么时刻采样这个数据,或许从机在什么时刻输出数据到 MISO 上而主机什么时刻采样这个数据。同步通讯的一个特色便是一切数据的改变和采样都是伴随着时钟沿进行的,也便是说数据总是在时钟的边缘邻近改变或被采样。而一个时钟周期必定包含了一个上升沿和一个下降沿,这是周期的界说所决议的,仅仅这两个沿的先后并无规则。又由于数据从发生的时刻到它的安稳是需求必定时刻的,那么,假如主机在上升沿输出数据到 MOSI 上,从机就只能在下降沿去采样这个数据了。反之假如一方在下降沿输出数据,那么另一方就必须在上升沿采样这个数据。
CPHA=1,就表明数据的输出是在一个时钟周期的第一个沿上,至于这个沿是上升沿仍是下降沿,这要视 CPOL 的值而定,CPOL=1 那便是下降沿,反之便是上升沿。那么数据的采样天然便是在第二个沿上了。
CPHA=0,就表明数据的采样是在一个时钟周期的第一个沿上,相同它是什么沿由 CPOL决议。那么数据的输出天然就在第二个沿上了。细心想一下,这儿会有一个问题:便是当一帧数据开端传输第一个 bit 时,在第一个时钟沿上就采样该数据了,那么它是在什么时分输出来的呢?有两种状况:一是 SSEL 使能的边缘,二是上一帧数据的最终一个时钟沿,有时两种状况还会一起收效。
咱们以 CPOL=1/CPHA=1 为例,把时序图像出来给咱们看一下,如图 15-1 所示。
图15-1 SPI 通讯时序图(一)
咱们看图 15-1 所示,当数据未发送时以及发送结束后,SCK 都是高电平,因而 CPOL=1。能够看出,在 SCK 第一个沿的时分,MOSI 和 MISO 会发生改变,一起 SCK 第二个沿的时分,数据是安稳的,此时采样数据是适宜的,也便是上升沿即一个时钟周期的后沿锁存读取数据,即 CPHA=1。留意最终最荫蔽的 SSEL 片选,这个引脚一般用来决议是哪个从机和主机进行通讯。剩下的三种方式,咱们把图像出来,简化起见把 MOSI 和 MISO 合在一起了,咱们细心对照看看研究一下,把一切的理论进程都弄清楚,有利于你对 SPI 通讯的深刻理解,如图 15-2 所示。
图15-2 SPI 通讯时序图(二)
在时序上,SPI 是不是比 I2C要简略的多?没有了开始、中止和应对,UART 和 SPI 在通讯的时分,只担任通讯,不论是否通讯成功,而 I2C却要经过应对信息来获取通讯成功失败的信息,所以相对来说,UART 和 SPI 的时序都要比 I2C简略一些。