SPI通信协议详解,一篇就够!

article/2025/9/20 21:50:43

一、什么是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


http://chatgpt.dhexx.cn/article/wU6utSyZ.shtml

相关文章

2021年游戏项目的十大编程语言:C++、Java、C#均上榜

在这个技术驱动的世界里,游戏行业是全球增长最快的行业之一。在每一款华丽精美的电子游戏背后,都有一种编程语言,为用户提供优质的体验。游戏开发者利用顶级的编程语言来构建游戏。不同的游戏项目使用了不同的编程语言,这取决于游…

2021 编程语言排行榜

点击“终码一生”,关注,置顶公众号 每日技术干货,第一时间送达! IEEE Spectrum 发布了 2021 年编程语言排行榜,官方的标题是:Python 在新技术领域依然是主导地位。 Python 近几年随着大数据、数据挖掘、人…

2020 年最牛逼的 10 门编程语言

先看再点赞,给自己一点思考的时间,微信搜索【沉默王二】关注这个有颜值却假装靠才华苟且的程序员。 本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题。 对于很多初学编程的人来说,尤其是马上要入…

世界上到底有多少种编程语言?

最近,网站上看到一个很有意思的问题:世界上到底有多少种编程语言? 查遍网络之后,仍然没有找到准确答案,只知道几千的数量是有的,但是我们常用的也就几十来个,其中最常见的便是Java、Python、C、…

世界上最难的5种编程语言

世界上最难的5种编程语言 每个程序员都熟悉许多编程语言。许多编程语言都是高级的,它们的语法是人类可读的。然而,也有一些低级语言,对于一个人来说,读起来很困难,但是可以理解。然而,您是否遇到过一种既不…

2018年最流行的十大编程语言,有你用的吗?

对于编程界的初学者来说,最大的困难是决定从何处入手,或者应掌握哪种语言才能在职场上平步青云。有时,专业程序员也面临学习一门新语言似乎更卓有成效的情形。 无论是什么原因,下面列出了世界上最流行的编程语言,以便了…

5月编程排行榜出炉,最佳编程语言是谁?

技术的发展日新月异,作为开发者,应该时刻关注这些变化,不断学习才能跟上时代步伐。 编程语言层出不穷,关于“ 最佳编程语言 ”的争论也从未停止,网友们各抒己见...... 网友A: 人生苦短,我选Pyt…

十大热门编程语言的介绍

小编给大家分享一篇关于现阶段十大热门编程语言的文章:经过流行的搜索引擎,如谷歌,必应,雅虎,维基百科,亚马逊,YouTube和百度,用于计算评级;得出十大热门编程语言排行榜的…

GitHub2022年十大热门编程语言榜单

全球知名代码托管平台 GitHub发布的2022年GitHub Octoverse年度报告公布了全球最流行的十大编程语言,其中JavaScript蝉联第一,Python位列次席。 编程是技术革新的核心,对于所有的编程开发人员来说,对世界范围内编程语言发展和趋势…

2021年十大热门编程语言

几乎可以肯定,每个人都知道,在当今数字先进的世界中,技术是如何快速变化的。经常通过定期更新和改进来观察替代技术之间的相互超越已成为一种正常现象。在这一切之中,一个领域因技术世界的如此多变的性质而受到很大的影响&#xf…

十大编程语言,每一个都不容易学,但每一个又很有用,黑客必备

一定要注意,您选择的编程将在很大程度上取决于您要定位的系统类型和计划使用的漏洞。因此,根据您的策略,任何语言都会很棒。 1. C语言 它被称为“所有编程语言之母”,也是Hacking社区中的关键语言。今天,我们拥有的大…

抖音照片图集怎么制作,如何将图片做成视频上传抖音?

抖音最近被很多人当做茶余饭后不可或缺的娱乐项目,丰富了很多人的业余生活,也成就了很多抖音人,经常在抖音上会看到很多不是直接拍摄的视频,而是通过图片图集的方式展示出来的视频,图片中还可以配上相应的文字&#xf…

手把手教你抖音怎么用图片做视频!

抖音是一款短视频APP,在抖音里人们可以上传视频,录制视频,看到别人的视频,抖音目前很受年轻人的欢迎,使用抖音的人高达几个亿;我们在抖音上看到的照片视频,其实大部分是在电脑制作后上传的一般比…

如何用照片做抖音视频?这样剪辑电子相册

如果只是在抖音中拍摄视频的话,相信这个操作大家都会吧?毕竟现如今的抖音可以说是全民在用了,关于如何拍摄视频发布到抖音,这个操作也几乎是人人都会的。但是拍摄视频你会,你又知道应该如何用照片来制作一个抖音视频吗…

[短视频运营] 抖音最新风口,漫改图文号,变现模式非常简单

这几天抖音出现了一个新的风口,千万不要错过,抖音召开了抖音创作者大会,在大会上有几件事的披露引起了广泛关注,对于每一个在抖音上的创作者来说都是重大的事件。 ​第一、抖音在大会上确定未来一年将会把更多的重点放在图文和中…

抖音开放平台-视频切片-视频分片上传-不合法的参数ID-不合法的对象ID

问题描述 1、最近遇到个问题,做业务需要管理几个抖音账号,用抖音开放平台做分片上传视频,多次返回不合法参数id,提交工单之后给的回复没有任何参考价值。 2、例如视频文件按15M进行切片,调用分片上传初始化接口&#…

抖音上css照片动态旋转怎么做,抖音里单张图片平移视频怎么制作?影音制作实现一张图片从左到右滑动视频效果...

今天的影音制作,是实现视频画面中有一张图片从左往右慢慢滑动的视频效果。一张横屏图片要制作成竖视频的时候,要么就会出现图片显示不全的情况,要么显示全了就会出现上下有黑边的情况,基本很难解决这个问题~但是小编今天通过这款常…

仿抖音上下滑动分页视频

如果要是不想看这么代码的话,我整理了一下项目,下载到本地直接进行运行也可以; 代码下载地址 目录介绍 01.先来看一下需求02.有几种实现方式 2.1 使用ViewPager2.2 使用RecyclerView03.用ViewPager实现 3.1 自定义ViewPager3.2 ViewPager和…

java抖音字符视频_抖音流行的字符视频如何实现

前几天,有个朋友给我分享了一个抖音短视频链接,是以代古拉k跳舞视频为原型的字符视频,朋友问我:“这个你知道怎么做吗?”。 我们都知道视频是由一帧一帧的静态图片组合而成的,所以当我们把原视频的每一帧变…

抖音上传视频显示转成mp4怎么设置_详细的mp4转换成mp3格式的方法,不看后悔系列!...

详细的mp4转换成mp3格式的方法,不看后悔系列! 安利安利安利安利 话说,视频格式转换你们会,音频格式转换你们也会,你们就没有不会的吗? 对了,视频转音频你们会吗?知道怎么将MP4转成MP…