SPI协议详解

SPI协议详解

文章目录

  • SPI协议详解
  • 前言
  • 一、SPI是什么?
  • 二、通信原理
    • SPI 通信的 4 种工作模式
  • 总结


前言

好久没写这种协议了,最近正好需要用到,便详细的复习一下。

一、SPI是什么?

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口,是一种高速、全双工、同步通信总线,所以可以在同一时间发送和接收数据,SPI没有定义速度限制,通常能达到甚至超过10M/bps。

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

SPI通信原理很简单,需要至少4根线,单向传输时3根线,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)和CS/SS(片选):

MISO( Master Input Slave Output):主设备数据输入,从设备数据输出;
MOSI(Master Output Slave Input):主设备数据输出,从设备数据输入;
SCLK(Serial Clock):时钟信号,由主设备产生;
CS/SS(Chip Select/Slave Select):从设备使能信号,由主设备控制,一主多从时,CS/SS是从芯片是否被主芯片选中的控制信号,只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。
 吧。0
在这里插入图片描述
大多数从机设备都有着三态逻辑的特性,因此当设备未被选中时,它们的 MISO 信号线会变成高阻抗状态(电气断开)。没有三态输出的设备则需外接三态缓冲器才能与其他的从机设备共享 SPI 总线。

二、通信原理

SPI主设备和从设备都有一个串行移位寄存器,主设备通过向它的SPI串行寄存器写入一个字节来发起一次传输。
在这里插入图片描述
在这里插入图片描述

SPI数据通信的流程可以分为以下几步:

1、主设备发起信号,将CS/SS拉低,启动通信。

2、主设备通过发送时钟信号,来告诉从设备进行写数据或者读数据操作(采集时机可能是时钟信号的上升沿(从低到高)或下降沿(从高到低),因为SPI有四种模式,后面会讲到),它将立即读取数据线上的信号,这样就得到了一位数据(1bit)。

3、主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(缓存长度不一定,看单片机配置),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。

4、从机(Slave)也将自己的串行移位寄存器(缓存长度不一定,看单片机配置)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
例如,下图示例中简单模拟SPI通信流程,主机拉低NSS片选信号,启动通信,并且产生时钟信号,上升沿触发边沿信号,主机在MOSI线路一位一位发送数据0X53,在MISO线路一位一位接收数据0X46,如下图所示:
在这里插入图片描述
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 的周期包括半个时钟置位和半个时钟空闲的周期。
在这里插入图片描述
总结一下
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 的优点在于它有着比 I2C 更高的吞吐量,不被最大时钟速度所限制,可实现潜在的高速、极为简单的硬件接口,外围电路使用的上拉电阻是比 I2C 协议更少的,这意味着它比 I2C 的功耗更低、从机的时钟来源来自主机设备,无需新增精密振荡器、从机不需要唯一的地址、相对于并行接口而言,使用的引脚数目大大减少等优点。但同时有着一定的缺点,例如SPI 没有带内寻址、当使用多个不同模式的从机设备时,主机设备切换模式时重新初始化,会使得访问从机设备速度变慢、SPI 从机设备没有硬件流控,只能通过主机自主地延迟下个时钟周期到来的时间、仅能在短距离通信等缺点。但能在避免 SPI 的缺点的方向来应用 SPI 的话,SPI 的优点让它远远优于其他协议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android studio2022.3项目中,如何去除底部导航菜单项被点击时的点击反馈效果(涟漪效果)

如果使用bottomNavigationView.setItemBackgroundResource(0)来去除底部导航菜单点击反馈效果不生效,可能是由于其它样式或主题的影响。 在这种情况下,可以通过自定义选择器(selector)来设置底部导航菜单项的背景。 首先&#x…

Spring-动态代理

动态代理 代理模式:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。 动态代理可以在不修改类源码的前提下,给类中方法增加额外逻辑 通过cglib来实现的代理对象的创建: 基于…

MES系统如何赋能制造企业实现4M防错追溯?

生产过程4M管理和MES系统的结合是现代制造业中关键的质量管理实践,它有助于提高生产效率、降低生产成本并保证产品质量。本文将深入探讨4M管理的概念,以及MES系统如何赋能制造企业实现4M防错追溯。 一、4M管理的概念 4M管理是指在制造过程中管理和控制四…

浅谈数据结构之递归

1. 递归的定义 递归是一种在解决问题时使用自身的特殊方法。在计算机科学和数据结构中,递归是一种通过将问题分解成更小的、相似的子问题来解决复杂问题的方法。递归可以直接或间接地调用自身,将大问题转化为规模较小的子问题,直到达到基本情…

leetCode 92.反转链表 II + 图解

92. 反转链表 II - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 206. 反转链表 - 力扣&#xff08;LeetCode&am…

区块链链游合约系统开发项目模式技术方案

​随着区块链技术的发展&#xff0c;链游合约系统开发逐渐成为了一个备受关注的项目。本文将探讨区块链链游合约系统开发项目的技术方案&#xff0c;包括项目背景、开发目标、技术架构、系统流程、安全措施等方面的内容。 一、项目背景 链游是一种基于区块链技术的游戏&#xf…

加密磁盘密钥设置方案浅析 — LUKS1

