【STM32】SPI通信

1 SPI通信

SPI(Serial Peripheral Interface,串行外设接口)是由Motorola公司开发的一种通用数据总线

四根通信线:SCKSerial Clock,串行时钟)、MOSIMaster Output Slave Input,主机输出从机输入)、MISOMaster Input Slave Output,主机输入从机输出)、SSSlave Select,从机选择

同步,全双工

MOSI接到主机上就是输出,接到从机上就是输入;

MISO接到主机上就是输入,接到从机上就是输出。

支持总线挂载多设备(仅支持一主多从)

逻辑是:在起始条件后,主机必须先发送一个字节进行寻址,用来指定我要跟哪个从机进行通信(I2C这里涉及分配地址和寻址的问题),SPI直接使用一条通信线选择和哪个从机进行通信(SS,从机选择,不止一条)

SPI没有应答机制

W25Q64(Flash存储器)、OLED、2.4G无线通信模块(NRF2401)、SD卡

1.1 硬件电路

所有SPI设备的SCKMOSIMISO分别连在一起

主机另外引出多条SS控制线,分别接到各从机的SS引脚

输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

推挽输出的高低电平均有很强的驱动能力,这将使得SPI引脚信号的下降沿非常迅速,上升沿也非常迅速。当从机的SS引脚为高电平时,也就是从机没有被选中时,它的MISO引脚,必须切换为高阻态(相当于断开,不输出任何电平),防止一条线有多个输出,产生冲突。

图中清晰明了

细节:

(1)主机的时钟线SCK是输出,从机的SCK时钟线是输入,主机与从机时钟同步;

(2)SS高电平不选择从机,低电平才选择从机。同一时刻主机只能选择一个从机。

1.1.1 移位示意图

左边是SPI主机,里面有8位的移位寄存器,右边是SPI从机,里面也有8位移位寄存器。这里移位寄存器有一个时钟输入端,因为SPI一般都是高位先行,所以每来一个时钟,移位寄存器就会向左进行移位,从机中的移位寄存器也是如此。移位寄存器的时钟源是由主机提供的,这里叫做波特率发生器,它产生的时钟驱动主机的移位寄存器进行移位,同时这个时钟也通过SCK时钟线进行输出接到从机的移位寄存器里。之后上面移位寄存器的接法是主机移位寄存器左边移出去的数据,通过MOSI引脚输入到从机移位寄存器的右边,从机移位寄存器左边移出去的数据通过MISO引脚输入到主机移位寄存器的右边。

工作流程:规定波特率时钟的上升沿,所有移位寄存器向左移动一位,移出去的位放在引脚上;波特率发生器时钟的下降沿引脚上的位采样输入到移位寄存器的最低位。

假设主机有1010 1010数据需要发送到从机,同时从机有0101 0101数据需要发送到主机。先驱动时钟,先产生一个上升沿,这时所有位都会向左移动一位。此时MOSI的数据是1,所以MOSI的电平是高电平;MOSI的数据是0,所以MISO的电平是低电平。如图所示。

之后时钟继续运行,上升沿之后下一个边沿就是下降沿,在下降沿的时候,主机和从机都会进行数据采样输入,如图所示。这是第一个时钟结束后的现象。

之后以此类推,8次后完成数据的发送和接收。SPI通信的基础是交换一个字节。

只想接收或者发送,不用管另一方即可。

1.1.2 SPI时序基本单元

(1)起始条件:SS从高电平切换到低电平

(2)终止条件:SS从低电平切换到高电平

从机的选中过程中,SS始终保持在低电平。

(3)交换一个字节(模式1)

CPOL:clock polarity时钟极性

CPHA:clock phase,时钟相位

CPOL=0:空闲状态时,SCK为低电平

CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据(数据采样)

SS从机选择,通信开始前是高电平,在通信过程中SS保持低电平,通信结束,SS恢复高电平。

在SS高电平时,MISO(主机输入,从机输出)用中间的一条线表示高阻态,SS下降沿之后,从机的MISO被允许开始输出;SS上升沿之后,从机的MISO必须置会高组态。

SCK的第一个边沿是上升沿,主机和从机同时移出数据,主机通过MOSI移出最高位,此时MOSI的电平就表示主机要发送的数据B7;从机通过MISO移出最高位,此时MISO表示从机要发送数据的B7;然后时钟运行,产生下降沿,此时主机和从机同时移入数据,也就是进行数据采样。这里主机移出的B7进入从机移位寄存器的最低位;从机移出的B7进入主机移位寄存器的最低位,这样一个脉冲产生完毕,一个数据位传输完毕。接下来以此类推。

(4)交换一个字节(模式0)

CPOL=0:空闲状态时,SCK为低电平

CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

