1.SPI总线协议简介
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)。
在某些情况下,我们也可以用3根线的SPI或者2根线的SPI进行通信。
3根线的SPI:主机只给从机发送命令,从机不需要回复数据的时候,那么MISO就可以不要;而在主机只读取从机的数据,不需要给从机发送指令的时候,那MOSI就可以不要。即:单向通信,省掉一根数据线。
2根线的SPI:当一个主机一个从机的时候,从机的片选有时可以固定为有效电平而一直处于使能状态,那么SSEL就可以不要;此时如果再加上主机只给从机发送数据,那么SSEL和MISO都可以不要;如果主机只读取从机送来的数据,SSEL和MOSI都可以不要。即:只有主从两个设备单向通信,省掉一根片选和一根数据线。
2.SPI的四种工作模式
先理解两个概念
CPOL
CPOL即Clock Polarity,就是时钟的极性。
通信的整个过程分为空闲时刻和通信时刻,如果SCLK在数据发送之前和之后的空闲状态是高电平,那么就是CPOL=1;如果空闲状态SCLK是低电平,那么就是 CPOL=0。
CPHA
CPHA即Clock Phase,就是时钟的相位。
主机和从机要交换数据,牵涉到一个问题:主机在什么时刻输出数据到MOSI上而从机在什么时刻采样这个数据?
CPHA=1,就表示数据的输出是在一个时钟周期的第一个沿上,至于这个沿是上升沿还是下降沿,这要视CPOL的值而定,CPOL=1 那就是下降沿,反之就是上升沿。那么数据的采样自然就是在第二个沿上了。
CPHA=0,就表示数据的采样是在一个时钟周期的第一个沿上,同样它是什么沿由 CPOL 决定。那么数据的输出自然就在第二个沿上了。仔细想一下,这里会有一个问题:就是当一帧数据开始传输第一个bit 时,在第一个时钟沿上就采样该数据了,那么它是在什么时候输出来的呢?有两种情况:一是 SSEL使能的边沿,二是上一帧数据的最后一个时钟沿,有时两种情况还会同时生效。
四种工作模式
以CPOL=1,CPHA=1为例,把时序图画出来给大家看一下,如图1所示。
图1 SPI通信时序图(一)
大家看图1,当数据未发送时以及发送完毕后,SCK都是高电平,因此CPOL=1。可以看出,在SCK第一个沿的时候,MOSI和MISO会发生变化。同时SCK第二个沿的时候,数据是稳定的,此刻采样数据是合适的,也就是上升沿即一个时钟周期的后沿锁存读取数据,即CPHA=1。注意最后最隐蔽的SSEL片选,这个引脚通常用来决定是哪个从机和主机进行通信。
剩余的三种模式,也把图画出来了。简化起见把MOSI和MISO合在一起了,大家仔细对照看看研究一下,把所有的理论过程都弄清楚,有利于你对SPI通信的深刻理解,如图2所示。
在时序上,SPI是不是比I2C要简单的多?
没有了起始、停止和应答,UART和SPI在通信的时候,只负责通信,不管是否通信成功;而I2C却要通过应答信息来获取通信成功失败的信息。相对来说,UART和SPI的时序都要比I2C简单一些。常见通过MCU单片机使用SPI的程序员,可以使用提供的函数库直接对四种模式加以设置。
关于SPI四种模式的理解,还可以通过这位博主的软件模拟加深理解。软件模拟SPI接口程序代码(4种模式)_内陆的咸水鱼的博客-CSDN博客_模拟spi