10.3 SPI协议

更新于 2026年10月10日 版权声明
10.3 SPI协议

10.3.1 SPI总线协议概述

同步外设接口(SPI)是由摩托罗拉公司开发的全双工同步串行总线,该总线大量用在与EEPROM、ADC、FRAM和显示驱动器之类的慢速外设器件通信。

SPI(Serial Peripheral Interface)是一种串行同步通信协议,由一个主设备和一个或多个从设备组成,主设备启动一个与从设备的同步通信,从而完成数据的交换。SPI接口由SDI(串行数据输入)、SDO(串行数据输出)、SCK(串行移位时钟)、CS(从使能信号)四种信号构成。CS决定了唯一的与主设备通信的从设备,如没有CS信号,则只能存在一个从设备,主设备通过产生移位时钟来发起通信。通信时,数据由SDO输出,SDI输入,数据在时钟的上升或下降沿由SDO输出,在紧接着的下降或上升沿由SDI读入,这样经过8/16次时钟的改变,完成8/16位数据的传输。

10.3.2 SPI通信

该总线通信基于主-从配置。它有以下4个信号:

MOSI:主出/从入;

MISO:主入/从出;

SCK:串行时钟;

SS:从属选择。芯片上“从属选择”(slave-select)的引脚数决定了可连到总线上的器件数量。

在SPI传输中,数据是同步进行发送和接收的。数据传输的时钟基于来自主处理器的时钟脉冲,摩托罗拉没有定义任何通用SPI的时钟规范。然而,最常用的时钟设置基于时钟极性(CPOL)和时钟相位(CPHA)两个参数,CPOL定义SPI串行时钟的活动状态,而CPHA定义相对于数据位的时钟相位。CPOL和CPHA的设置决定了数据取样的时钟沿。

10.3.3 数据方向和通信速度

SPI传输串行数据时首先传输最高位。波特率可以高达5Mb/s,具体速度大小取决于SPI硬件。例如,Xicor公司的SPI串行器件传输速度能达到5MHz。

10.3.4 SPI总线接口及时序

SPI总线包括1根串行同步时钟信号线以及2根数据线。

SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设时钟相位和极性应该一致。SPI接口时序如图10-13、图10-14所示。

图示(https://www.daowen.com)

图10-13 CPHA=0时SPI总线数据传输时序

图示

图10-14 CPHA=1时SPI总线数据传输时序

SPI是一个环形总线结构,由SS(CS)、SCK、SDI、SDO构成,其时序其实很简单,主要是在SCK的控制下,两个双向移位寄存器进行数据交换。

假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。

那么第一个上升沿来的时候数据将会是SDO=1,寄存器=0101010x。下降沿到来的时候,SDI上的电平将锁存到寄存器中去,那么这时寄存器=0101010SDI,这样在8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成了一个SPI时序。

假设主机和从机初始化就绪:并且主机的SBUFF=0xaa,从机的SBUFF=0x55,表10-6将分步对SPI的8个时钟周期的数据情况演示一遍(假设上升沿发送数据)。

表10-6 SPI的8个时钟周期的数据情况

图示

续表

图示

这样就完成了两个寄存器8位的交换,表10-6中的“上”表示上升沿、“下”表示下降沿,SDI、SDO是相对于主机而言的。其中SS引脚作为主机的时候,从机可以把它拉低被动选为从机,作为从机的时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。

SPI总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于CPU与各种外围器件进行全双工、同步串行通信。SPI的主要特点有:可以同时发送和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。SPI总线工作的四种方式如图10-15所示,其中使用得最为广泛的是SPI0和SPI3方式(实线表示)。

图示

图10-15 SPI总线四种工作方式

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)