一、什么是SPI?

SPI 的英文全称为 Serial Peripheral Interface,顾名思义为串行外设接口。SPI 是一种同步串行通信接口规范,主要应用于嵌入式系统中的短距离通信。该接口由摩托罗拉在20世纪80年代中期开发,后发展成了行业规范。


二、简介

SPI 是一种高速的、全双工的、同步的通信总线,并且至多仅需使用 4 根线,节约了芯片的管脚,SPI主要应用于EEPROM、FLASH、ADC、DAC 等芯片,还有数字信号处理器和数字信号解码器之间。

SPI 设备之间采用全双工模式通信,是一个主机和一个或者多个从机的主从模式。主机负责初始化帧,这个数据传输帧可以用于读与写两种操作,片选线可以从多个从机选择一个来响应主机的请求。

SPI 接口定义如下表:


由上表也可以看出当 SPI 设备间通信时,数据线应该是 MOSI 连接 MOSI,MISO 连接 MISO,SCLK 与 SCLK 相连,而不是像串口那样 TX、RX 进行反接。当只有单一 SPI 从机设备时,如果从机设备允许的话,可直接将 CS/SS 线固定在低电平。然而类似于 MAX1242 这款需要 CS/SS 线的下降沿来触发的芯片,则必须将 CC/SS 线与主机相连。如下图,为一主一从连接方式。

对于多个从机设备时,则每个从机都需要一根 CS/SS 线来于主机相连,从而达到主机能与任一从机通信的目的。如下图,为一主多从的连接方式。

大多数从机设备都有着三态逻辑的特性,因此当设备未被选中时,它们的 MISO 信号线会变成高阻抗状态(电气断开)。没有三态输出的设备则需外接三态缓冲器才能与其他的从机设备共享 SPI 总线。


三、数据传输

在 SPI 通信中,SPI 主机设备以从机设备支持的频率通过 SCLK 线给到 SPI 从机设备,这点也意味着从机是无法主动向主机发送数据的,只能主机轮询向从机发或者从机设备主动通过一个 IO 口来告知主机数据到达。

在 SPI 每个时钟周期内,都会进行一次全双工数据的传输。主机通过 MOSI 线上发送 1bit 时,从机也会在读取到之后通过MISO 线发送 1bit 数据出去。这说明,即使只进行单工通信,也会保持此通信顺序。

SPI 传输通常涉及到两个给定了字长的移位寄存器。例如在主机、从机中的 8bit 的移位寄存器。它们以虚拟环形拓扑连接,数据通常先从最高有效位被移出。在时钟沿,主机和从机都移出 1bit 数据从传输线上给到对方。在下一个时钟边沿来到时,双方的接收器再对传输线上的该bit进行采样,并将其设置为移位寄存器的新的最低有效位。在寄存器位被移出和移入后,主机和从机交换了寄存器值。如果需要交换更多数据,则重新加载移位寄存器并重复该过程。传输可以持续任意数量的时钟周期。完成后,主机停止切换时钟信号。如下图,为主从机之间的交互时的移位寄存器示意图。


其中上图的通信流程如下:

1.SPI 主机首先先将 SS 或 CS 线拉低,以此来告知 SPI 从机通信开始。

2.主机通过发送 SCLK 时钟信号,来告知从机即将进行的读写操作。这里的 SCLK 时钟信号是由 SPI 的模式来决定是高电平还是低电平有效的,这点在稍后会进行介绍。

3.主机(Master) 将要发送的数据写到发送数据缓存区 (Memory),缓存区经过移位寄存器(0 ~ 7),串行移位寄存器通过MOSI 信号线将字节一位一位地移出去传送给从机,同时 MISO 接口接收到的数据经过移位寄存器一位一位地移到接收缓存区。

4.从机(Slave) 也将自己的串行移位寄存器 (0 ~ 7) 中的内容通过 MISO 信号线返回给主机。同时通过 MOSI 信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。


比较通俗的解释

SPI (Serial Periphral Interface)最早是由摩托罗拉公司设计并实现,它是一种高速的、全双工的通信总线,采用主机(Master)-从机(Slave)的方式进行通信。SPI 占用芯片的四个引脚,也就是说采用四条信号线来进行通信。这四条线分别是:主设备输入与从设备输出线(Master In Slave Out, MISO);主设备输出与从设备输入线(Master Out Slave In,MOSl);串行同步时钟信号线(Serial Clock,SCK);外围设备片选信号线(Slave Selection,SS)。
SPI 总线的主机和从机都有一个移位寄存器,当主机向自己的移位寄存器写入数据时,数据会通过 MOSI 信号线进入到从机的移位寄存器;同时,从机移位寄存器里的数据,通过 MISO 信号线进入到主机的移位寄存器。这样,主机和从机就完成了一次数据交换。下面这张图,是 SPI 通信的简明原理图:


