序列周邊介面








SPI匯流排:單一主机對單一从机





SPI匯流排:單一主机對複合从机


串行外设接口(Serial Peripheral Interface Bus,SPI),是一种用于短程通信的同步串行通信接口规范,主要应用于单片机系统中。类似I²C。
这种接口首先被Motorola(摩托罗拉)公司开发,然后发展成了一种行业规范。典型应用包含SD卡和液晶显示器。
SPI设备之间使用全双工模式通信,包含一个主机和一个或多个从机。主机产生待读或待写的帧数据,多个从机通过一个片选线路
决定哪个来响应主机的请求。
有时SPI接口被称作四线程接口,SPI准确来讲称为同步串行接口,但是与同步串行接口协议(SSI)不同,SSI是一个四线程
同步通信协议,但是使用差分信号输入同时仅提供一个单工通信信道。




目录






  • 1 接口


  • 2 操作


    • 2.1 数据传输


    • 2.2 独立的从设备配置


    • 2.3 中断


    • 2.4 SPI代码示例




  • 3 优点和缺点


    • 3.1 优点


    • 3.2 缺点




  • 4 參見


  • 5 外部連結





接口


SPI总线规定了4个保留逻辑信号接口:



  • SCLK(Serial Clock):串列时脈,由主机发出

  • MOSI(Master Output,Slave Input):主机输出从机输入信号,由主机发出

  • MISO(Master Input,Slave Output):主机输入从机输出信号,由从机发出

  • SS(Slave Selected):選擇信号,由主机发出,一般是低電位有效


尽管上面的引脚名称是最常用的,但在过去,有时会使用其他引脚命名约定,因此旧IC产品的SPI端口引脚名称可能有所不同。



操作


SPI总线可以在有单个主设备与一个或多个从设备的情况下运行。


如果使用单个从设备,则如果从设备允许,SS引脚可以固定为逻辑低电平。 一些从设备需要片选信号的下降沿来启动一个动作。 Maxim MAX1242 ADC就是一个例子,它在高→低转换时开始转换。 对于多个从设备,每个从设备都需要一个独立的SS信号。


大多数从属设备​​具有三态输出的特性,所以当器件未被选中时,它们的MISO信号变为高阻抗 ( 逻辑断开 )。 没有三态输出的器件不能与其他器件共享SPI总线段; 只有一个这样的从设备可以与主设备交换信息。



数据传输


为了开始通信,总线上的主设备需要使用从设备支持的频率来配置时钟,通常是几个MHz。 然后主设备将某根连接到从设备SS的线上的信号置为0来选中这个从设备。 如果需要等待一段时间(例如进行模数转换),主器件在发出时钟周期之前必须至少等待这段时间。


在每个SPI时钟周期内,都会发生全双工数据传输。 主设备在MOSI线上发送一个位,从设备读取它,同时从机在MISO线上发送一位数据,主机读取它。 即使只有单向数据传输的目的,工作方式仍然是双工的。


传输通常会使用到给定字长的两个移位寄存器,一个在主设备中,一个在从设备中; 它们以虚拟环形拓扑连接。 数据通常先移出最大的位。 在时钟边沿,主机和从机均移出一位,然后在传输线上输出给对方。 在下一个时钟沿,每个接收器都从传输线接受该位,并设置为移位寄存器的新的最低有效位。 在完成这样一个移出-移入的周期后,主机和从机就交换寄存器中的一位。 如果需要更多的数据交换,则需要重新加载移位寄存器并重复该过程。 传输可能会持续任意数量的时钟周期。 完成后,主设备会停止切换时钟信号,并通常会取消选择从设备。


传输寄存器通常包含8位。 但是,其他字长也很常见,例如,用于触摸屏控制器或音频编解码器的16位(如德州仪器的TSC2101),或者用于许多数字-模拟或模拟-数字转换的12位。


未使用片选线激活的总线上的每个从设备必须忽略输入时钟和MOSI信号,并且不得驱动MISO。



独立的从设备配置


