天天看点

SPI必知必会

SPI,全称 Serial Peripheral Interface ,即 串行外设接口 的意思,其作为一种同步、全双工、主从模式通讯接口,广泛应用于各种片上微控制器与外设之间的通讯。本文简要说明了四线SPI接口应用中需要掌握的一些关键知识,以及在一主多从的情况下如何使用菊花链模式节省微控制器的引脚使用(需要器件支持菊花链)。

一、四线SPI接口介绍

顾名思义,四线SPI接口由四条通讯线路组成,它们分别是:SCLK、CS、MOSI、MISO。

SCLK为时钟线,时钟信号由主机发出,用于为通讯提供同步信号。 CS为片选信号线,当主机与特定外设进行通讯时,通过拉低或者拉高对应外设的片选信号来通知外设通讯开始或者结束。一般情况下每个SPI外设都需要一根片选信号线来控制是否与之进行通讯,当外设数量过多时,会占用过多微控制器引脚,对于支持菊花链模式的外设,可以通过后文的菊花链模式解决此问题。 MOSI与MISO分别为主出从入线与主入从出线。在SPI通讯中并没有读或者写的概念,主机与从机的信息交换是可以同时进行的(称之为全双工),每当一位信息通过MOSI线从主机发到从机,同时也会有一位信息通过MISO从从机进入主机。

二、SPI的通讯模式

依据空闲时的SCLK电平以及信号传递和采样的时机不同,我们可以将SPI分为4种不同的通讯模式。

在正式介绍通讯模式之前,有必要理清SPI通讯中的两个概念:CPOL(Clock polarity,时钟极性)以及CPHA(Clock phase,时钟相位)。笔者在初次接触SPI时,被这两个概念搞得头晕脑胀,直到看到维基百科上对这两个概念的解释才豁然开朗,现将英文原文引用如下:

CPOL determines the polarity of the clock. The polarities can be converted with a simple inverter.

CPOL=0 is a clock which idles at 0, and each cycle consists of a pulse of 1. That is, the leading edge is a rising edge, and the trailing edge is a falling edge.

CPOL=1 is a clock which idles at 1, and each cycle consists of a pulse of 0. That is, the leading edge is a falling edge, and the trailing edge is a rising edge.

CPHA determines the timing of the data bits relative to the clock pulses. Conversion between these two forms is non-trivial.

For CPHA=0, the “out” side changes the data on the trailing edge of the preceding clock cycle, while the “in” side captures the data on (or shortly after) the leading edge of the clock cycle. The out side holds the data valid until the trailing edge of the current clock cycle. For the first cycle, the first bit must be on the MOSI line before the leading clock edge.

An alternative way of considering it is to say that a CPHA=0 cycle consists of a half cycle with the clock idle, followed by a half cycle with the clock asserted.

For CPHA=1, the “out” side changes the data on the leading edge of the current clock cycle, while the “in” side captures the data on (or shortly after) the trailing edge of the clock cycle. The out side holds the data valid until the leading edge of the following clock cycle. For the last cycle, the slave holds the MISO line valid until slave select is deasserted.

An alternative way of considering it is to say that a CPHA=1 cycle consists of a half cycle with the clock asserted, followed by a half cycle with the clock idle.

引用出处:https://en.wikipedia.org/wiki/Serial_Peripheral_Interface

上文大体意思就是: CPOL决定时钟在空闲时的电平状态,CPOL=0时,时钟空闲时为低电平状态,通讯时钟脉冲的第一沿为上升沿,第二沿为下降沿;CPOL=1时,时钟空闲时为高电平状态, 通讯时钟脉冲的第一沿为下降沿,第二沿为上升沿 (这里默认低电平表示0,高电平表示1); CPHA决定通讯线路上数据传输和采样的时机,CPHA=0时数据在上一个通讯时钟脉冲的第二沿( trailing edge )被发送端传输到通讯线路,并且在本次通讯时钟脉冲的第一沿(leading edge)被接收端采样;CHPA=1时数据在本次通讯时钟脉冲的第一沿被发送端传输到通讯线路,并且在本次通讯时钟脉冲的第二沿被接收端采样。

CPOL与CPHA的不同组合便构成的SPI通讯的4种模式: ○ 模式0:CPOL=0,CPHA=0;

○ 模式1:CPOL=0,CPHA=1;

○ 模式2:CPOL=1,CPHA=1;

○ 模式3:CPOL=1,CPHA=0;

结合下图可以更好的理解:

SPI必知必会

CPOL与CPHA的各种组合

以模式0为例子:

由于CPOL=0,所以从上图中我们可以发现在空闲时SCLK为低电平,每次通讯时钟脉冲的第一沿为上升沿,第二沿为下降沿。

又由于CPHA=0,所以从上图中我们发现每个数据在当前通讯时钟脉冲的上一个脉冲的第二沿 (即每个下降沿,蓝色竖线位置) 被传输,在当前通讯时钟脉冲的第一沿 (即每个上升沿,红色竖线位置) 被采样。

而第一个数据由于在它之前没有通讯时钟脉冲,所以需要在通讯开始之前先传输到数据线上。

三、一主多从通讯

通常在SPI线路上会存在一个主机以及一个或者多个从机,每个从机与主机之间通过独立的片选线(CS/SS)来通知是否进行一次通讯。如下图所示:

SPI必知必会

一主多从普通方式连接

随着通讯线路上从机数目的增加,主机用于控制片选信号的引脚会越来越多,一般情况下,我们可以通过使用串转并芯片来节省引脚开销,如下图所示:

SPI必知必会

使用串转并芯片节省引脚开销

对于部分支持菊花链模式的SPI接口器件(ADI家的很多SPI芯片都支持,具体需要参考数据手册),还可以通过菊花链的方式来节省一主多从情况下的引脚开销,连接方式如下图所示:

SPI必知必会

菊花链模式

在菊花链模式下,所有从机的片选信号都连接在一起,第一个从机的MOSI口连接主机,每个从机的数据输出口MISO都连接下一个从机的数据输入口MOSI,最后一个从机的数据输出口MISO连接主机的数据输入口MISO。当主机需要给从机传输一字节数据,主机先发出8个时钟信号,一字节数据被传输给SLAVE1,再经过8个时钟信号,这一字节数据从SLAVE传输给SLAVE2,如此下去,数据最终会到达最后一个从机SLAVE4。当某个从机需要传输数据给主机,我们以SLAVE3为例,首先SLAVE3上的一字节数据在8个时钟后被传输给SLAVE4,再经过8个时钟,一字节数据就被从SLAVE4传送给了主机。

以上三种一主多从方式各有优缺点。

○ 方式一连接简单,适合从机不多的情况下;

○ 方式二适合对通讯速度有一定要求的情况下,缺点是增加了物料成本;

○ 方式三下传输一个字节到从机时,对于菊花链末尾的从机,数据需要更多通讯脉冲才能到达,降低了通讯效率,并且也不是所有芯片都支持菊花链模式,但是此方法可以在不额外增加芯片的情况下节省引脚开销,因此适用于对通讯速度不敏感但是对成本敏感的应用场合。

参考文献

[1]维基百科.Serial Peripheral Interface[EB/OL].https://en.wikipedia.org/wiki/Serial_Peripheral_Interfac,2019-07-03.

[2]Piyu Dhaker.Introduction to SPI interface[J].电子产品世界,2019,26(6):82-85.