四、SPI 通信的 4 种工作模式

SPI 通信中有 4 种不同的操作模式,不同的从机设备可能在出厂时就被设置好了某种模式,并且无法更改。但是 SPI 通信必须处于同一种模式下才能进行。因此我们应该对自己手里的 SPI 主机设备进行模式的配置,也就是通过 CPOL(时钟极性) 和 CPHA(时钟相位) 来控制 SPI 主设备的通信模式,具体如下:

时钟极性(CPOL) 定义了 SCLK 时钟线空闲状态时的电平:

1.CPOL=0,即SCLK=0,表示 SCLK 时钟信号线在空闲状态时的电平为低电平,因此有效状态为高电平。

2.CPOL=1,即SCLK=1,表示 SCLK 时钟信号线在空闲状态时的电平为高电平,因此有效状态为低电平。

时钟相位(CPHA) 定义了数据位相对于时钟线的时序(即相位):

1.CPHA=0,即表示输出 (out) 端在上一个时钟周期的后沿改变数据,而输入 (in) 端在时钟周期的前沿(或不久之后)捕获数据。输出端保持数据有效直到当前时钟周期的尾部边缘。对于第一个时钟周期来说,第一位的数据必须在时钟前沿之前出现在 MOSI 线上。也就是一个 CPHA=0 的周期包括半个时钟空闲和半个时钟置位的周期。

2.CPHA=1,即表示输出 (out) 端在当前时钟周期的前沿改变数据,而输入 (in) 端在时钟周期的后沿(或不久之后)捕获数据。输出端保持数据有效直到下一个时钟周期的前沿。对于最后一个时钟周期来说,从机设备在片选信号消失之前保持 MISO 信号线有效。也就是一个 CHPA=1 的周期包括半个时钟置位和半个时钟空闲的周期。

Note:此处的前沿和后沿的意思表示在每个周期中第一个出现的边沿和最后一个出现的边沿。总的来说则为:当时钟为正向时钟时,时钟线的上升沿为前沿,时钟的下降沿为后沿,反之。

如下表,为 SPI 通信的 4 种模式:

下图显示了时钟极性和相位的时序图。红线表示时钟的前沿,蓝线表示时钟的后沿。


比较通俗的解释

SPI 数据的传输是在串行同步时钟信号(Serial Clock,SCK) 的控制下进行的。主机的时钟发生器一方面控制主机的移位寄存器,另一方面通过从机的 SCK 信号线来控制从机的移位寄存器,从而保证主机与从机的数据交换是同步进行的。

SPI 串行同步时钟可以设置为不同的极性(Clock Polarity,CPOL)与相位(Clock Phase,CPHA)。

时钟的极性(CPOL) 用来决定在总线空闲时,同步时钟(SCK)信号线上的电位是高电平还是低电平。当 时钟极性为 0 时(CPOL=0),SCK 信号线在空闲时为低电平当时钟极性为 1 时(CPOL=1), SCK 信号线在空闲时为高电平;

时钟的相位(CPHA) 用来决定何时进行信号采样。
当时钟相位为 1 时(CPHA=1), 在 SCK 信号线的第二个跳变沿进行采样; 这里的跳变沿究竟是上升沿还是
下降沿?取决于时钟的极性。当时钟极性为 0 时,取下降沿;当时钟极性为 1 时,取上升沿;如下图:


当时钟相位为 0 时(CPHA=O), 在 SCK 信号线的第一个跳变沿进行采样。 跳变沿同样与时钟极性有关:当
时钟极性为 0 时,取上升沿;当时钟极性为 1 时,取下降沿;如下图:


五、SPI 协议的优缺点

SPI 的优点在于它有着比 I2C 更高的吞吐量,不被最大时钟速度所限制,可实现潜在的高速、极为简单的硬件接口,外围电路使用的上拉电阻是比 I2C 协议更少的,这意味着它比 I2C 的功耗更低、从机的时钟来源来自主机设备,无需新增精密振荡器、从机不需要唯一的地址、相对于并行接口而言,使用的引脚数目大大减少等优点。但同时有着一定的缺点,例如SPI 没有带内寻址、当使用多个不同模式的从机设备时,主机设备切换模式时重新初始化,会使得访问从机设备速度变慢、SPI 从机设备没有硬件流控,只能通过主机自主地延迟下个时钟周期到来的时间、仅能在短距离通信等缺点。但能在避免 SPI 的缺点的方向来应用 SPI 的话,SPI 的优点让它远远优于其他协议。


