【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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

N 皇后 II[困难]

一、题目 n皇后问题 研究的是如何将n个皇后放置在n n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回n皇后问题 不同的解决方案的数量。 示例 1: 输入:n 4 输出:2 解释:如上图所示&#…

Rust学习笔记005:结构体 struct

在 Rust 中,struct 是一种用于创建自定义数据类型的关键字,它允许你定义和组织数据的结构。struct 可以包含多个不同类型的字段(fields),每个字段都有一个名称和一个类型。 定义结构体 下面是一个简单的例子&#xff…

基于JAVA的酒店管理系统设计

摘 要 我们对酒店进行调研,发现部分酒店依托第三方平台,但第三方平台没有办法更好帮助酒店管理,故我们决定帮助酒店开发一套基于 Java 的酒店管理系统。使用基于Java的酒店管理系统可以帮助酒店完成顾客入住信息的管理,酒店物资的…

构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

作者:柳下 概述 随着企业规模和数据量的增长,数据的价值越来越受到重视。数据的变化和更新变得更加频繁和复杂,因此及时捕获和处理这些变化变得至关重要。为了满足这一需求,数据库 CDC(Change Data Capture&#xff…

2022年全球运维大会(GOPS上海站)-核心PPT资料下载

一、峰会简介 GOPS 主要面向运维行业的中高端技术人员,包括运维、开发、测试、架构师等群体。目的在于帮助IT技术从业者系统学习了解相关知识体系,让创新技术推动社会进步。您将会看到国内外知名企业的相关技术案例,也能与国内顶尖的技术专家…

【大数据面试知识点】Spark中的累加器

Spark累加器 累加器用来把Executor端变量信息聚合到Driver端,在driver程序中定义的变量,在Executor端的每个task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回driver端进行merge。 累加器一般是放在行动算子…

解决相机库CameraView多滤镜拍照错乱的BUG (一) : 复现BUG

1. 前言 这段时间,在使用 natario1/CameraView 来实现带滤镜的预览、拍照、录像功能。 由于CameraView封装的比较到位,在项目前期,的确为我们节省了不少时间。 但随着项目持续深入,对于CameraView的使用进入深水区,逐…

lambda表达式和包装器

正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 我们在使用库里的排序算法时如果排序的是自定义类型或者库里默认的排序不能满足我们则需求&…

【单片机项目实战】温度控制系统

本项目的主要作用是实现温度调控,通过设定一个预定的温度值,实现实时检测外界温度,当外界温度小于预定值时,电机正转,实现降温效果;当外界温度大于预定值时,电机反转,实现升温效果&a…

网络安全—PKI公钥基础设施

文章目录 前提知识散列函数非对称加密数字签名 PKI受信任的人RA注册CA颁发IKE数字签名认证(交换证书)密钥管理 前提知识 散列函数 散列也可以叫哈希函数,MD5、SHA-1、SHA-2、、(不管叫啥,都记得是同一个东西就行&…

分库分表之Mycat应用学习五

5 Mycat 离线扩缩容 当我们规划了数据分片,而数据已经超过了单个节点的存储上线,或者需要下线节 点的时候,就需要对数据重新分片。 5.1 Mycat 自带的工具 5.1.1 准备工作 1、mycat 所在环境安装 mysql 客户端程序。 2、mycat 的 lib 目录…

mac上使用Navicat Premium 在本地和生产环境中保持数据库同步

Navicat Premium 是一款功能强大的数据库管理和开发工具,支持多种数据库系统,如 MySQL、Oracle、SQL Server 等。作为程序员,我深知在开发过程中需要一款方便、高效的数据库管理工具来提升工作效率。而 Navicat Premium 正是这样一款不可多得…

Spring5注解驱动(六)

5. 自动装配 5.1. Autowired&Qualifier&Primary 在原来,我们就是使用Autowired的这个注解来进行自动装配; 现在有一个BookController 类 package com.hutu.controller;import com.hutu.service.BookService; import org.springframework.bea…

2023最新租号平台系统源码支持单独租用或合租使用

这是一款租号平台源码,采用常见的租号模式。目前网络上还很少见到此类类型的源码。 平台的主要功能如下: 支持单独租用或采用合租模式; 采用易支付通用接口进行支付; 添加邀请返利功能,以便站长更好地推广&#xf…

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蚁狮算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蚁狮优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

逻辑卷学习后续----------缩容

一、缩容:缩减大小 ext4可以 , xfs无法缩减,缩减会影响业务 1.解挂载 2.检查文件系统完整性 3.缩减文件系统 4.缩减逻辑卷上下一致 5.再挂载回去 添加磁盘 文件系统只能装ext4 缩减文件系统 resize2fs 挂载失败需要重新安装文件系统…

磁盘阵列(RAID)

1.独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks) 旧称廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),简称磁盘阵列 用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵…

[C#]使用ONNXRuntime部署一种用于边缘检测的轻量级密集卷积神经网络LDC

源码地址: github.com/xavysp/LDC LDC: Lightweight Dense CNN for Edge Detection算法介绍: 由于深度学习方法的快速发展,近年来,用于执行图像边缘检测的卷积神经网络(CNN)模型爆炸性地传播。但边缘检测…

Selenium教程04:鼠标+键盘网页的模拟操作

在webdriver 中,鼠标操作都封装在ActionChains类中,使用的时候需要导入这个包。 from selenium.webdriver import ActionChainsActionChains方法列表如下: click(on_elementNone) ——单击鼠标左键click_and_hold(on_elementNone) ——点击…

开始使用MEVN技术栈开发02 MongoDB介绍

开始使用MEVN技术栈开发02 MongoDB介绍 MongoDB介绍 As indicated by the ‘ M ’ in MEVN, we will use MongoDB as the backend database for our app. MongoDB is a NoSQL database. Before we talk about what is a NoSQL database, let ’ s first talk about relationa…