SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步的串行通信协议,由摩托罗拉公司于20世纪80年代开发,广泛应用于短距离设备间的数据传输,如微控制器与传感器、存储器、显示屏等外设的通信。其核心优势在于结构简单、传输速度快、支持多设备连接,成为嵌入式系统中最常用的通信协议之一。
一、SPI的基本硬件结构
SPI协议的硬件连接采用四线制(部分简化场景可省略部分线路),核心信号线包括:
SCLK(Serial Clock,串行时钟):由主设备(Master)产生,用于同步主从设备的数据传输,决定通信速率。时钟频率可根据设备支持范围调整,通常在几MHz到几十MHz之间。
MOSI(Master Out Slave In,主出从入):主设备向从设备发送数据的信号线,数据由主设备通过该线路传输到从设备。
MISO(Master In Slave Out,主入从出):从设备向主设备返回数据的信号线,数据由从设备通过该线路传输到主设备,实现全双工通信。
SS(Slave Select,从设备选择):由主设备控制,用于指定当前通信的从设备。SPI支持一主多从架构,每个从设备都有独立的SS线(或通过译码器共享),主设备通过拉低某一从设备的SS线使其进入工作状态。
在通信过程中,主设备负责初始化通信并提供时钟信号,从设备则被动响应主设备的操作。这种“主从模式”确保了通信的有序性,避免多设备竞争总线的问题。
二、SPI的通信原理与时序
SPI的通信基于“同步移位”机制,主设备通过SCLK时钟信号同步数据的发送与接收,具体过程如下:
1. 通信初始化
主设备首先拉低目标从设备的SS线,告知该从设备即将进行数据传输。此时,未被选中的从设备会忽略SCLK和MOSI信号,仅等待自身SS线被激活。
2. 数据传输时序
SPI的数据传输以“位”为单位,主设备和从设备通过MOSI和MISO线同时交换数据,实现全双工通信。其关键时序参数包括:
时钟极性(CPOL):定义SCLK在空闲状态(无数据传输时)的电平。CPOL=0时,空闲状态为低电平;CPOL=1时,空闲状态为高电平。
时钟相位(CPHA):定义数据采样的时刻。CPHA=0时,数据在SCLK的第一个跳变沿(上升沿或下降沿)被采样;CPHA=1时,数据在第二个跳变沿被采样。
通过CPOL和CPHA的组合,SPI支持四种通信模式,不同设备需约定一致的模式才能正常通信。例如,SD卡通常使用模式0(CPOL=0,CPHA=0),而某些传感器可能使用模式3(CPOL=1,CPHA=1)。
3. 数据帧格式
SPI协议对数据帧格式(如位数、校验位等)没有强制规定,由主从设备协商确定,常见的帧长为8位(1字节)。传输时,主设备通过移位寄存器将数据逐位发送到MOSI线,同时从MISO线逐位接收从设备的数据,一次时钟脉冲完成一位数据的双向传输。例如,主设备发送0x55(二进制01010101)时,从设备可能同时返回0xAA(二进制10101010),8个时钟脉冲后完成整字节的交换。