虚拟化加密磁盘密钥设置方案浅析 前言元数据分析元数据格式整体格式头部格式加密算法密码校验key slot格式其它字段 流程验证 前言 我们在虚拟化加密磁盘密钥设置方案浅析 — TKS1中介绍了加密磁盘密钥设置方案&#xff0c;TKS1对密钥设置(Linux Unified Key Setup)的流程和方…

阿里云容器镜像服务的运维总结

一、背景 容器镜像服务&#xff0c;作为一个可选付费产品&#xff0c;主要作用是存储docker的镜像仓库&#xff0c;供k8s拉取到Pod节点里。 你可以自己搭建一个harbor镜像仓库&#xff0c;在公司的开发环境下&#xff0c;将image推送到仓库&#xff1b;然后在生产k8s从仓库拉取…

7-5 计算每个学生的平均成绩

7-5 计算每个学生的平均成绩 分数 15 作者 殷伟凤 单位 浙江传媒学院 输入所有学生的姓名和成绩&#xff0c;以#结束。输出每个学生的平均成绩表。 输入格式: 每一行输入一个学生的姓名和成绩&#xff0c;以空格分隔。 输入完成后以#结束 输出格式: 每行显示一个学生的姓名和…

QtC++与QTreeView详解

介绍 QTreeView 是 Qt 框架中的一个视图控件&#xff0c;用于显示树形结构的数据。它是 QAbstractItemView 类的子类&#xff0c;通常与数据模型结合使用。以下是 QTreeView 的详细讲解和在 Qt 中的作用&#xff1a; QTreeView 的作用&#xff1a; 显示层次数据&#xff1a; …

ECharts:显示暂无数据

ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求&#xff0c;实现各种炫酷的统计图表效果。 如上图所示&#xff0c;有数据的时候固然好看&#xff0c;但是当它没有数据的时候&#xff0c;就是光秃秃的一片&#xff0c;所…

说说React Router有几种模式?实现原理?

一、是什么 在单页应用中,一个web项目只有一个html页面,一旦页面加载完成之后,就不用因为用户的操作而进行页面的重新加载或者跳转,其特性如下: 改变 url 且不让浏览器像服务器发送请求在不刷新页面的前提下动态改变浏览器地址栏中的URL地址其中主要分成了两种模式: has…

【GitHub】PR的学习笔记

PR流程 Fork the repository.Clone the fork-repo.Make the desired changes.Stage files: git add.Commit the changes: git commitPush them to the fork-online: git push.Create a pull request.

排序算法之-快速

算法原理 丛待排序的数列中选择一个基准值&#xff0c;通过遍历数列&#xff0c;将数列分成两个子数列&#xff1a;小于基准值数列、大于基准值数列&#xff0c;准确来说还有个子数列&#xff1a;等于基准值即&#xff1a; 算法图解 选出基准元素pivot&#xff08;可以选择…

[文件读取]shopxo 文件读取(CNVD-2021-15822)

1.1漏洞描述 漏洞编号CNVD-2021-15822漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: ShopXO是一套开源的企业级开源电子商务系统。 ShopXO存在任意文件读取漏洞&#xff0c;攻击者可利用该漏洞获取敏感信息。 1.2漏洞等级 高危 1.3影响版本 ShopXO 1.4漏洞复现…

【Git】第一篇:Git安装(centos)

git查看安装版本 以我自己的centos7.6为例&#xff0c;我们可以输入以下指令查看自己是否安装了git. git --version安装了的话就会显示自己安装的版本。 git 安装 安装很简单&#xff0c;一条命令即可 sudo yum install git -ygit 卸载 sudo yum remove git -y

《使用EasyExcel在Excel中增加序号列的方法》

《使用EasyExcel在Excel中增加序号列的方法》 1、简介2、正文3、核心代码4、使用方法5、效果 1、简介 在处理Excel文件时&#xff0c;有时候需要为表格增加序号列。本文介绍了如何使用Java代码实现在Excel中增加序号列的功能&#xff0c;并提供了一个示例代码。 2、正文 在处理…

神经风格转化

深入到神经风格转换的领域。你就会发现尽管NST在概念上很容易理解&#xff0c;但要生成高质量图像却出奇地困难。为了获得良好的结果&#xff0c;必须正确实施许多复杂的细节和未提及的技巧。在本文中&#xff0c;我们将深入研究神经风格转换的知识&#xff0c;并详细研究这些技…

【数学】Pair of Topics—CF1324D

Pair of Topics—CF1324D 思路 很明显&#xff0c;需要对 a i a j > b i b j a_i a_j > b_i b_j ai​aj​>bi​bj​ 化简&#xff1a; a i − b i > b j − a j a_i - b_i > b_j - a_j ai​−bi​>bj​−aj​ a i − b i > − ( a j − b j ) a_…

Android 图层列表 、 LayerDrawable 、 layer-list \ 改变 seekbar thumb 滑块 的颜色

android 官网 &#xff1a; 图层列表 LayerDrawable / layer-list LayerDrawable 是管理其他可绘制对象数组的可绘制对象。列表中的每个可绘制对象均按照列表顺序绘制。列表中的最后一个可绘制对象绘于顶部。 每个可绘制对象均由单个 <layer-list> 元素内的 <item>…