
[导读] 前面总结了UART/I2C的技术要点,SPI相对I2C而言,比较简单。本文来总结一下SPI总线我的认为比较重要的一些技术要点。node
什么是SPI?
SPI(Serial Peripheral Interface) 是一种嵌入式系统中应用普遍的同步串行通讯、主从架构式总线接口。80年代由摩托罗拉开发,已成为事实标准。web
这句话里有几个关键要点:编程
-
同步 -
串行 -
通讯 -
主从 -
总线
要理解这些要点,先上图,一图胜千言:安全
常见的SPI接口有这样几个引脚:微信
-
SCLK: 串行时钟,老是主端负责输出(Master)。老是由主端控制该信号,从端为输入采样。 -
MOSI:主出从入(Master Output Slave Input)。老是由主端控制该信号,从端为输入采样。 -
MISO:主入从出(Master Input Slave Output)。老是由从端控制该信号,主端为输入采样。 -
:从选择信号(Slave Select)。老是由主端控制该信号,从端为输入采样。
要理解上面这几个信号引脚的内涵,结合时序图,就比较容易理解了:数据结构
数字电路中,同步电路是一种经过时钟信号同步存储元件状态变化的数字电路。架构
-
主端>从端:app
-
:主端发送低电平先选通从芯片,上面加帽表示低有效。啥意思呢?就是这个脚低电平期间选中从设备,主设备发送的时序报文对选中的从设备有效,其余挂载在总线上的设备忽略总线报文。 -
SCLK/SCK:发送同步移位时钟。 -
MOSI:将数据按照SCLK移位时钟周期,将数据移位发送至该引脚。被 选中的从设备依照SCLK/SCK上升沿或者降低沿,按位采样,通常字节的高位在前,具体须听从芯片手册时序定义。从端依赖SCK/SCLK对MOSI上的信号逐位采样,采样的位依次进入接收移位寄存器,完成对字节的重组。当字节接收完成,再由后续数字电路进行处理。后续处理芯片实现各异,如是一个单片机则可能引起中断请求,如是特定功能数字芯片,则依据接收报文完成相应的功能处理。 -
从端>主端:less
-
:主芯片发送低电平先选通从芯片。 -
SCLK/SCK:发送同步移位时钟。 -
MISO: 相似MOSI发送位流,依赖SCLK/SCK将位流依次发送至引脚上,主设备在同步时钟的跳变边沿采样该引脚,进而移位接收位流。 -
采样沿:SPI采用边沿触发采样,对MOSI/MISO上的位序列进行采样,实际芯片有下面两种方式:编辑器
-
CPHA=0,表示上升沿采样 -
CPHA=1,表示降低沿采样
通过这些描述,解释了串行、同步、主从的概念。
什么是通讯?
众所周知,计算机是一个二进制系统,全部的信息都是基于0/1进行编码、进行运行管理的。由0/1编码进而表示字符、文本、文件。那么SPI实现了底层的0/1码流的传递机制,能传递0/1,经过应用控制、很天然就能交换信息。
这是否有种一辈子2、二生3、三生万物的意思呢?
因此在研究各类通讯总线的物理层时,就其本质而言都是界定如何对信息流的基本单元0/1进行编码、解码、收发的。
什么是SPI总线呢?
对于SPI总线而言,有两种拓扑:
-
独立片选拓扑:总线拓扑须要更多片选引脚,但通讯效率高。信息直接在主从间传递 -
菊花链拓扑:节省引脚,但效率较低,数据信息传递须要级联传递。
独立片选拓扑

