SPI 协议是由摩托罗拉公司提出的通讯协议(Serial PeripheralInterface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、 LCD 等设备与 MCU间,要求通讯速率较高的场合。
SPI总线是一种高速全双工同步串行通信总线,它可以使CPU与各种外围设备以串行方式进行通信以交换信息。SPI的主要应用领域包括:EEPROM、FLASH、AD转换器、各种传感器等设备通信领域。SPI总线协议在不同的半导体公司的具体实施细节可能有所不同,因此具体的应用还是要参考特定器件的数据手册。SPI总线支持全双工通信,而且支持高速应用(100Mbp速率以上)。SPI协议支持的字长不限于8位,可以根据应用的特点灵活选择消息的字长。在点对点的通信中,SPI协议不需要进行寻址操作,显得简单且高效。但是SPI协议并没有流控制和应答机制,因此在可靠性方面可能较差。

一。 SPI 物理层


SPI 通讯使用 3 条总线及片选线, 3 条总线分别为 SCK、 MOSI、 MISO,片选线为
SS

(1) SS( 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):

时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。

(3) MOSI (Master Output, Slave Input):

主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。

(4) MISO(Master Input,, Slave Output):

主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。

2 协议层

1. SPI 基本通讯过程


这是一个主机的通讯时序。 NSS、 SCK、 MOSI 信号都由主机控制产生,而 MISO 的信号由从机产生,主机通过该信号线读取从机的数据。 MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。

以上通讯流程中包含的各个信号分解如下:

1.1 通讯的起始和停止信号

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

1.2 数据有效性

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

1.3 CPOL/CPHA 及通讯模式

上面讲述的图 25-2 中的时序只是 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 的时序图。首先,根据 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 的偶数边沿被采样
由 CPOL 及 CPHA 的不同状态, SPI 分成了四种模式,见表 25-1,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式 0”与“模式 3”。

SPI总线-物理层 协议层相关推荐

  1. Linux SPI总线和设备驱动架构之二:SPI通用接口层

    通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...

  2. PCIE学习笔记(二)PCIe总线的拓扑结构,协议层,数据传输流程

    目录 PCIe总线的拓扑结构 PCI Express协议分层 物理层(Physical Layer) 数据链路层(Link Layer) 处理层(Transaction Layer) 软件层(Soft ...

  3. I2C协议——物理层和协议层

    I2C协议简介 I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART.CAN等通讯协议的外部收发设 ...

  4. 关于I2C和SPI总线协议

    IICvs SPI 现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影 ...

  5. spi四种工作模式时序图_还没学会SPI总线协议?干货都在这里

    SPI总线基本概念 SPI是一种高速.全双工.同步的串行通信总线,全称是Serial Peripheral Interface,使用时在芯片的管脚上只占用三根或者四根线(如果单向传输的话只需三根线就可 ...

  6. FPGA SPI总线协议简介

    1.1 FPGA SPI总线协议简介 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA SPI总线协议简介: 5)结束语. 1.1.2 本节引言 "不积 ...

  7. 单片机软件模拟SPI接口—加深理解SPI总线协议

    单片机软件模拟SPI接口-加深理解SPI总线协议   SPI(Serial Peripheral Interfacer 串行外设接口)是摩托罗拉公司推出的一种同步串行通讯接口,用于微处理器臌控制器和外 ...

  8. SPI总线-串行协议解码

    目录 SPI总线-串行协议解码 接线 发信号 SPI总线-串行协议解码 SPI(串行外围接口)总线最初是由摩托罗拉开发的,用于其微控制器.由于总线的简单性,其他制造商采用了它,并且它已广泛用于嵌入式系 ...

  9. STM32:DMA方式接收SPI总线数据,并按照协议进行处理

    一.前言 为满足高速数据传输的要求,采用SPI总线.MCU端(STM32F072  Cortex-M0)接收CPU发送的SPI数据(数据18个字节为一包,起始包为0xAA,最后一包为CheckSum校 ...

  10. SPI总线协议及SPI时序图详解

    转贴地址:https://www.cnblogs.com/adylee/p/5399742.html SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设 ...

最新文章

  1. 【cs229-Lecture7】支持向量机(SVM)
  2. 数据库事务的隔离级别
  3. 【NServiceBus】什么是Saga,Saga能做什么
  4. python数组的切片操作_对Python 数组的切片操作
  5. Spring boot自定义启动字符画(banner)
  6. php之前代码,PHP语法检查源代码前控制
  7. mysql事务隔离级别 花_mysql事务隔离级别
  8. ctfshow-网络迷踪-初学乍练( 离谱! 一张图判断飞机的目的地?)
  9. linux打印系统cups原理分析
  10. FFmpeg-Python 给视频添加文字
  11. 使用Number Insight和Java创建呼叫者ID
  12. HDOJ Saving HDU JAVA 2111
  13. R语言工具变量与两阶段最小二乘法
  14. 什么是串扰crosstalk
  15. java 气泡_JAVA实现聊天气泡
  16. 《C语言程序设计教程》(主编黄迪明、余勤)第四章课后习题答案
  17. 幸福感的来源吃饱穿暖
  18. ORA-04098: trigger 'SYS.GGS_DDL_TRIGGER_BEFORE' is invalid and failed re-validation
  19. C语言-游泳比赛进行排名
  20. 《计算机组成原理》学习笔记

热门文章

  1. Nachi机器人TCP通讯
  2. LDA模型困惑度计算出现的问题
  3. php 三消算法,三消游戏关卡设计教程(初级篇)——基本地形设计
  4. 记事本查看HTML源代码,查看源代码有时候用记事本打开有时候用浏览器打开
  5. banner.txt
  6. 根据百度日历获取当年所有天数,以及判断今天是周几 以及是是节假日或者工作日,阴历阳历
  7. keil5安装教程及下载
  8. iOS简单人脸检测的实现
  9. 基于WPF开发了一款简单的小型CAD软件.放个效果图
  10. 基于ASP.NET的企业进销存管理系统