1. 什么是SPI
SPI,英文全称是:serial peripheral interface。即:串行外设接口。是计算机和嵌入式系统中常用的接口,用于促进微控制器与一个或多个外围集成电路(IC)之间的短距离通信。多条传输线或信号线连接SPI芯片,使微控制器能够与外设交换数据。
摩托罗拉在1980年代开发了SPI架构,以提供支持串行、同步和全双工通信的接口:
- 串行。数据按顺序在单行上传输,一次一位。这与并行通信形成鲜明对比,在并行通信中,数据在多条线路上并行传输。串行接口布线更简单,可以支持更长的电缆,并且不易在电缆线之间产生串扰。
- 同步。数据以连续的数据流传输,该数据流与发射器和接收器使用的定时信号协同工作。相比之下,异步传输可以是随机的或不规则的,并且不依赖于公共时钟。与异步通信相比,同步通信速度更快,偷听次数更少。
- 全双工。 数据可以同时在两个方向上传输。这与半双工通信形成鲜明对比,半双工通信支持双向通信,但一次只有一个节点传输数据。
SPI控制器可以在多种类型的外围设备之间传输数据,包括移位寄存器、存储芯片、输入/输出扩展器、SD存储卡、数据转换器、闪存、多媒体卡、传感器甚至其他微控制器。
2. SPI工作原理
SPI元件通常采用4线配置实现。每根电线在控制器和外围设备之间传输特定类型的信号。用于描述此配置的命名约定因源而异。最初的命名是基于主从架构的概念,在这种架构中,主站控制从站。科技行业一直在慢慢摆脱这个术语,以努力推广更具文化敏感性的语言。这种努力已经扩展到SPI,它通常被描述为主从接口。在这种情况下,主节点被替换为控制器、主节点或其他术语,从节点被外设、子节点或其他标签所取代。
开源硬件协会(OSHWA)在修订SPI标签方面发挥了重要作用。该组织建议业界使用以下术语来描述4线配置中的SPI信号:
- 串行时钟(SCK)。控制器生成的时钟信号,用于提供使控制器和外设保持同步所需的定时信号。时钟也称为CLK、SCLK或其他术语。时钟标记没有随着新的命名约定而改变。
- 外设输出/控制器输入(POCI)。将数据从外设传送到控制器的信号。直到最近,该信号通常被称为MISO(主输入/从输出)。在某些情况下,MISO指的是主节点输入/子节点输出。
- 片选(CS)。当控制器需要与多个外设之一通信时,信号决定了应激活哪个外设。曾几何时,该信号通常被称为SS(从机选择)。

图1:最简单的串行外设接口配置由控制器和外设组成。
单个控制器可以与多个外围设备进行通信。支持多外设配置有两种基本方法:标准配置和菊花链配置。在标准配置中,SCK、PICO和POCI信号线是共用的,但芯片选择线不是共用的。相反,控制器为每个外设提供单独的芯片选择线,在控制器和外设之间建立直接连接,如图2所示。

图2:最简单的标准串行外设接口配置示例。
当外设空闲时,芯片选择线通常设置为高电压电平,在这种情况下,通过将芯片选择线设置为低电压电平来启用外设。一次只能使能一个外设,以避免共享信号线上的数据争用。菊花链配置采用不同的方法。控制器仅提供一条芯片选择线,该线由所有外设共享。数据本身从控制器从一个外设移动到下一个外设,沿着链向下级联。只有最后一个外设将数据返回给控制器,如图3所示。

图3:菊花链最简单的串行外设接口配置示例。