SPI 总线

SPI总线技术详解

1. 概述

串行外设接口(Serial Peripheral Interface,SPI)是由Motorola公司于1979年提出的一种同步串行通信协议,主要用于短距离、高速的芯片间数据传输。SPI是一种高速、全双工、同步的通信总线,采用主从(Master-Slave)架构,广泛应用于嵌入式系统中微控制器与外围设备的通信,如传感器、存储设备、显示驱动器、网络控制器等。

2. SPI总线的特点与特性

2.1 基本特点

  • 同步通信:使用单独的时钟信号线进行数据同步
  • 全双工通信:支持同时发送和接收数据
  • 非差分信号:采用单端信号传输
  • 总线式架构:通过片选信号实现多设备连接
  • 主从通信模式:由主设备控制通信时序

2.2 主要优点

  • 高速数据传输:速率通常可达几MHz到几十MHz,部分高性能SPI接口甚至支持上百MHz的数据传输
  • 通信协议简单:协议实现相对简单,硬件开销小
  • 全双工通信能力:可在同一时钟周期内同时发送和接收数据
  • 灵活的时钟极性和相位配置:通过CPOL和CPHA参数可配置四种不同的通信模式,适应不同外设需求
  • 支持多从设备:通过多个片选信号可连接多个从设备

2.3 主要缺点

  • 没有内置的错误检测机制:不具备奇偶校验或CRC等错误校验功能
  • 缺乏流量控制机制:没有应答信号确认数据是否被正确接收
  • 信号线数量较多:相比I2C总线需要更多的信号线
  • 抗噪声干扰能力较弱:采用单端信号传输,在嘈杂环境中可靠性较低
  • 仅支持单主设备:总线上只能有一个主设备控制通信

3. SPI总线的硬件架构

SPI总线通常需要4根信号线,在单向传输的情况下也可以使用3根信号线:

  • MOSI(Master Out Slave In):主设备数据输出,从设备数据输入
  • MISO(Master In Slave Out):主设备数据输入,从设备数据输出
  • SCLK(Serial Clock):串行时钟信号,由主设备产生并控制
  • CS/SS(Chip Select/Slave Select):片选信号,由主设备控制,用于选择要通信的从设备

SPI总线硬件连接示意图

当系统中有多个SPI从设备时,主设备需要为每个从设备提供独立的片选信号。通信时,主设备通过拉低特定从设备的片选信号来选中该设备,未被选中的设备则忽略总线上的通信。

4. SPI通信协议详解

4.1 通信时序与工作模式

SPI通信有四种不同的工作模式,这些模式由时钟极性(CPOL,Clock Polarity)和时钟相位(CPHA,Clock Phase)两个参数决定:

SPI模式 CPOL值 CPHA值 时钟空闲状态 数据采样边沿
Mode 0 0 0 低电平 上升沿
Mode 1 0 1 低电平 下降沿
Mode 2 1 0 高电平 下降沿
Mode 3 1 1 高电平 上升沿
  • 时钟极性(CPOL):决定SCLK在空闲状态时的电平状态

    • CPOL=0:SCLK在空闲状态为低电平
    • CPOL=1:SCLK在空闲状态为高电平
  • 时钟相位(CPHA):决定数据采样是在时钟的第一个边沿还是第二个边沿

    • CPHA=0:在时钟的第一个边沿(从空闲状态开始的第一个跳变)进行数据采样
    • CPHA=1:在时钟的第二个边沿进行数据采样

4.2 数据传输过程

SPI数据传输过程如下:

  1. 主设备拉低目标从设备的片选信号(CS/SS),表示开始通信
  2. 主设备通过SCLK线发送时钟信号
  3. 在每个时钟周期内:
    • 主设备在MOSI线上输出一位数据
    • 从设备在MISO线上输出一位数据(全双工通信)
    • 根据CPHA的值,在特定的时钟边沿进行数据采样
  4. 数据传输完毕后,主设备释放片选信号(拉高CS/SS),表示通信结束

SPI通信以字节(8位)或更大的数据帧为单位进行传输,数据通常以MSB(最高有效位)优先的方式发送,但也有一些设备支持LSB(最低有效位)优先的方式。

SPI通信时序图
SPI不同模式时序对比

4.3 多字节传输与流控制

SPI协议本身没有定义特定的流控制机制,也没有内置的地址或命令结构。在实际应用中,通常采用以下方式实现多字节数据传输:

  • 命令+数据模式:首先发送命令字节,然后发送或接收数据字节
  • 地址+数据模式:首先发送地址字节,然后发送或接收数据字节
  • 自定义协议:根据特定应用需求定义数据帧格式和传输规则