在独立的从设备配置中,每个从设备都有独立的芯片选择线。 强烈建议在每个独立器件上使用电源和片选线之间使用上拉电阻,以减少器件之间的串扰。
这是SPI通常被使用的方式。 由于从机的MISO引脚连接在一起,因此它们需要为三态引脚(高,低或高阻抗)。



中断


SPI从设备有时会使用另一条信号线将中断信号发送到主设备的CPU。 例子包括来自触摸屏传感器的笔下中断,来自温度传感器的热限制警报,实时时钟芯片发出的警报, SDIO以及来自手机中声音编解码器的耳机插孔插入。 SPI标准中并不包括中断。 中断的使用既不被禁止也不被标准规定。



SPI代码示例


/*
* 通过SPI协议在主设备和从设备之间交换一个字节的数据
*
* Polarity and phase are assumed to be both 0, i.e.:
* - 输入数据在SCLK的上升沿捕获。
* - 输出数据在SCLK的下降沿传播。
*
* 返回接收到的一字节的数据
*/
uint8_t SPI_transfer_byte(uint8_t byte_out)
{
uint8_t byte_in = 0;
uint8_t bit;

for (bit = 0x80; bit; bit >>= 1) {
/* Shift-out a bit to the MOSI line */
write_MOSI((byte_out & bit) ? HIGH : LOW);

/* Delay for at least the peer's setup time */
delay(SPI_SCLK_LOW_TIME);

/* Pull the clock line high */
write_SCLK(HIGH);

/* Shift-in a bit from the MISO line */
if (read_MISO() == HIGH)
byte_in |= bit;

/* Delay for at least the peer's hold time */
delay(SPI_SCLK_HIGH_TIME);

/* Pull the clock line low */
write_SCLK(LOW);
}

return byte_in;
}


优点和缺点



优点



  • SPI协议默认是全双工通信。

  • 推挽式驱动器 (与开路漏极相反)可提供良好的信号完整性和高速度

  • 比I²C或SMBus更高的吞吐量 。 不限于任何最大时钟速度,可实现高速运行

  • 完整的传输位协议灵活性

    • 不限于8位字

    • 消息大小,内容和目的的任意选择



  • 非常简单的硬件接口

  • 由于电路较少(包括上拉电阻),因此通常比I²C或SMBus的功耗要低,

  • 没有仲裁或相关的失败模式

  • 从设备直接使用主时钟,不需要精密振荡器

  • 从站不需要唯一的地址 - 不像I²C或GPIB或SCSI

  • 不需要收发器

  • IC封装只使用四个引脚,而电路板布局或连接器则少于并行接口

  • 每个器件至多有一个独特的总线信号(芯片选择);其他信号均可以共享

  • 信号是单向的,允许简单的电偶分离

  • 简单的软件实现



缺点



  • 即使是三线式SPI,也需要比I²C更多的IC封装引脚

  • 没有带内寻址; 共享总线上需要带外片选信号

  • 从机没有硬件流量控制 (但主机可以延迟下一个时钟边沿以降低传输速率)

  • 没有硬件从设备确认(主机可能无法传输并且不知道这一点)

  • 通常只支持一个主设备(取决于设备的硬件实现)

  • 没有定义错误检查协议

  • 没有正式的标准,验证一致性是不可能的

  • 与RS-232 , RS-485或CAN总线相比,它只能处理短距离内的数据传输。 (距离可以通过使用收发器如RS-422进行扩展)

  • 有许多现有的变体,使得很难找到支持这些变体的主机适配器等开发工具

  • SPI不支持热交换 (动态添加节点)。

  • 中断必须通过带外信号来实现,或者通过使用类似于USB 1.1和2.0的定期轮询来伪造

  • 一些变体,如双路SPI , 四路SPI和三线SPI是半双工的。



參見




  • I²C

  • 网络总线列表



外部連結




  • Introduction to Serial Peripheral Interface article on embedded.com

  • Serial buses information page


  • SPI Introduction with helpful diagrams


  • Serial Flash Lots of good information on SPI part manufacturers and models.


  • SPI - PICmicro Serial Peripheral Interface Microchip (company) tutorial on SPI.







Popular posts from this blog

Lambaréné

Chris Pine

Kashihara Line