相比模式1相位提前了, SCK第一个边沿之前就要开始移出数据了,或者是第0个边沿移出,第1个边沿移入。首先SS下降沿开始通信,现在SCK还没有变化,但是SCK一旦开始变化,就要移入数据了,所以此时趁SCK还没有变化,SS下降沿时,就要立刻触发移位输出,所以这里MOSI和MISO的输出是对齐到SS下降沿的,或者说这里把SS的下降沿也作为时钟的一部分了,SS下降沿触发了输出,SCK上升沿就可以进行数据输入采样了,这样B7就传输完毕,之后SCK下降沿,移出B6,SCK上升沿移入B6,以此类推,SCK下降沿移出数据,上升沿移入数据

模式0是最常见的模式,很多SPI设备都支持这种模式,因此兼容性较好。
模式0可以实现较高的传输速率,因为数据在时钟的上升沿就被采样,不需要等待下降沿。

(5)交换一个字节(模式2)

CPOL=1:空闲状态时,SCK为高电平

CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

模式2和模式0波形相反。

(6)交换一个字节(模式3)

CPOL=1:空闲状态时,SCK为高电平

CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

模型3和模式1的波形相反。

1.1.3 SPI时序

以W25Q64为例。SPI是指令码+数据

(1)发送指令

向SS指定的设备,发送指令(0x06,W25Q64写使能

SS下降沿时刻,时序开始,此时MOSI和MISO就要开始变化数据了。MOSI由于指令码最高位仍然是0,所以这里保持低电平不变;MISO从机没有数据发送给主机,引脚电平没有变换,STM32的MISO是上拉输入,所以这里呈现高电平。之后SCK第一个上升沿,进行数据采样,从机采样输入,得到0,主机采样输入,得到1。之后继续,第二个时钟,主机数据仍然是0,所以波形没有变化,然后一位一位的发送接收发送接收,到主机发送1时才发生变化,下降沿,数据移出,主机将1移出到MOSI,MOSI变为高电平;然后SCK上升沿,数据采样输入,在最后一位下降沿,数据变化,MOSI变为0;上升沿数据采样,从机接收数据0,SCK低电平是变化的时期,高电平是读取的时期。时序SCK最后一个上升沿结束,一个字节就交换完成了。主机用0x06换来了从机的0xFF

(2)指定地址写

向SS指定的设备,发送写指令(0x02),随后在指定地址(Address[23:0])下,写入指定数据(Data

写指令之后的字节,定义为地址高位(0x12,23~16),0x34(15~8),0x56(7~0),即0x123456,继续交换,写入0x55

(3)指定地址读

向SS指定的设备,发送读指令(0x03),随后在指定地址(Address[23:0])下,读取从机数据(Data

主机交换从机地址0x123456下的数据。即指定地址读,读的是0x55

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

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

相关文章

使用react+vite开发项目时候,部署上线后刷新页面无法访问解决办法

说一下我这边的环境和使用的路由模式:vitereactBrowserRouter路由模式,所以如果你和我一样的话,可以试试我的这种解决办法,我是将项目打包后直接丢到服务器上的目录里面,然后配置nginx直接访问根目录。 我的nginx配置…

React快速入门之交互性

响应事件 创建事件处理函数 处理函数名常以handle事件名命名 function handlePlayClick() {alert(Playing);}传递事件处理函数 函数名、匿名两种方式&#xff01; function PlayButton() {function handlePlayClick() {alert(Playing);}return (<Button handleClick{handl…

java虚拟机内存管理

文章目录 概要一、jdk7与jdk8内存结构的差异二、程序计数器三、虚拟机栈3.1 什么是虚拟机栈3.2 什么是栈帧3.3 栈帧的组成 四、本地方法栈五、堆5.1 堆的特点5.2 堆的结构5.3 堆的参数配置 六、方法区6.1 方法区结构6.2 运行时常量池 七、元空间 概要 根据 JVM 规范&#xff0…

探索小红书笔记API:挖掘数据背后的故事

随着数字化时代的到来&#xff0c;数据已经成为企业和个人决策的重要依据。小红书作为一个流行的社交电商平台&#xff0c;积累了大量的用户数据和内容。通过探索小红书笔记API&#xff0c;我们可以深入挖掘这些数据背后的故事&#xff0c;从而更好地理解用户需求和市场趋势。 …

弱电工程计算机网络系统基础知识

我们周围无时无刻不存在一张网&#xff0c;如电话网、电报网、电视网、计算机网络等&#xff1b;即使我们身体内部也存在许许多多的网络系统&#xff0c;如神经系统、消化系统等。最为典型的代表即计算机网络&#xff0c;它是计算机技术与通信技术两个领域的结合。 计算机网络的…

《Spring Cloud学习笔记:微服务保护Sentinel + JMeter快速入门》

Review 解决了服务拆分之后的服务治理问题&#xff1a;Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互&#xff0c;基于网关的过滤器解决了登录校验的问题 流量控制&#xff1a;避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

八股文打卡day12——计算机网络(12)

面试题&#xff1a;HTTPS的工作原理&#xff1f;HTTPS是怎么建立连接的&#xff1f; 我的回答&#xff1a; 1.客户端向服务器发起请求&#xff0c;请求建立连接。 2.服务器收到请求之后&#xff0c;向客户端发送其SSL证书&#xff0c;这个证书包含服务器的公钥和一些其他信息…

LVS那点事

LVS 原理 IPVS LVS 的 IP 负载均衡技术是通过 IPVS 模块来实现的&#xff0c;IPVS 是 LVS 集群系统的核心软件&#xff0c;它的主要作用是&#xff1a;安装在 Director Server 上&#xff0c;同时在 Director Server 上虚拟出一个 IP 地址&#xff0c;用户必须通过这个虚拟的…

k8s的二进制部署: 源码包部署-----node节点部署

服务器IP软件包k8s--master0120.0.0.61kube-aplserver&#xff0c;kube-controer-manager&#xff0c;kube-scheduler&#xff0c;etcdk8s--master0220.0.0.62kube-controer-manager&#xff0c;kube-schedulernode节点0120.0.0.62kubelet&#xff0c;kube-proxy&#xff0c;et…

初识javaWeb

一、JavaWeb是什么&#xff1f; 1、概念 javaWeb指的是使用java语言进行互联网领域项目开发的技术栈——进行web项目开发所需的技术的集合。 -Web前端——在浏览器中用户可以看到的网页 -Web后端——为前端提供数据的程序 2、Web项目 java语言是可以进行多种类型的项目开发&a…

信号处理设计模式

问题 如何编写信号安全的应用程序&#xff1f; Linux 应用程序安全性讨论 场景一&#xff1a;不需要处理信号 应用程序实现单一功能&#xff0c;不需要关注信号 如&#xff1a;数据处理程序&#xff0c;文件加密程序&#xff0c;科学计算程序 场景二&#xff1a;需要处理信…

计算机毕业设计------ssm茶叶溯源系统

项目介绍 茶叶溯源系统&#xff0c;分为前台与后台。普通用户可在前台通过18位的编码查询茶叶的出售历史。 后台分为两种角色&#xff0c;管理员与经销商&#xff1b; 管理员主要功能包括&#xff1a; 主界面&#xff1b; 管理员管理&#xff1a;管理员列表、添加管理员&am…

SparkStreaming_window_sparksql_reids

1.5 window 滚动窗口滑动窗口 window操作就是窗口函数。Spark Streaming提供了滑动窗口操作的支持&#xff0c;从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据&#xff0c;会被聚合起来执行计算操作&#xff0c;然后生成的RDD&#xff0c;会…

设计模式——行为型模式

模板方法模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在类间…

PHP序列化总结3--反序列化的简单利用及案例分析

反序列化中生成对象里面的值&#xff0c;是由反序列化里面的值决定&#xff0c;与原类中预定义的值的值无关&#xff0c;穷反序列化的对象可以使用类中的变量和方法 案例分析 反序列化中的值可以覆盖原类中的值 我们创建一个对象&#xff0c;对象创建的时候触发了construct方…

基于QT开发的温室气体数据记录软件

1、概述 温室气体分析仪数据记录软件用于实现温室气体分析仪数据的获取与存储&#xff0c;阀箱数据的获取与存储、冷阱数据的获取与存储、采样单元数据的获取与存储、阀箱和采样单元的远程操作以及系统功能的管理。其主操作界面如下&#xff1a; 上述软件界面分为2各区域&…

【Linux】内核编译 镜像制作

文章目录 一、Ubuntu内核编译1.1 为什么自己编译内核1.2 Ubuntu 内核源码下载1.21 内核的作用1.22 Linux内核与ubuntu内核1.23 Ubuntu内核源码获取 1.3 在Windows系统下编译ubuntu内核1.4 在Linux系统下编译ubuntu内核 二、镜像制作 一、Ubuntu内核编译 1.1 为什么自己编译内核…

IIS服务器发布PHP网站

IIS服务器&#xff0c;相信开发者都不会陌生&#xff0c;它的英文全称是Internet Information Services&#xff0c;是由微软公司提供的基于运行Microsoft Windows的互联网基本服务&#xff0c;常用于Windows系统的Web项目部署&#xff0c;本篇以PHP项目为例&#xff0c;讲解如…

Qt 中使用 MySQL 数据库保姆级教程(上)

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 在 Qt 中默认只搭载了 QSqlLite 数据库驱动&#xff0c;若要使用其他数据库需要自己下载数据库&#xff0c;并将数据库驱动加载到…

GitOps实践指南:GitOps能为我们带来什么?

Git&#xff0c;作为开发过程中的核心工具&#xff0c;提供了强大的版本控制功能。即便在写代码的时候稍微手抖一下&#xff0c;我们也能通过 Git 的差异对比&#xff08;diff&#xff09;轻松追踪到庞大工程中的问题&#xff0c;确保代码的准确与可靠。这种无与伦比的自省能力…