需要注意的是,SPI通信没有像I2C那样的开始和停止信号,通信的开始和结束通过片选信号的拉低和拉高来表示。

5. SPI与其他通信协议的对比

5.1 SPI与I2C的对比

特性 SPI I2C
数据线数量 4根(MOSI、MISO、SCLK、CS) 2根(SDA、SCL)
通信方式 全双工 半双工
传输速率 通常较高(可达几十MHz或更高) 相对较低(通常为100Kbps-4Mbps)
设备寻址 通过片选信号 通过地址帧
主设备数量 只能有一个主设备 支持多个主设备
错误检测 无内置机制 支持ACK/NACK应答
抗干扰能力 较弱(单端信号) 较强(开漏输出+上拉电阻)
协议复杂度 相对简单 相对复杂
实现成本 较高(需要更多引脚) 较低

5.2 SPI、I2C、UART和CAN的应用场景对比

协议 应用场景 传输距离 速率 特点
SPI 板内芯片间通信(如MCU与传感器、显示屏、Flash等) 短距离(几厘米至几十厘米) 高(几MHz至几十MHz) 高速、全双工、同步、单主多从
I2C 板内芯片间通信(如MCU与低速率传感器、实时时钟等) 短距离(通常不超过1米) 中低(100Kbps-4Mbps) 多主多从、地址寻址、半双工
UART 设备间通信(如MCU与PC、模块间通信) 中等距离(通常不超过10米) 中低(通常不超过1Mbps) 异步、点对点、无需时钟线
CAN 工业控制、汽车电子等领域的网络通信 长距离(最远可达10公里,取决于速率) 中高(最高可达1Mbps) 多主、错误检测、优先级仲裁、高可靠性

SPI应用场景特点

SPI适用于需要高速数据传输且对可靠性要求不是极高的短距离板内通信场景,如:

  • 微控制器与外部Flash/EEPROM存储芯片通信
  • 图像传感器与处理器之间的数据传输
  • LCD/OLED显示屏驱动
  • 音频编解码器
  • 模数/数模转换器

I2C应用场景特点

I2C适用于低速、多设备、对连接线数量敏感的应用场景,如:

  • 传感器网络(温度、湿度、压力等传感器)
  • 实时时钟模块
  • EEPROM存储
  • 电源管理芯片

UART应用场景特点

UART适用于设备间点对点通信,如:

  • 计算机与外部设备通信(调试接口、串口设备)
  • 模块间通信(如GPS模块、蓝牙模块等)
  • 简单的串行通信链路

CAN应用场景特点

CAN适用于需要高可靠性、长距离、多节点的网络通信场景,如:

  • 汽车电子网络
  • 工业控制系统
  • 电梯控制
  • 机器人控制系统
  • 船舶电子系统

6. SPI接口的实现与设计考虑

6.1 硬件实现

SPI接口可以通过硬件或软件实现:

  • 硬件SPI:大多数微控制器都内置了SPI控制器,可自动处理时序和数据传输
  • 软件SPI:通过GPIO引脚和软件模拟SPI时序,适用于没有硬件SPI控制器的情况

6.2 设计注意事项

  1. 信号完整性:高速SPI通信需要考虑信号完整性问题,包括传输线阻抗匹配、信号反射、串扰等
  2. 电源去耦:为SPI设备提供良好的电源去耦,减少噪声干扰
  3. 接地处理:确保良好的接地,避免地环路
  4. 时钟频率选择:根据从设备的最高支持频率和传输距离选择合适的时钟频率
  5. 模式匹配:确保主设备和从设备的SPI工作模式(CPOL和CPHA)一致
  6. 片选信号处理:正确处理片选信号的时序,避免信号竞争
  7. 多从设备冲突:合理设计片选信号的控制逻辑,避免多从设备同时被选中

7. 总结

SPI总线是一种高速、全双工、同步的串行通信协议,以其简单的实现和高速的数据传输特性,在嵌入式系统中得到了广泛的应用。尽管SPI协议在错误检测和多主设备支持方面存在一些局限性,但其在需要高速数据传输的短距离通信场景中仍然是首选方案之一。

在实际应用中,选择SPI还是其他通信协议(如I2C、UART、CAN等)应根据具体的应用需求、传输距离、速率要求、设备数量以及系统复杂度等因素综合考虑。