参考链接:https://baijiahao.baidu.com/s?id=1746087964061209214&wfr=spider&for=pc
参考链接:http://www.founderchip.com/?id=115

SPI通信协议详解,一篇就够!相关推荐

  1. SPI通信协议详解(二)

    1.SPI简介 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.是Motorola首先在其MC68HCXX系列处理器上定义的.SPI接口主要应 ...

  2. TCP/IP概述和详解--一篇就够

    OSI(Open System Interface)模型属于理论的,主要看TCP/IP的实现. 先来个图 协议解释 TCP/IP模型分成:物理层(网络接口层).数据链路层.网络层.传输层.应用层 5层 ...

  3. 【java】SPI机制详解

    1.概述 以前的文章:[SPI]java基础之SPI框架实现 转载:Java常用机制 - SPI机制详解 PI(Service Provider Interface),是JDK内置的一种 服务提供发现 ...

  4. IIC通信协议详解 PCF8591应用(Verilog实现FPGA)

    IIC通信协议详解 & PCF8591应用(Verilog实现/FPGA) 该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易 ...

  5. STM32开发实战:W25Q32JV SPI Flash详解

    STM32开发实战:W25Q32JV SPI Flash详解 在STM32单片机的应用中,使用SPI Flash能够有效地扩展程序和数据存储空间.W25Q32JV SPI Flash是一种常用的Fla ...

  6. [转帖]前端-chromeF12 谷歌开发者工具详解 Sources篇

    前端-chromeF12 谷歌开发者工具详解 Sources篇 原贴地址:https://blog.csdn.net/qq_39892932/article/details/82498748 cons ...

  7. STM32常用协议之SPI协议详解

    SPI协议详解 SPI协议简介 一.SPI物理层 二.SPI协议层 2.1 SPI基本通信过程 2.2 通信的起始和终止信号 2.3 数据有效性 2.4 CPOL/CPHA及通信模式 三.编程实现 四 ...

  8. SPI协议详解(总结)

    关于SPI协议 1)SPI是串行外设接口(Serial Peripheral Interface)的缩写: 2)是一种高速的,全双工,同步的通信总线: 3)在芯片的管脚上只占用四根线,节约了芯片的管脚 ...

  9. IIS负载均衡-Application Request Route详解第一篇: ARR介绍

    IIS负载均衡-Application Request Route详解第一篇: ARR介绍   说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Appli ...

最新文章

  1. 没听说过这些,就不要说你懂并发了,three。
  2. Windows Server 2008标准证书使用记录
  3. 关于在VS2010中学习c++的MFC
  4. Divide it!
  5. 如何通过Graph+AI的方法打造高精度风控模型?
  6. easylog 使用_Easyloggingpp的使用
  7. HTML CSS里display:block的原理和用法
  8. 最安全的js类型检测
  9. C#使用TCP/UDP协议通信并用Wireshark抓包分析数据
  10. ORB-SLAM(一)简介
  11. 异常检测的总结性介绍
  12. [数字媒体] PR视频剪辑之竖屏实现横屏旋转切换和大视频文件缩小
  13. python中对称差_python 合集set,交集,并集,差集,对称差集别搞混
  14. 2021年氧化工艺新版试题及氧化工艺复审考试
  15. 别再说自己不会了!2021年教你增加拿到BAT等大厂offer几率,醍醐灌顶!
  16. AHB总线介绍及其时序图
  17. Vue搭建可视化界面
  18. Christian band介绍
  19. 计算机操作系统安装及备份系统部分,操作系统安装、备份和还原.ppt
  20. 【Linux 内核 内存管理】物理分配页 ⑦ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 判断页阶数 | 读取 mems_allowed | 分配标志位转换 )

热门文章

  1. 科密指纹考勤机B329采集
  2. NE555时基电路实验(二)NE555控制LED闪烁
  3. unity3d:向量计算:获得两点连线的垂直向量,判断目标方位(前后左右)
  4. 定位综合案例-淘宝轮播图
  5. css透明到渐变,css渐变(css3背景透明渐变)
  6. GIS大讨论(九):GIS专业就业之职位篇
  7. 22.JS+jQuery
  8. 你见过的最全面的Python重点(附代码演示)
  9. [SCTF2020]CloudDisk
  10. Java基础面试题1:面向对象的思想