SPI 时序

SPI接口是什么?

SPI ( Serial Peripheral Interface,串行外设接口)是一种同步、串行通讯接口规格,常用于短距离通讯,主要是在嵌入式系统中。此接口由Mototola公司推出,已成为一种事实标准(没有统一的协议规范,但是基于其广泛的使用,根据实际使用中大家通用的习惯形成了一个类似行规的标准)。

SPI典型的应用场景包括SD卡(SD接口中包含SPI接口)和液晶显示。

SPI是一种高速的,全双工,同步的通信总线。分为主(master)、从(slave)两种模式,一个SPI通讯系统需要包含一个(且只能是一个)maser(主设备),一个或多个slave(从设备)。

SPI接口的读写操作,都是由master发起。当存在多个从设备时,通过各自的片选(slave select)信号进行管理。

硬件开发人员设计、提供的SPI接口,其实只是一个数据读写通道 ,具体读写数据所代表的意义需要在应用中定义。不像SD接口那样,对于命令有着明确详细的定义。

SPI接口都包含哪些IO线?

除了供电、接地两个模拟连接以外,SPI总线定义四组数字信号:
- 接口时钟SCLK(Serial Clock,也叫SCK、CLK),master输出至slave的通讯时钟。
- MOSI( Master Output Slave Input,也叫SIMO、MTSR、DI、DIN、SI)自master输出至slave的数据线。
- MISO (Master Input Slave Output,也叫SOMI、MRST、DO、DOUT、SO)自slave输出至master的数据线。
- SS(Slave select,也叫nSS、CS、CSB、CSN、EN、nSS、STE、SYNC)master对slave的片选信号,自master输出至slave,低有效。

注释:
- 两条数据线与SCLK的时序关系详见下文。
- SPI接口的片选信号一般都是低有效的,尽管有的地方命名为SS/CS而有的地方命名为nSS/nCS。(当然了,对于一个合格的硬件开发者,低电平有效的信号都应该在命名时加上个_n)

SPI接口如何连接?
在master/slave上,都能找到SCLK/MISO/MOSI/SS四个接口。

当只有一个maser、一个slave时,将master与slave上名字相同的4对接口两两互联,即可完成了接口的互联。如下图所示:

注释:
- 某些芯片产品上,对SPI两条数据线的命名为SDO/SDI。此时需要将master的SDO连接到slave的SDI,将master的SDI连接到slave的SDO。
- 当系统中只有一个SLAVE时,且SLAVE的SS是低电平有效时,Slave的SS接口直接接地也不影响通讯。当然了,实际应用中,如果要考虑到功耗等因素,处理起来或许就不那么简单了,具体问题具体分析。
- 有的芯片SPI接口的SS信号,对电平敏感,通讯前确保SS是低电平就好;而有的SPI芯片的SS信号是下降沿敏感的。比如Maxim MAX1242 ADC,开始通讯前,需要SS信号有一个高→低的翻转。
- 多数SLAVE的MISO接口有三态输出(高电平、低电平、高阻),当SS无效时,它们的MISO信号输出高阻态(啥都没接的状态)。若SLAVE的MISO接口不支持高阻输出,则无法应用于多SLAVE的SPI系统。

当存在一个master、多个slave时(注意,当master上有n个SS时,对应可以连接n个slave),连接方式如下图所示,注意SCLK/MOSI/MISO三个接口采取复用模式连接,不同SS单独连接对应的slave,SS信号绝不可复用:

SPI 时序
SPI接口如何进行数据传输?

SPI接口是一种典型的全双工接口,通过同步时钟SCLK的脉冲将数据一位位地传送。所以在开始通讯前,master首先要配置接口时钟(确定其通讯频率是SLAVE可以支持的,通常为数兆赫兹)。

