作者: Thomas Kugelstadt   德州仪器

串行外设接口 (SPI) 总线是一个工作在全双工模式下的同步串行数据链路。它可用于在单个主控制器和一个或多个从设备之间交换数据。其简单的实施方案只使用四条支持数据与控制的信号线( 1):


1:基本 SPI 总线
虽然 1 中的引脚名称来自摩托罗拉开发的 SPI 标准,但具体集成电路的 SPI 端口名称往往与图 1 中所示的不同。


1SPI 引脚名称分配

SPI 数据速率一般在 1 到 70MHz 的范围内,字长为从 8 位及 12 位到这两个值的倍数。

数据传输一般由数据交换构成。在主控制器向从设备发送数据时,从设备也向主控制器发送数据。因此主控制器的内部移位寄存器和从设备都采用环形设置( 2)。

 

2:双移位寄存器形成一个芯片间的环形缓存器

在数据交换之前,主控制器和从设备会将存储器数据加载至它们的内部移位寄存器。收到时钟信号后,主控制器先通过 MOSI 线路时钟输出其移位寄存器的 MSB。同时从设备会读取位于 SIMO 的主控器第一位元,将其存储在存储器中,然后通过 SOMI 时钟输出其 MSB。主控制器可读取位于 MISO 的从设备第一位元,并将其存储在存储器中,以便后续处理。整个过程将一直持续到所有位元完成交换,而主控器则可让时钟空闲并通过 /SS 禁用从设备。

除设置时钟频率外,主控制器还可根据数据配置时钟极性和相位。这两个分别称为 OPOL 与 CPHA 的选项可实现时钟信号 180 度的相移以及半个时钟周期的数据延迟。 3 是相应的定时图。

3:时钟极性与相位的定时图

CPOL = 0 时,时钟空闲在逻辑 0 位置上:

  • 如果 CPHA = 0,数据在 SCK 的上升沿读取,在下降沿变化。
  • 如果 CPHA = 1,数据在 SCK 的下降沿读取,在上升沿变化。

CPOL = 1 时,时钟在逻辑为高时空闲:

  • 如果 CPHA = 0,数据在 SCK 的下降沿读取,在上升沿变化。
  • 如果 CPHA = 1,数据在 SCK 的上升沿读取,在下降沿变化。

在 SPI 中,主控制器可与单个或多个从设备通信。如果是一个单从设备,从设备选择信号可连接至从设备的本地接地电位,实现永久接入。对使用多个从设备的应用,可使用两种配置:独立从设备与菊花链从设备(图 4)。


4:主控制器与独立从设备(左)及菊花链从设备通信(右)

 

要与从设备单独通信,主控制器必须提供多重从设备选择信号。该配置通常用于必须单独访问多个模数转换器 (ADC) 及数模转换器 (DAC) 的数据采集系统中。

菊花链从设备只需要主控制器提供一个从设备选择信号,因为这种配置要求所有从设备同时启用,以确保数据不间断地流经该链路中的所有移位寄存器。典型应用是工业 I/O 模块中的级联多通道输入串行器与输出驱动器。

关于作者

Thomas Kugelstadt 是德州仪器的一名高级系统工程师,负责设计新型高性能模拟产品、开发可在工业系统中检测和调节低级模拟信号的完整系统解决方案。在 TI 长达 20 年的工作中,他曾在欧洲、亚洲以及美国担任多个国际性应用职位。Thomas 以见习工程师身份毕业于法兰克福应用科技大学 (the Frankfurt University of Applied Science)。

Anonymous
  • 实际项目中模拟spi使用的比较多, 之前遇到过收发的极性搞错了,导致数据发生移位的现象,上升沿读数还是下降沿读数不能搞错。之前遇到的都是独立从设备,楼主所介绍的菊花链从设备还是第一次见到,涨姿势了。谢谢楼主。

  • 这篇文章写的太好了!多谢分享!

    --------------------------------------

    SPI 数据速率一般在 1 到 70MHz 的范围内,字长为从 8 位及 12 位到这两个值的倍数。

    还有时钟极性与相位的关系。

    --------------------------------------

    断开MOSI与MISO,那么8个时钟之后寄存器的数据是什么?全0还是全1?

    如果断开MOSI,也就是说master吐出的数据slave没有收到咯,那slave的MISO引脚置高那slave的寄存器里就都是1咯,否则相反;至于master对应的寄存器里的数据就要看MISO引脚如何连接的咯

  • 首先非常感谢楼主讲的非常好,在我看来主要还是波形图,从波形图入手,不是那么难。这些接口主要解决的就是一个时序问题,SPI没有握手响应,所以相对而言处理比较容易。

    PS:这两个分别称为 OPOL 与 CPHA  是CPOL,文章中打错了

  • 讲解的很到位,言简意赅,比查手册、协议规范方便的多,更容易理解。尤其是配图的颜色确认,十分明了,谢谢。

  • 之前有看过SPI的介绍,看的有点迷糊,第二张图很形象,一下就能看出数据线上的数据流,高位在前,MISO与MOSI上同时有数据也就明白了,要是断开MOSI与MISO,那么8个时钟之后寄存器的数据是什么?全0还是全1?