SPI通信讲解
了解SPI通信对于我们了解通信有非常重要的意义。
SPI(Serial Peripheral Interface)是由Motorola公司(摩托罗拉)开发的一种通用数据总线
四根通信线:
SCK(Serial Clock):时钟线;
MOSI(Master Output Slave Input):主机输出从机输入线;
MISO(Master Input Slave Output):主机输入从机输出线;
SS(Slave Select):从机选择线;(代替了I2C的从机寻址机制)
另外由于SPI是单端通信所以SPI还需要另外的共地,GND线。
注意:
1.SPI是全双工,不支持多主机;
输出引脚就是输出,输入就是输入,不需要像I2C还需要输入输出转换,唯一冲突在于SS从机线
2.SPI不存在数据应答机制的设计,只有接收和发送数据。
不同设备名称可能不同,却决于明确该设备身份为从机还是主机。
有时候对于数据线接口有很多不同我们往往有着更多的写法,到底什么意思还是需要自己根据使用芯片是作为主机还是从机。
这里我们拿一个W25QXX一个外挂的Flash存储器为例子,它一般作为从机,所以DO就是从机输出主机输入,DI就是从机输入主机输出。具体还是需要看设备本省需要作为从机还是主机。
当实在不清楚的时候我们可以查看具体的芯片手册。对于STM32来说,STM32常常作为主机,当然也有作为从机(支持身份转换),不过我们往往用做主机比较多。
硬件电路:
所有SPI设备的SCK、MOSI、MISO分别连在一起主机另外引出多条SS控制线,分别接到各从机的SS引脚,代替了 从机寻址的软件操作,但是需要多一根从机选择线的硬件资源。
输出引脚MOSI配置为推挽输出(I2C为开漏输出是需要兼顾于多主机仲裁等等),输入引脚MISO配置为浮空或上拉输入。
同样需要注意的地方,SPI为单端信号(他们的高低电平都是相对于各自GND),需要,要求通信双方共地。
SCLK时钟线为主机绝对掌控,对于主机而言时钟线SCLK为输出,对于从机而言SCLK时钟线为输入。
(如果从机没有供电,还需要引脚引出来,主机引出供电线,给予从机寄生供电)
下面是大概框图:
需要注意:
在平时当中,SS为高电平,当主机需要时候会对相应的SS从机线置低电平,当完成通信以后主机就会将SS拉回高电平代表通信结束。就不需要像I2C需要发送从机位地址进行选择从机(从机寻址)。
输出引脚配置为推挽输出,高低电平均有很强的驱动能力,上升/下降沿速度非常快
(拉高拉低电平就会非常迅速)信号变化的快,就使得通信速度大大能达到MHZ,但是由于I2C是半双工只有两根线经常需要切换输入输出模式,同时需要兼顾多主机的时钟同步和仲裁问题,就使得其只能使用开漏输出,而开漏输出拉低非常迅速,但是拉高就比较慢,所以通信速度没有SPI那么快。
SPI不支持多主机,不要考虑冲突,唯一的冲突点在于,主机的MISO,主机一个输入而从机三个或者多个输出,就会导致冲突,因此SPI协议规定当从机未被选中,从机的MISO引脚必须切换为高阻态(不允许输出)。
软件实现:
主要就是理解一个移位的过程:
SPI一般是高位先行,我们利用时钟,当时钟产生上升沿,主机移出最高位的一个数据放在MOSI线上同时数据整体左移一位,从机移出最高位的数据放到MISO上,并且整体数据左移一位。当时钟产生下降沿,主机从MISO线上把从机放在MISO线上数据移入,放在最低位上,同样的,下降沿的时候,从机从MOSI线上把主机放在线上的高位,移入放在低位。
主机和从机都会进行采样输入直到数据完成交换过程,这就是实际的过程。
SPI时序基本单元:
起始条件:SS从高电平切换到低电平
终止条件:SS从低电平切换到高电平
SS低电平代表:正在通信;
SPI有两种可以配置的位
CPOL(Clock Polarity):时钟极性
CPHA(Clock Phase):时钟相位
综合起来可以有也就是四种模式
如下表:
模式选择 | 时钟极性CPOL | 时钟相位CPHA |
模式0 | 0 | 0 |
模式1 | 0 | 1 |
模式2 | 1 | 0 |
模式3 | 1 | 1 |
注意:
- 时钟极性CPOL的“0”和“1”决定了,空闲状态SCLK的电平是高还是低决定了第一个时钟沿是上升沿还是下降沿。
- 时钟相位CPHA 的“0”和“1”决定了,SCK第一个边沿是移入还是移出数据也可以说是决定了主机是奇数边沿采样还是偶数边沿采样。
模式介绍:
模式0:
交换一个字节(模式0)
CPOL=0:空闲状态时,SCK为低电平;
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据;
模式0时序图
结合时序图讲解一下
首先SS由高电平变为低电平,代表SPI通信的开始,当SS由低电平变为高电平,代表SPI通信结束。
SCK由于CPOL为0,所以空闲为低电平,所以开始数据交换时候,第一个为上升沿,第二个为下降沿。所以CPOL决定的往往就是SCK,第一个为上升沿还是下降沿。
MOSI:由于CPHA为0,所以在第一个时钟沿进行数据移入操作((实际需要提前移出数据,相位提前一个时期),在第二个时钟沿进行数据移出操作。我们不断地进行操作可以发现,永远是奇数移入操作,偶数移出操作,对于主机数据采集也可以说就是奇数边沿采样。
注意:
- MOSI,MISO两个线交叉代表可能发送地数据是“0”或者“1”;
- MISO前面一个线代表上面说的高阻态,防止主机数据交换地时候有其他从机输出影响主机数据读取。
模式1:
交换一个字节(模式1)
CPOL=0:空闲状态时,SCK为低电平;
CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据;
模式1时序图
结合时序图讲解一下
首先SS由高电平变为低电平,代表SPI通信的开始,当SS由低电平变为高电平,代表SPI通信结束。
SCK由于CPOL为0,所以空闲为低电平,所以开始数据交换时候,第一个为上升沿,第二个为下降沿。所以CPOL决定的往往就是SCK,第一个为上升沿还是下降沿。
MOSI:由于CPHA为1,所以在第一个时钟沿进行数据移出操作,在第二个时钟沿进行数据移入操作。所以要求我们要提前将数据移入到线上才能保证在第一个时钟沿保证进行的是数据移出的操作,我们不断地进行操作可以发现,永远是奇数移出操作,偶数移入操作对于主机数据采集也可以说就是偶数边沿采样。
模式2:
交换一个字节(模式2)
CPOL=1:空闲状态时,SCK为高电平;
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据;
模式2时序图
首先SS由高电平变为低电平,代表着SPI通信的开始,当SS由低电平变为高电平,代表着SPI通信的结束。
SCK:由于时钟极性CPOL为1,所以SCLK在空闲状态为高电平,所以在通信时,第一个时钟沿为下降沿,第二个为上升沿。
MOSI:由于CPHA为0,所以在第一个时钟沿进行数据移入的操作,在第二个时钟沿进行数据移出的操作。重复操作可以发现,主机为奇数边沿采样。
模式3:
交换一个字节(模式3)
CPOL=1:空闲状态时,SCK为高电平;
CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据;
模式3时序图
首先SS由高电平变为低电平,代表着SPI通信的开始,SS由低电平变为高电平代表着SPI通信的结束。
SCK:由于CPOL为1,所以SCLK空闲状态为高电平,所以SPI第一个时钟沿为下降沿,第二个为上升沿;
MOSI:由于CPHA为1,所以主机在第一个时钟沿进行数据移出的操作,在第二个边沿进行数据移入的操作,我们不断重复操作就可以发现,主机永远是在偶数时钟边沿进行数据采样。
以上就是对SPI模式的讲解,在实际使用过程当中,往往模式0使用较多。
相关文章:

SPI通信讲解
了解SPI通信对于我们了解通信有非常重要的意义。 SPI(Serial Peripheral Interface)是由Motorola公司(摩托罗拉)开发的一种通用数据总线 四根通信线: SCK(Serial Clock):时钟线&a…...

本地一键部署grafana+prometheus
本地k8s集群内一键部署grafanaprometheus 说明: 此一键部署grafanaPrometheus已包含: victoria-metrics 存储prometheus-servergrafanaprometheus-kube-state-metricsprometheus-node-exporterblackbox-exporter grafana内已导入基础的dashboard【7个…...
NIO核心依赖多路复用小记
NIO允许一个线程同时处理多个连接,而不会因为一个连接的阻塞而导致其他连接被阻塞。核心是依赖操作系统的多路复用机制。 操作系统的多路复用机制 多路复用是一种操作系统的 I/O 处理机制,允许单个进程(或线程)同时监视多个输入…...
如何彻底卸载 Microsoft Edge?
关闭 Microsoft Edge 浏览器和所有正在运行的进程。 按下 Ctrl Shift Esc 键打开任务管理器。在任务管理器中,找到所有正在运行的 Microsoft Edge 进程。右键单击每个进程,然后选择“结束任务”。 导航至 Microsoft Edge 的安装目录。 默认情况下&…...
JavaScript-对象-笔记
1.字面量创建对象、对象的使用 对象就是一组 属性和方法的集合 属性: 特征 相当于变量 静态 是什么 方法: 行为 相当于函数 动态 干什么 创建对象 创建对象的第一种:使用字面量 {} 对象中的元素是键值对 使用逗号隔开 键:值 的形式 var 对象名…...

java 运算符 选择语句
1:运算符 运算符:对字面量或者变量进行操作的符号 表达式:用运算符把字面量或者变量连接起来符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表达式。 举例说明:** int a 10; int b 20; in…...

CNN:Convolutional Neural Network(上)
目录 1 为什么使用 CNN 处理图像 2 CNN 的整体结构 2.1 Convolution 2.2 Colorful image 3 Convolution v.s. Fully Connected 4 Max Pooling 5 Flatten 6 CNN in Keras 原视频:李宏毅 2020:Convolutional Neural Network 1 为什么使用…...

将Android应用修改为鸿蒙应用的工作
将Android应用修改为鸿蒙(HarmonyOS)应用需要进行一系列主要的工作。以下是在进行这一转换过程中可能需要进行的主要工作,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.项目…...
03 Strategy策略
抽丝剥茧设计模式 之 Strategy策略 - 更多内容请见 目录 文章目录 一、Strategy策略二、Comparable和Comparator源码分析使用案例Arrays.sort源码Collections.sort源码Comparable源码Comparator源码 一、Strategy策略 策略模式是一种设计模式,它定义了一系列的算法…...

Python实现分位数回归模型(quantreg算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 分位数回归是简单的回归,就像普通的最小二乘法一样,但不是最小化平方误差的总和…...
【ROS2简单例程】基于python的发布订阅实现
1、自定义消息类型Student 1.1 创建base_interfaces_demo包 1.2 创建Student.msg文件 string name int32 age float64 height 1.2 在cmakeLists.txt中增加如下语句 #增加自定义消息类型的依赖 find_package(rosidl_default_generators REQUIRED) # 为接口文件生成源代码 ro…...

【期末考试】数据库综合复习宝典
目录 第一章 数据库系统概述 第二章 关系代数 第四章 关系数据库理论 第五章 数据库设计 第六章 数据库管理系统 第八章 事务管理 第一章 数据库系统概述 1.1三级模式 ①外模式:它为特定的应用程序或用户群体提供了一个数据视图,这个视图是独立于…...

OpenHarmony南向之LCD显示屏
OpenHarmony南向之LCD显示屏 概述 LCD(Liquid Crystal Display)驱动,通过对显示器上下电、初始化显示器驱动IC(Integrated Circuit)内部寄存器等操作,使其可以正常工作。 HDF Display驱动模型 LCD器件驱…...
核心笔记-短篇
接口管理平台:yapi 对象拷贝:Spring Bean 提供的 BeanUtils;hutool-core 提供的 BeanUtil 获得用户设备的信息:导入 UserAgentUtils 依赖;创建 UserAgent 对象使用 加密工具:DigestUtils,Spring Core 提供,静态方法:md5DigestAsHex(byte[]) 客户端编程工具包:HttpCli…...
系统学习Python——警告信息的控制模块warnings:为新版本的依赖关系更新代码
分类目录:《系统学习Python》总目录 在默认情况下,主要针对Python开发者(而不是Python应用程序的最终用户)的警告类别,会被忽略。 值得注意的是,这个“默认忽略”的列表包含DeprecationWarning(…...
爬虫的基本原理
基本原理 可以把网页与网页之间的链接关系比作节点中的连线,爬虫可以根据网页中的关系获取后续的网页,当整个网站涉及的页面全部被爬虫访问到后,网站的数据就被访问下来了。 1.爬虫概述 简单点讲,爬虫就是获取网页并提取和保存信…...

MySQL核心SQL
一.结构化查询语言 SQL是结构化查询语言(Structure Query Language),它是关系型数据库的通用语言。 SQL 主要可以划分为以下 3 个类别: DDL(Data Definition Languages)语句 数据定义语言,这…...

关于 setData 同步异步的问题
小程序官方文档中的回答解释: 所以大概意思就是: 1.setData在逻辑层的操作是同步,因此this.data中的相关数据会立即更新,比如下面的例子: const a 1 this.setData({b: a ? a : , }) console.log(that.data.b) // 1 2. setData在视图层的操作是异步,…...
Centos创建一个Python虚拟环境
在 CentOS 上创建一个 Python 虚拟环境,可以使用 virtualenv 工具。以下是创建和激活虚拟环境的基本步骤: 1.安装virtualenv 如果还没有安装 virtualenv,可以使用以下命令安装: sudo yum install python3-virtualenv请注意&…...

怎么使用好爬虫IP代理?爬虫代理IP有哪些使用技巧?
在互联网时代,爬虫技术被广泛应用于数据采集和处理。然而,在使用爬虫技术的过程中,经常会遇到IP被封禁的问题,这给数据采集工作带来了很大的困扰。因此,使用爬虫IP代理成为了解决这个问题的有效方法。本文将介绍如何使…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...