当MASTER片选一个SLAVE时,每向SLAVE发送一个周期的SCLK信号,都会有1bit的数据从MOSI发送至slave,与此同时,slave每收到一个周期的SCLK信号,都会从MISO向master发送1bit的数据。这种全双工通讯,是由硬件保证的(MASTER与HOST中各有一个移位寄存器作为收发数据的缓存)。

SPI是一个很开放的接口,指令解析、帧大小、LSB/MSB(Least Significant Bit/Most Significant Bit)等规则并没有一个完善的定义,不同的SPI设备在这些方面的定义会有不同:

不同于SD等接口的严谨的command定义,SPI接口的master与slave之间的命令、数据解析都可以自定义,只要保证master与slave之间采用相同的规则就好。

不同SPI芯片,每次连续传输的数据量的大小(取决于MASTER、SLAVE中缓存最小的那个)常常不同。当一次连续通讯的的数据量超过帧的大小时,会出现数据丢失的现象。所以,每完成1帧的传输后,MASTER会停止接口时钟输出,master、slave读取、处理收到的数据,然后进行下一帧的传输。

在SPI接口协议中,并没有中断的定义,但是实际应用中,我们可以使用接口中断提高接口通讯速度。比如SLAVE是负责数据数据加解密的,MASTER下发一组明文给SLAVE加密,如果此时有个SLAVE输出到MASTER的中断信号,那么MASTER可以清楚的知道何时SLAVE完成了数据处理并读出处理结果,不必通过查询一遍遍的等待结束。

SPI接口的变形

以上我们讲的SPI接口,一个时钟周期可以进行全双工的1bit数据通讯。实际应用中,如果对于全双工的需求不高,而且期望提高通讯速度的话,SPI有两种常见变形可供选用:

一、 两线模式的SPI

CLK与SS信号保持不变,MOSI与MISO则变形为DATA_0与DATA_1。

DATA_0与DATA_1是输入输出状态由MASTER配置的数据管脚:当MASTER打算向SLAVE中写数据时,处于输出状态;当MASTER打算从SLAVE读数据时,处于输入状态。

二、 四线模式的SPI

CLK与SS信号保持不变,MOSI与MISO删除,新增四条数据线DATA0~3。

DATA0_~3是输入输出状态由MASTER配置的数据管脚:当MASTER打算向SLAVE中写数据时,处于输出状态;当MASTER打算从SLAVE读数据时,处于输入状态。

这样一来,大大提高了单方向上数据传输的速度,但是增加了接口资源的开销。

SPI接口时序配置
此部分参考crifan的博客。
SPI的接口时序配置由两个参数决定:
1、 CPOL,clock polarity,译作时钟极性。
2、 CPHA,clock phase,译作时钟相位。
CPOL具体说明:
CPOL用于定义时钟信号在空闲状态下处于高电平还是低电平,为1代表高电平,0为低电平。
知道这些就好,很简单的一个概念 。如果存在疑问,结合下面的时序图理解就好。
CPHA具体说明:
首先,在同步接口中,肯定存在一个接口时钟,用来同步采样接口上数据的。
CPHA就是用来定义数据采样在第几个边沿的。为1代表第二个边沿采样,为0代表第一个边沿采样。
以上两个参数,总共有四种组合:
MODE 0: CPOL=0, CPHA=0 ,CLK限制状态为低电平,第一个边沿采样,所以是上升沿采样。
MODE 1: CPOL=0, CPHA=1,CLK限制状态为低电平,第二个边沿采样,所以是下降沿采样。
MODE 2: CPOL=1, CPHA=0 ,CLK限制状态为高电平,第一个边沿采样,所以是下降沿采样。
MODE 3: CPOL=1, CPHA=1 ,CLK限制状态为高电平,第二个边沿采样,所以是上升沿采样。
具体见下图。
注意,假设是上升沿采样,那么MISO/MOSI就应该上升沿翻转,这样错开半个时钟周期以保证建立时间保持时间。
忘了这个的建议去翻翻数电。
SPI 时序