SPI协议

1、SPI协议简介

  SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。SPI(Serial Peripheral Interface–串行外设接口)总线系统是一种同步串行外设接口。SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器, ADC、 LCD 等设备与 MCU 间,还有数字信号处理器和数字信号解码器之间,要求通讯速率较高的场合。该接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择NSS
  (1)MISO – 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
  (2)MOSI – 主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
  (3)SCLK –串行时钟信号,由主设备产生。
  (4)NSS – 从设备片选信号,由主设备控制。它的功能是用来作为“片选引脚”,也就是选择指定的从设备,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突,有的IC会标注为CS(Chip select)。

  SPI有主、从两种模式,通常由一个主模块和一个或多个从模块组成(SPI不支持多主机),主模块选择一个从模块进行同步通信,从而完成数据的交换。提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave),SPI接口的读写 操作,都是由主设备发起,当存在多个从设备时,通过各自的片选信号进行管理。在这里插入图片描述
一主设备一从设备
在这里插入图片描述
一主设备多从设备

2、SPI物理层

  SPI 通讯设备之间的常用连接方式见下图:
在这里插入图片描述
  SPI 通讯使用 3 条总线及片选线,3 条总线分别为 SCK、 MOSI、 MISO,片选线为/S/S,它们的作用介绍如下:

  (1) /S/S( Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、 CS,以下用 NSS 表示。 当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI 及 MISO 同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。 I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI 通讯。所以SPI 通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号
  (2) SCK (Serial Clock): 时钟信号线,用于通讯数据同步。它由通讯主机产生,不同的设备支持的最高时钟频率不一样,两个设备之间通讯时,通讯速率受限于低速设备。
  (3) MOSI (Master Output, Slave Input): 主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机
  (4) MISO(Master Input,, Slave Output): 主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机

3、SPI协议层

  与 I2C 的类似, SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步,等环节。

  (1)、SPI 基本通讯过程

  先看看 SPI 通讯的通讯时序,见下图:
在这里插入图片描述
  这是一个主机的通讯时序。 NSS、 SCK、 MOSI 信号都由主机控制产生,而 MISO 的信号由从机产生。 MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。

  (2)、通讯的起始和停止信号

  在图中的标号1处,NSS 信号线由高变低,是 SPI 通讯的起始信号。 NSS 是每个从机各自独占的信号线,当从机检在自己的 NSS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。在图中的标号6处, NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

  (3)、数据有效性

  SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。 MOSI及 MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时, MSB 先行(高位先行)或 LSB(低位先行)先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同样的协定,一般都会采用上图中的 MSB 先行(高位先行)模式。
  观察图中的2345标号处, MOSI 及 MISO 的数据在 SCK 的上升沿期间变化输出,在 SCK 的下降沿时被采样。即在 SCK 的下降沿时刻, MOSI 及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效, MOSI 及 MISO为下一次表示数据做准备。
  SPI 每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。

  (4)、 CPOL(时钟极性)/CPHA(时钟相位)及通讯模式

  上面讲述的图中的时序只是 SPI 中的其中一种通讯模式, SPI 一共有四种通讯模式,它们的主要区别是总线空闲时 SCK 的时钟状态以及数据采样时刻。为方便说明,在此引入“时钟极性CPOL”和“时钟相位 CPHA”的概念。
   时钟极性 CPOL 是指 SPI 通讯设备处于空闲状态时, SCK 信号线的电平信号(即 SPI 通讯开始前、 NSS 线为高电平时 SCK 的状态)。 CPOL=0 时, SCK 在空闲状态时为低电平,CPOL=1 时,则相反。
  时钟相位 CPHA 是指数据的采样的时刻,当 CPHA=0 时, MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的“奇数边沿” 被采样。当 CPHA=1 时,数据线在 SCK 的“偶数边沿” 采样。见下图:在这里插入图片描述
CPHA=0 时的 SPI 通讯模式
  我们来分析这个 CPHA=0 的时序图。首先,根据 SCK 在空闲状态时的电平,分为两种情况。 SCK 信号线在空闲状态为低电平时, CPOL=0;空闲状态为高电平时, CPOL=1。
  无论 CPOL=0 还是=1,因为我们配置的时钟相位 CPHA=0,在图中可以看到, 采样时刻都是在 SCK 的奇数边沿。注意当 CPOL=0 的时候,时钟的奇数边沿是上升沿,而CPOL=1 的时候,时钟的奇数边沿是下降沿。所以 SPI 的采样时刻不是由上升/下降沿决定的。 MOSI 和 MISO 数据线的有效信号在 SCK 的奇数边沿保持不变,数据信号将在 SCK 奇数边沿时被采样,在非采样时刻, MOSI 和 MISO 的有效信号才发生切换。

  类似地,当 CPHA=1 时,不受 CPOL 的影响,数据信号在 SCK 的偶数边沿被采样,见下图:
在这里插入图片描述
CPHA=1 时的 SPI 通讯模式
   由 CPOL 及 CPHA 的不同状态, SPI 分成了四种模式,见下表,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式 0”与“模式 3”
在这里插入图片描述
SPI的4种模式

读写注意:
  主机和从机都有一个串行移位寄存器,主机通过向从机的SPI串行寄存器写入一个字节来发起一次传输。
   串行移位寄存器通过MOSI信号线将字节传送给从机,从机也将自己串行移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。
   外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节,就必须发送一个空字节来引发从机的传输。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值