嵌入式知识点-SPI通讯
该文原自 : 正点原子
01 SPI概述
SPI (Serial Peripheralinterface),顾名思义就是串行外围设备接口。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在EEPROM,FLASH,实时时钟,AD转换器。
打开STM32F103手册,找到SPI的结构框图,了解它的大致功能,如以下图所示:

关于SPI协议,那么我们理解一句话即可。SPI的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
主机与从机连接关系图:

一个GIF描述关于SPI传输过程:SPI可以指定数据传输从MSB位还是LSB位开始:例如数据传输从MSB位开始:

上述GIF可知:当一个上升沿来临时,MOSI发送主机的最高位MSB为1,而MISO是由从机发出为1,然后等价交换。注意:上述SPI的GIF使用的是SPI模式1,SPI不一定是由上升沿为数据采样,是由SPI模式决定,上述GIF的MSB代表移位寄存器的最高位,由此类推,我们得到以下表格:

注意:上述图中的颜色以及MSB为串行缓冲区的最高位
02 SPI引脚信息
MISO:主设备数据输入,从设备数据输出,简单来讲:从机发数据到串行总线上或者主机接收总线的数据。
MOSI :主设备数据输出,从设备数据输入,简单来讲:主机发数据到串行总线上或者从机接收总线的数据。
SCLK :时钟信号,由主设备产生,数据发送时,必须有方波输出,没有数据时,不会有方波输出。
CS:从设备片选信号,由主设备控制。简单来讲:主机发送数据到那个从机,如果CS为低电平就是使能该从机,否则除能该从机。
03 SPI工作模式
SPI的工作模式:是由CPOL(时钟极性)和CPHA(时钟相位)相关。
时钟极性(CPOL):指通讯设备处于空闲状态(SPI开始通讯前、nSS线无效)时,SCK的状态。
CPOL = 0:SCK在空闲时为低电平。
CPOL = 1:SCK在空闲时为高电平。
前面小编说了,如果从机没有数据发送或者主机没有数据发送,那么SCK不会有方波输出,SCK在空闲状态为低电平或者高电平是由时钟极性(CPOL)决定。
时钟相位(CPHA):指数据的采样时刻位于SCK的偶数边沿采样还是奇数边沿采样。
CPHA = 0:在SCK的奇数边沿采样。
CPHA = 1:在SCK的偶数边沿采样。
由上述CPOL(时钟极性)和CPHA(时钟相位)可知:SPI模式一共分为四种,如以下图所示:

注意:上述图片红色部分:SPI模式0时,空闲状态时候SCLK为低电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是奇数边沿时刻,采样边沿为上升沿。
SPI模式1时,空闲状态时候SCLK为低电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是偶数边沿时刻,采样边沿为下降沿。
SPI模式2时,空闲状态时候SCLK为高电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是奇数边沿时刻,采样边沿为下降沿。
SPI模式3时,空闲状态时候SCLK为高电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是偶数边沿时刻,采样边沿为上升沿。

04 SPI实验
例如:CPOL =0 和CPHA =0为例,其他模式一样的原理,SCL空闲时候为低电平,奇数边沿上升沿采样,那么下降沿接收数据,如果两块STM32的SPI1相连,如以下图所示:

主机和从机都有一个串行移位寄存器,主机通过想它的SPI串行寄存器写入一个字节来发起一次传输。
主机的串行移位寄存器通过MOSI线将字节传输给从机,同时从机也将自己的串行移位寄存器中的内容通过MISO线传输给主机。这样两个移位寄存器的内容就被交换了。
外设的写操作和读操作是同步完成的。如果只想进行写操作,主机只需忽略接收的字节。如果只想进行读操作,也必须发送一个字节(可以是空字节)来引发从机传输。
那么它们都具有一个串行移位寄存器,例如主机串行缓冲区数据为0xAA,那么发送从机的数据为0xaa就是10101010二进制,如果从机的串行缓冲区数据的数据为0x9F,转成二进制为10011111,所以我们得到下图所示:

总结
前面我们已经说了CPOL设置为0,所以SCLK空闲状态为低电平,如果没有数据发送,那么SCLK一直为低电平。
当主机发送数据时,SCLK一直为低电平转为输出一个方波,注意是八个脉冲,由于CPHA 设置为 0,所以奇数边沿,上升沿有效,所以数据采样在上升沿,当发送完成时,MOSI转成高电平。
NSS为低电平有效,主要使能从机。
主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输
串行移位寄存器通过MOSI信号线将字节传送给从机,同时从机也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换;
相关文章:
嵌入式知识点-SPI通讯
该文原自 : 正点原子 01 SPI概述 SPI (Serial Peripheralinterface),顾名思义就是串行外围设备接口。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同…...
C#教程--01 简介
简介 C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。 C#的特性 现代的、通用的编程语言。 面向对象。 面向组件。 容易学习。 结构化语言。 它产生高效率的程序。 它可以在多种计算机平台上编译。 .Net 框架的一部分。 C#强大的编程…...
【java基础】一篇文章彻底搞懂lambda表达式
文章目录lambda表达式是什么lambda表达式的语法函数式接口初次使用深入理解方法引用 :: 用法快速入门不同形式的::情况1 object::instanceMethod情况2 Class::instanceMethod情况3 Class::staticMethod对于 :: 的一些示例及其注意事项构造器引用变量作用域使用外部变量定义内部…...
通用SQL查询分析器
技术:Java、JSP等摘要:本文主要针对当前很多软件都无法实现跨数据库、跨平台来执行sql语句而用户又仅需做一些基本的增删改查操作的矛盾,设计了一个能够跨平台跨数据库的软件。此软件是一个通用SQL查询分析器,利用java语言本身的跨…...
机器学习100天(三十八):038 朴素贝斯-处理离散数据
《机器学习100天》完整目录:目录 机器学习100天,今天讲的是:朴素贝斯-处理离散数据! 打开 spyder,新建一个 naive_bayes_category.py 脚本。上一节我们引入了一批西瓜样本。并使用朴素贝叶斯公式计算出一个瓜蒂脱落、圆形、青色的西瓜是熟瓜的概率。下面我们来使用 pytho…...
【3.3】指针、二分、SSM项目
二分查找 class Solution {public int search(int[] nums, int target) {int n nums.length;int left 0;int right n - 1;while(left < right){int mid left (right - left) / 2;if(nums[mid] < target){left mid 1;}else if(nums[mid] > target){right mid …...
buu [INSHack2017]rsa16m 1
题目描述: 打开的 rsa_16m 文件 : (在此我只想说神人才找得到 c 的位置) ,这位置是真的难找啊 题目分析: 首先打开 description.md 文件,得到: 翻译下来: 当您需要真正…...
【数据结构起航】:衡量算法的好坏--时间空间复杂度
时间复杂度和空间复杂度 文章目录时间复杂度和空间复杂度1.算法效率1.1算法复杂度1.2复杂度在OJ里的应用2.时间复杂度2.1时间复杂度的概率2.2大O渐进表示法推导大O阶方法:2.3时间复杂度的举例计算3.空间复杂度3.1空间复杂度的举例计算4.复杂度各量级对比1.算法效率 …...
动手学深度学习【1】——线性回归
动手学深度学习网址:动手学深度学习 注:本部分只对基础知识进行简单的介绍并附上完整的代码实现,更多内容可参考上述网址。 简述 需要的准备知识 数学的偏导线性代数 线性模型 回归是能为一个或多个自变量与因变量之间关系建模的一类方…...
Html 相关知识
Html 相关知识 DOM 文档对象模型 (DOM) 是 HTML 和 XML 文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包…...
【冲刺蓝桥杯的最后30天】day1
大家好😃,我是想要慢慢变得优秀的向阳🌞同学👨💻,断更了整整一年,又开始恢复CSDN更新,从今天开始逐渐恢复更新状态,正在备战蓝桥杯的小伙伴可以支持一下哦!…...
c++泛型编程与模板-01函数模板
函数模板的定义 所谓函数模板,实际就是写一个通用函数,返回值和参数的类型都是可变的,用一个特定格式的变量来指定,然后调用此函数的时候,编译器会根据参数的数据类型自动推导出类型,从而达到函数再不同的…...
Golang http请求忘记调用resp.Body.Close()而导致的协程泄漏问题(含面试常见协程泄漏相关测试题)
参考: 知乎:别因为忘记close你的httpclient,造成goroutine泄漏 CSDN:resp.Body.Close() 引发的内存泄漏goroutine个数 先来看几道题,想一想最终的输出结果是多少呢? package mainimport ("fmt"…...
进程信号生命周期详解
信号和信号量半毛钱关系都没有! 每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定 义 #define SIGINT 2 查看信号的机制,如默认处理动作man 7 signal SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理…...
2023-03-03干活小计
今天见识了 归一化的重要性:归一化 不容易爆炸 深度了解了学习率:其实很多操作 最后的结果都是改变了lr 以房价预测为例:一个点一个点更新 比较 矩阵的更新: 为什么小批量梯度下降 优于随机梯度下降 优于批量梯度下降ÿ…...
操作系统结构
随着操作系统的不断增多和代码规模的不断扩大,提供合理的结构对提升操作系统的安全与可靠性来说变得尤为重要。 1.分层法 指将操作系统分为若干层,最低层位硬件,最高层为用户接口,每层只能调用紧邻它的低层的功能和服务(类似于计…...
[SSD科普] 固态硬盘物理接口SATA、M.2、PCIe常见疑问,如何选择?
前言犹记得当年Windows 7系统体验指数中,那5.9分磁盘分数,在其余四项的7.9分面前,似乎已经告诉我们机械硬盘注定被时代淘汰。势如破竹的SSD固态硬盘,彻底打破了温彻斯特结构的机械硬盘多年来在电脑硬件领域的统治。SSD数倍于HDD机…...
【Java学习笔记】3.Java 基础语法
Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象ÿ…...
Python基础学习6——if语句
基本概念 if语句为条件判断语句,用来判断if后面的语句是真是假。if的用途有很多,比如作为条件测试可以判断两数是否相等与不等、进行数值笔记等等。例子如下: Lego_price (599, 799, 898) if Lego_price[0] 599:print("Correct!&quo…...
有免费的PDF转Word吗?值得收藏的7个免费 PDF转Word工具请收好
PDF 和 DOC 是人们在工作中广泛使用的两种最流行的文档格式。PDF 是 Adobe 的便携式文档格式,DOC 是 Microsoft 的 Word 文档格式。PDF 是一种更安全可靠的文件格式,因为它很难编辑 PDF 文件,但是有一些称为 PDF 编辑器的工具可用于编辑 PDF …...
华为Matebook 13双系统实战:Win10与Ubuntu 16.04无缝共存指南
1. 为什么选择华为Matebook 13安装双系统 作为一名长期使用双系统开发的工程师,我最近在华为Matebook 13上成功部署了Win10Ubuntu 16.04双系统组合。这款13英寸的轻薄本确实给了我不少惊喜——2K全面屏、1.3kg超轻机身、第八代i5处理器,这些硬件配置对于…...
OpenClaw云端体验方案:Qwen3.5-9B镜像免安装调试技巧
OpenClaw云端体验方案:Qwen3.5-9B镜像免安装调试技巧 1. 为什么选择云端沙盒方案? 上周我尝试在本地笔记本部署OpenClaw时,遭遇了Python版本冲突、CUDA驱动不兼容等一系列问题。作为一个经常需要快速验证技术方案的开发者,这种环…...
如何高效提取网页SVG内容:3步实现可视化数据导出
如何高效提取网页SVG内容:3步实现可视化数据导出 【免费下载链接】svg-crowbar Extracts an SVG node and accompanying styles from an HTML document and allows you to download it all as an SVG file. 项目地址: https://gitcode.com/gh_mirrors/sv/svg-crow…...
嵌入式软件发中AI技术及工具的应用
嵌入式软件开发中的人工智能技术应用与辅助方法详述及未来展望 引言 人工智能正从“被嵌入到终端设备”的单向角色,逐步演变为“赋能开发过程本身”的双向驱动力。在嵌入式软件开发领域,AI不仅让设备更智能,更在深刻改变着开发者的工作方式—…...
告别PCtoLCD2002!这款单片机调试助手如何用3步搞定OLED汉字显示?
3步解锁OLED汉字显示:新一代嵌入式开发神器实战指南 在嵌入式开发领域,OLED屏幕的汉字显示一直是让开发者头疼的难题。传统方案如PCtoLCD2002等取模软件不仅操作繁琐,生成的代码还需要大量手工调整。如今,一款名为单片机多功能调试…...
番茄矮砧密植:水肥一体化系统铺设全指南
大棚里,老周的番茄挂果累累,红绿相间。“这套系统让我的番茄产量翻了一番,”他指着地里的滴灌设备说,“不仅省工省力,品质还特别稳定。”认识番茄矮砧密植番茄矮砧密植,简单来说就是选用矮生品种࿰…...
so-vits-svc声压级标准化终极指南:如何避免AI语音转换中的音频质量损伤
so-vits-svc声压级标准化终极指南:如何避免AI语音转换中的音频质量损伤 【免费下载链接】so-vits-svc SoftVC VITS Singing Voice Conversion 项目地址: https://gitcode.com/gh_mirrors/so/so-vits-svc so-vits-svc作为当前最先进的AI歌声转换框架ÿ…...
OpCore-Simplify智能构建:OpenCore EFI自动化生成的效率提升实践
OpCore-Simplify智能构建:OpenCore EFI自动化生成的效率提升实践 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 用户场景:黑苹…...
4步构建高效视频处理流水线:VideoFusion全功能指南
4步构建高效视频处理流水线:VideoFusion全功能指南 【免费下载链接】VideoFusion 一站式短视频拼接软件 无依赖,点击即用,自动去黑边,自动帧同步,自动调整分辨率,批量变更视频为横屏/竖屏 项目地址: https://gitcode.com/gh_mirrors/vi/VideoFusion 功能特性…...
流式清洗新标准:Polars 2.0 Streaming ETL在Kafka-ClickHouse链路中的低延迟落地(端到端<120ms)
第一章:流式清洗新标准:Polars 2.0 Streaming ETL在Kafka-ClickHouse链路中的低延迟落地(端到端<120ms) Polars 2.0 引入的原生流式执行引擎(Streaming Execution Engine)彻底重构了传统批式DataFrame处…...
