Serial Peripheral Interface (SPI)是主要应用在嵌入式系统中,用于短距离通信的同步串行通信接口规范。该接口是由摩托罗拉在1980年代中期开发的,已经成为事实上的标准。典型应用包括安全数字卡和液晶显示器。
SPI器件使用具有单个主机的主从结构,以全双工模式进行通信。主设备发起用于读取和写入的帧。通过使用单个从设备选择(SS)(有时称为芯片选择(CS))行的选择,可以支持多个从设备。
有时SPI被称为四线串行总线,与三线,两线和单线串行总线相反。SPI可以准确地描述为同步串行接口,但不同于同步串行接口(SSI)协议,后者也是一种四线同步串行通信协议。SSI协议采用差分信令,并且仅提供单个单一通信通道。SPI是一种主从和多从通信。
单主机到单从机:基本SPI总线示例
一、接口
SPI总线指定四个逻辑信号:
SCLK:串行时钟(主机输出)
MOSI:主机输出从机输入或主机输出从机输入(主机输出数据)
MISO:主机输入从机输出,或主机输入从机输出(从机的数据输出)
SS/CS:从机选择/片选(通常为低电平有效,从主机输出)
Slave Select(SS) Chip select (CS)
主机上的MOSI(或SDO)连接到从机上的MOSI(或SDI)。主设备上的MISO(或SDI)连接到从设备上的MISO(或SDO)。从选择(SS)与芯片选择(CS)具有相同的功能,并且代替寻址概念。
这些信号名称可用于标记主设备引脚和从设备引脚,以及它们之间的信号线。尽管它们在新产品上最受欢迎,但是较旧的产品可以具有非标准的SPI端口引脚(很少,了解一下)名称:
串行时钟:
SCLK:SCK
主输出→从输入(MOSI):
SIMO,MTSR-对应于主设备和从设备上的MOSI,相互连接
SDI,DI,DIN,SI-在从站设备上,连接到主机上的MOSI
SDO,DO,DOUT,SO-在主设备上,连接到从站上的MOSI
主输入←从输出(MISO):
SOMI,MRST-对应于主设备和从设备上的MISO,彼此连接
SDO,DO,DOUT,SO-在从属设备上,连接到主机上的MISO
SDI,DI,DIN,SI-在主设备上,连接到从站上的MISO
从机(从站)选择:
SS:SS,SSEL,CS,CS,CE,nSS,/SS,SS#
二、操作方式
SPI总线可以与一个主设备以及一个或多个从设备一起工作。如果使用单个从器件,则如果从器件允许,SS引脚可以固定为逻辑低电平。一些从机需要片选信号的下降沿来启动动作。一个例子是MaximMAX1242 ADC,它从高→低开始转换。对于多个从设备,每个从设备都需要来自主机的独立SS信号。
大多数从设备具有三态输出(逻辑0、逻辑1和高阻态),因此当未选择该设备时,其MISO信号将变为高阻抗(电断开)。没有三态输出的设备在不使用外部三态缓冲器的情况下无法与其他设备共享SPI总线段。
2.1数据传输
为了开始通信,总线主控器使用从属设备支持的频率(通常高达几兆赫兹)来配置时钟。然后,主机在从机选择线上(SS/CS)选择逻辑电平为0的从机。如果需要等待时间,例如模数转换,则主机必须在发出时钟周期之前至少等待该时间段。
在每个SPI时钟周期内,都会发生全双工数据传输。主机在MOSI线上发送一个位,从机读取它,而从机在MISO线上发送一个位,主机读取它。即使仅打算进行单向数据传输,也要保持此顺序。
传输通常涉及两个给定字长的移位寄存器,例如八位,一个在主机中,一个在从机中。它们以虚拟环形拓扑连接。数据通常先移出最高有效位。在时钟沿,主机和从机都移出一点,然后在传输线上输出到对方。在下一个时钟沿,在每个接收器处,从传输线采样该位,并将其设置为移位寄存器的新的最低有效位。在寄存器位移入和移入后,主设备和从设备已交换了寄存器值。如果需要交换更多数据,请重新加载移位寄存器,然后重复该过程。传输可以持续任何数量的时钟周期。完成后,主机停止切换时钟信号,通常取消选择从机。
传输通常由八位字组成。但是,其他字长也很常见,例如,用于触摸屏控制器或音频编解码器的16位字,例如Texas Instruments的TSC2101,或用于许多数模或模拟转换器的12位字。
总线上尚未通过其芯片选择线激活的每个从机都必须忽略输入时钟和MOSI信号,并且不应该驱动MISO(必须具有三态输出),尽管某些设备需要外部三态缓冲器来实现。
使用两个移位寄存器形成芯片间循环缓冲器的典型硬件设置
2.2时钟极性和相位
除设置时钟频率外,主机还必须配置与数据有关的时钟极性和相位。摩托罗拉SPI模块指南将这两个选项分别命名为CPOL和CPHA(用于时钟极性和相位),大多数供应商也都采用了这一约定。
时序图显示在下方。该时序将在下面进一步描述,并且适用于主设备和从设备。
CPOL确定时钟的极性。(简单说就是确定高低谁是空闲状态)
CPOL = 0 表示SPI时钟为低电平(SCLK=0)为空闲状态,那么有效状态就是SCLK处于高电平时。
CPOL = 1 表示SPI时钟为高电平(SCLK=1)为空闲状态,那么有效状态就是SCLK处于低电平时。
CPHA确定相对于时钟脉冲的数据位的时序(即相位)。
对于CPHA = 0,“输出”侧在前一个时钟周期的后沿更改数据,而“输入”侧在时钟周期的前沿(或之后不久)捕获数据。输出端保持数据有效,直到当前时钟周期的下降沿。对于第一个周期,第一位必须在时钟上升沿之前位于MOSI线上。(简单理解为:数据采样在时钟周期的第一个时钟边缘,数据发送在时钟周期的第二个时钟边缘)
另一种考虑方式是说CPHA = 0周期包括时钟空闲的半个周期,然后是时钟有效的半个周期。
对于CPHA = 1,“输出”侧在当前时钟周期的上升沿更改数据,而“输入”侧在时钟周期的下降沿(或之后)捕获数据。输出端保持数据有效,直到下一个时钟周期的上升沿为止。对于最后一个周期,从机保持MISO线有效,直到取消取消从机选择。(简单理解为:数据采样在时钟周期的第二个时钟边缘,数据发送在时钟周期的第一个时钟边缘)
另一种考虑方式是说CPHA = 1周期包括一个有效时钟(asserted)的半个周期,然后是一个时钟空闲的半周期。
MOSI和MISO信号通常在半个周期内稳定(在其接收点),直到下一个时钟转换为止。SPI主设备和从设备可以在该半周期的不同时间点对数据进行采样。这为主机和从机之间的通信通道增加了更多的灵活性。
显示时钟极性和相位的时序图,红线表示时钟前沿,蓝线表示后沿
2.3模式
极性和相位的组合通常称为模式,通常根据以下约定编号,其中CPOL为高阶位,CPHA为低阶位:
对于“ Microchip PIC”/“基于ARM”的微控制器(请注意,NCPHA是CPHA的反相版本):
对于PIC32MX:SPI模式配置CKP,CKE和SMP位。设置SMP位和CKP,CKE两位,如上表所示。
对于其他微控制器(最常见普遍):
另一种常用的符号表示模式为(CPOL,CPHA)元组。例如,值’(0,1)’将指示CPOL = 0和CPHA = 1。
请注意,在全双工操作中,主设备可以使用不同的模式进行发送和接收。例如,它可以在模式0中发送,并且可以同时在模式1中接收。
2.4独立的从机配置
在独立的从机配置中,每个从机都有一条独立的芯片选择线。这就是通常使用SPI的方式。主机一次只声明一个芯片选择(CS)。
对于主机的芯片选择引脚(CS)可能默认为未定义状态的系统,建议在电源和芯片选择线之间使用上拉电阻。当单独的软件例程初始化每个芯片选择并与其从机通信时,上拉电阻会阻止其他未初始化的从机响应。
由于从机的MISO引脚连接在一起,因此它们必须是三态引脚(高,低或高阻抗),当未选择从机时,必须使用高阻抗输出。通过添加由芯片选择信号控制的三态缓冲器芯片,可以在独立的从机配置中使用不支持三态的从设备。(由于每个从设备仅需要一条信号线进行三态控制,因此一个典型的标准逻辑芯片包含四个具有独立门输入的三态缓冲器,可用于将多达四个从设备连接到SPI总线。)
典型的SPI总线:主机和三个独立的从机
2.5菊花链配置
某些实现SPI的产品可能以菊花链配置连接,第一个从设备输出连接到第二个从设备输入,依此类推。每个从设备的SPI端口被设计为在第二组时钟脉冲期间发出SPI的精确副本。在第一组时钟脉冲期间接收到的数据。整个链充当通信移位寄存器;菊花链通常通过移位寄存器完成,以通过SPI提供一组输入或输出。每个从机在下一个时钟周期将输入复制到输出,直到低有效SS线变为高电平为止。这样的功能仅需要来自主机的一条SS线,而不需要每个从机的一条单独的SS线。
可能与SPI互操作的需要菊花链配置的其他应用包括SGPIO,JTAG 和两线接口。
菊花链式SPI总线:主从和协作从属
2.6有效沟通
某些从器件会因为设计原因忽略掉时钟脉冲数量大于指定数量的任何SPI通信。不同设备通常使用不同长度的SPI通信,例如,当SPI通过发出一个大小(可能为32位)的命令字并获得响应来访问数字IC的扫描链时,会获得一个具有不同的大小字回应(可能是153位,该扫描链中的每个引脚一个)。
2.7中断
SPI设备有时会使用另一条信号线将中断信号发送到主机CPU。例子包括触摸屏传感器的落笔中断,温度传感器的温度极限警报,实时时钟芯片,SDIO发出的警报以及手机声音编码解码器中的耳机插孔插入。SPI标准不涵盖中断;标准既不禁止也不禁止使用它们。换句话说,中断不在SPI标准的范围之内,可以选择独立于其执行。
2.8位协议主协议的示例
以下是将SPI协议作为SPI主设备进行bit-banging的示例(文章尾部会给bit-banging的简单解释),其中CPOL = 0,CPHA = 0,每次传输8位。该示例使用C编程语言编写。由于这是CPOL= 0,因此必须在芯片选择被激活之前将时钟拉低。必须在传输开始之前激活外围设备的片选线,这通常意味着将其切换为低电平,然后再禁用。当选择线(CS)为低电平时,大多数外设都允许或要求多次传输。在取消选择芯片之前,可能会多次调用此例程。
三、利弊
3.1优势
该协议的默认版本中为全双工通信
推挽驱动器(与漏极开路相反)提供了良好的信号完整性和高速
吞吐量比I²C或SMBus高。不限于任何最大时钟速度,可以实现更高的速度
完整的协议灵活性,适用于传输的位
不限于8位字
消息大小,内容和目的的任意选择
极其简单的硬件接口
通常,由于电路(包括上拉电阻器)较少,因此电源要求比I²C或SMBus低
没有仲裁或相关的故障模式-与CAN总线不同
从机使用主机时钟,不需要精密振荡器
从站不需要唯一地址-与I²C或GPIB或SCSI不同
不需要收发器-与CAN总线不同
仅使用IC封装上的四个引脚,并使用电路板布局或连接器中的导线,比并行接口少得多
每个设备最多有一个唯一的总线信号(片选);所有其他人都共享
信号是单向的,易于电隔离
简单的软件实现
3.2劣势
即使在三线制版本中,IC封装也需要比I²C更多的引脚
无带内寻址;共享总线上需要带芯片选择信号
从机没有硬件流控制(但是主机可以延迟下一个时钟沿以降低传输速率)
没有硬件从设备确认(主设备可能传输到任何地方并且不知道)
通常仅支持一个主设备(取决于设备的硬件实现)
没有定义错误检查协议
没有正式的标准,就不可能验证一致性
与RS-232,RS-485或CAN总线相比,只能处理短距离。(通过使用诸如RS-422的收发器,可以延长其距离)
信号路径中的光隔离器限制了MISO传输的时钟速度,因为时钟和数据之间增加了延迟。
现有许多变体,因此很难找到支持这些变体的开发工具(例如主机适配器)
SPI不支持热插拔(动态添加节点)。
必须使用带外信号来实现中断,或者使用类似于USB 1.1和2.0的定期轮询来伪造中断。
补充:在计算机工程和电气工程中,对于任何采用软件代替专用硬件来生成发送信号或处理接收信号的数据传输方法叫bit banging。软件直接设置和采样GPIO的状态(例如,微控制器上的引脚),并负责满足所有时序要求和信号协议排序。与bit banging相反,专用硬件(例如UART,SPI接口)满足这些要求,并在必要时提供数据缓冲区以放宽软件时序要求。bit banging可以以非常低的成本实现,并且常用于嵌入式系统。
例如:当需要使用微处理器上SPI模块,但发现引脚被占用时,那么可以通过SPI Bit-banging这个方法,通过GPIO端口模拟SPI接口引脚(CS、MOSI、MISO、CLK)上的时序信号来实现SPI协议,与对应SPI设备进行通信。
没有回复内容