如上图:
-
每一个从设备都有独立的片选引脚 ,主机同一时间段内,与一个从设备进行通讯,也即选中一个从设备。 -
MOSI/MISO/SCLK并联在一块儿 -
MISO须是三态门,当从设备未选中时,该脚须设置为高阻态,而不能是输出态,不然会影响总线,这句话对于多从设备应用而言,请重点理解。尤为当用GPIO模拟SPI应用而言,须特别注意这一点! -
对于MOSI/SCLK,虽然并联在一块儿,可是因为仅一个输出,多输入。输入引脚的阻抗原本就是高阻,因此不会有问题。
菊花链拓扑
有的芯片支持菊花链拓扑链接,这是何意呢?啥是菊花链呢?在电气和电子工程中,雏菊链是一种布线方案,其中多个设备按顺序或按环链接在一块儿,相似于雏菊的花环。其信息传递在链中流转。
那么对于SPI总线而言,具体是如何链接的呢?
其本质就是主从级联:
-
共用SCLK/ ,这两根线并联在一块儿 -
主MOSI连次级MOSI,次级MISO连次次级的MOSI....,而后由最后一级的MISO再送回到主设备的MISO。
-
某级从设备在第N组时钟周期用MISO发送第N-1组时钟周期接收到位给下级设备,同时把本组时钟周期期间前级设备经过MISO移位进来的数据保存按位序保存进接收寄存器中。其实在底层是按照位进行流转的。这个传递过程当 变为高电平时则中止,各从设备当前寄存器中内容锁定了。具体应用时,若是要将某一字节传递到某个设备,则须要组织好传递的码流,以及时钟控制。 -
对于菊花链数据传递过程,其实相似于击鼓传花游戏。鼓点的做用就是同步时钟,花则是要传递的信息数据,鼓点的起停则相似于片选控制,惟一不一样的是,击鼓传花传的是一朵花,而菊花链总线传递的是二进制流,至于从设备究竟要怎么应用这些数据流,则具体实现各异。
其实熟悉数据结构的同窗可能会想,这个拓扑咋很像首尾相连的环形链表呢?确实很像,虽然没啥直接关系。
引脚的别名
对于SPI的引脚,不一样的芯片厂商在DATASHEET上定义的引脚名字可能不一样,这里将常见的别名整理一下:
-
MOSI主出从入:
-
SIMO, MTSR -
SDI, DI, DIN, SI -
SDO, DO, DOUT, SO -
MISO主入从出
-
SOMI, MRST -
SDO, DO, DOUT, SO -
SDI, DI, DIN, SI -
片选
-
S̅S̅, SSEL, CS, C̅S̅, CE, nSS, /SS, SS
不少功能芯片可能没有MISO引脚,也即没法支持读操做,仅仅支持写入操做。
SPI优缺点
优点:
-
传输速度高,SPI并未限定最高速度。有的应用甚至高达10Mbps。 -
全双工,但有的芯片没有MISO,则不支持。 -
相较于I2C而言,SPI简单一些,编程容易,控制简单 -
信号为单向信号,易于电隔离。尤为在工业产品中电气隔离在抗干扰方面、以及本质安全方面要求比较高。 -
没有复杂的总线仲裁机制,相对健壮。
劣势:
-
无寻址机制,须要额外的片选信号 -
SPI总线对于多从模式支持很差,两种拓扑都没法支持不少从设备,并且系统中也仅有一个主设备 -
没有定义错误检测机制 -
事实上的标准,但无正式标准 -
与I2C同样也只是芯片间总线,没法长距离通讯
总结一下
或许有人会说I2C比SPI更好更为优越,SPI则相对简单粗暴。事实上作这样的对比,我的认为是没什么意义。
这两种协议在鲁棒性方面都比较好。I²C之因此优雅,是由于它在极简的基础架构(两线SDA/SCL)上提供了很是先进的功能,例如自动多主机冲突处理和内置地址管理。可是它相对却很是复杂,在性能上或许有所欠缺。
另外一方面,SPI很是易于理解和实施,而且为扩展提供了很大的灵活性。SPI的优雅之处在于简单性。SPI应该被视为构建用于IC之间通讯的自定义协议栈的良好接口。所以,尽管使用SPI可能须要作更多的工做,但能够提供更高的数据传输性能和灵活的自由度。
若是必定要比较,则SPI和I2C都为低速设备的通讯提供了良好的接口支持,可是SPI更适合点对点传输数据流的应用,而I²C则更适合于多主机“寄存器访问”应用。
正确使用这两种协议可提供相同级别的鲁棒性,芯片厂商对两种接口都普遍支持。市面上提供了大量的外围芯片,好比 EEPROM,ADC,DAC,RTC,微控制器,传感器,LCD控制器,这些芯片主要提供I²C,SPI或同时支持这2个接口。
本文辛苦原创总结,若是以为有价值也请帮忙点赞/在看/转发支持,不胜感激!
—END—
本文分享自微信公众号 - 嵌入式客栈(embInn)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。