stm32 模拟spi
目录
简介
spi物理层
连接方式
框图
协议层:
数据处理
传输模式
模式0
起始和停止信号
发送和接收数据
模式1
模式2
模式3
总结
简介
spi物理层
SPI( Serial Peripheral Interface, 串行外设接口)是一种全双工同步串行通信接口,它用于MCU与各种外围设备以串行方式进行通信以交换信息,通信速度最高可达25MHz以上。SPI 总线具有三种传输方式:全双工、单工以及半双工传输方式。
SPI通常由四条线组成,一条主设备输出与从设备输入( Master Output Slave Input, MOSI),一条主设备输入与从设备输出( Master Input Slave Output, MISO),一条时钟信号( Serial Clock, SCLK),一条从设备使能选择( Chip Select, CS)。与I²C类似,也可以使用GPIO模拟SPI时序
SPI可以同时发出和接收数据,因此SPI的理论传输速度比I²C更快。 SPI通过片选引脚选择从机,一个片选一个从机,因此在多从机结构中,需要占用较多引脚,而I²C通过设备地址选择从机,只要设备地址不冲突,始终只需要两个引脚
连接方式
CS片选线:从设备选择信号线,常称为片选信号线,也称为 NSS、 SS,无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。当主机要选择从设备时,把该从设备的 CS信号线设置为低电平,该从设备即被选中,即片选有效,为开始信号;被拉高作为结束信号
SCK :时钟信号线,用于通讯数据同步,两个设备之间通讯,速率受限于低速设备
MOSI:主设备输出/从设备输入引脚,即这条线上数据的方向为主机到从机
MISO:主设备输入/从设备输出引脚,即在这条线上数据的方向为从机到主机
框图
①STM32F10x芯片有3个 SPI 外设,SPI1 是 APB2 上的设备,最高通信速率达 36Mbtis/s, SPI2、 SPI3 是 APB1 上的设备,最高通信速率为 18Mbits/s,除了通讯速率,在其它功能上没有差异。因为SPI3 用到了下载接口的引脚,这几个引脚默认功能是下载,第二功能才是 IO 口,如果想使用 SPI3 接口,则程序上必须先禁用掉这几个 IO 口的下载功能。
②波特率发生器根据“控制寄存器 CR1”中的 BR[0:2] 位控制,对 fpclk 的分频结果就是 SCK 引脚的输出时钟频率
配置“控制寄存器 CR”的“CPOL 位”及“CPHA”位可以把 SPI 设置成的 4 种 SPI模式,后续在协议层分析
③通过写 SPI 的“数据寄存器 DR”把数据填充到发送缓冲区中,通讯读“数据寄存器 DR”,可以获取接收缓冲区中的内容。其中数据帧长度可以通过“控制寄存器 CR1”的“DFF 位”配置成 8 位及 16 位模式;配置“LSBFIRST 位”可选择 MSB (高位)先行还是 LSB(低位) 先行
④:负责协调整个 SPI 外设,工作模式根据配置的“控制寄存器(CR1/CR2)”的参数而改变,控制参数包括前面提到的 SPI 模式、波特率、 LSB 先行、主从模式、单双向模式等等;在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,我们只要读取状态寄存器相关的寄存器位,就可以了解 SPI 的工作状态了。
一般不使用 STM32 SPI 外设的标准 NSS 信号线,而是更简单地使用普通的GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。也就是用模拟方式拉低拉高片选信号
协议层:
数据处理
在SCK时钟周期的驱动下, MOSI和MISO同时进行,数据输入输出是同时进行的
主机和从机都有一个移位寄存器,主机移位寄存器数据经过MOSI将数据写入从机的移位寄存器,此时从机移位寄存器的数据也通过MISO传给了主机,实现了两个移位寄存器的数据交换,外设的写操作和读操作是同步完成的。无论主机还是从机,发送和接收都是同时进行的,如同一个“环”
如果主机只对从机进行写操作,主机只需忽略接收的从机数据即可。如果主机要读取从机数据,需要主机发送一个空数据来引发从机发送数据。
传输模式
CPOL( Clock Polarity,时钟极性) 表示SCK在空闲时为高电平还是低电平。 当CPOL=0, SCK空闲时为低电平, 当CPOL=1, SCK空闲时为高电平。
CPHA( Clock Phase,时钟相位) 表示SCK在第几个时钟边缘采样数据。 当CPHA=0, 在SCK第一个边沿采样数据,当CPHA=1, 在SCK第二个边沿采样数据
实际中采用较多的是“模式 0”与“模式 3”
模式0
CPOL=0&&CPHA=0 的时序如下图,可以看到串行时钟的奇数边沿上升沿采样:
CPOL=0:看到对应时序中当数据未发送或者发送完毕, SCL 的状态是低电平;
CPHA=0:即是奇数边沿(第一个边沿)采集,可以看到传输的数据会在奇数边沿上升沿被采集;
MOSI和 MISO :数据的有效信号需要在 SCK 奇数边沿保持稳定且被采样,在非采样时刻(下降沿), MOSI 和MISO 的有效信号才发生变化

起始和停止信号
NSS 信号线由高变低,是 SPI 通讯的起始信号。 NSS 是每个从机各自独占的信号线,当从机在自己的 NSS 线检测到起始信号后,就知自己被主机选中了,开始准备与主机通讯。
void spi_start(void)
{/*片选线高电平拉低*/ctrl_cs(0);
}
NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消
void spi_stop(void)
{/*片选线低电平拉高*/ctrl_cs(1);
}
发送和接收数据
/*数据交换(收发)*/
uint8_t spi_swap_byte(uint8_t byte_send)
{uint8_t i,byte_receive = 0x00;for(i=0;i<8;i++){/*开始sck默认低电平,现在就可以交换数据*/ctrl_mosi(byte_send & (0x80 >> i));/*通过控制对应的GPIO进行高位先发*/ctrl_sck(1);/*控制对应的GPIO拉高sck读取数据*/if(1 == read_miso())/*读取对应的GPIO接收数据*/{byte_receive |= (0x80 >> i);}ctrl_sck(0);/*拉低时钟结束*/}return byte_receive;/*交换得到的数据*/
}
模式1
CPOL=0&CPHA=1 的时序如下图,串行时钟的偶数边沿下降沿采样:
CPOL=0:所以 SCL 的空闲状态依然是低电平
CPHA=1: 数据就从偶数边沿(第二个边沿)采样,下降沿

模式2
CPOL=1&&CPHA=0 的时序如下图
CPOL=1:SCL 空闲状态为高电平
CPHA=0:奇数边沿采样的情况下,数据在奇数边沿下降沿要保持稳定并等待采样

模式3
CPOL=1&&CPHA=1 的时序如下图
CPOL=1:SCL状态是高电平,奇数边沿的边沿极性是上升沿,偶数边沿的边沿极性是下降沿
CPHA=1:数据在偶数边沿上升沿被采样。在奇数边沿的时候 MOSI 和 MISO 会发生变化,在偶数边沿时候是稳定的。
总结
先看CPHA,时钟相位为0,第一个(奇)边沿采样;为1,第二个(偶)边沿采样;再看CPOL,时钟极性为0,说明空闲的时候是低电平,低电平第一个采样信号肯定是拉高,由此判断是上升沿还是下降沿采样;同理时钟极性为1,说明空闲的时候是高电平,高电平第一个采样信号肯定是拉低,由此判断是上升沿还是下降沿采样
相关文章:

stm32 模拟spi
目录 简介 spi物理层 连接方式 框图 协议层: 数据处理 传输模式 模式0 起始和停止信号 发送和接收数据 模式1 模式2 模式3 总结 简介 spi物理层 SPI( Serial Peripheral Interface, 串行外设接口)是一种全双工同步…...

小程序https证书
小程序通常需要与服务器进行数据交换,包括用户登录信息、个人资料、支付信息等敏感数据。如果不使用HTTPS,这些数据将以明文的方式在网络上传输,容易被恶意攻击者截获和窃取。HTTPS通过数据加密来解决这个问题,确保数据在传输过程…...

《python深度学习》笔记(二十):神经网络的解释方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM
原理优点缺点GAP将多维特征映射降维为一个固定长度的特征向量①减少了模型的参数量;②保留更多的空间位置信息;③可并行计算,计算效率高;④具有一定程度的不变性①可能导致信息的损失;②忽略不同尺度的空间信息CAM利用…...

Python中文件copy模块shutil
高级的 文件、文件夹、压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 import shutil shutil.copyfileobj(open(old.xml,r), open(new.xml, w)) shutil.copyfile(src, dst)拷贝文件 shutil.copyfile(f1.log, f2.log) #目标文件无需…...

机器学习快速入门教程 Scikit-Learn实现
机器学习是什么? 机器学习是一帮计算机科学家想让计算机像人一样思考所研发出来的计算机理论。他们曾经说过,人和计算机其实本没有差别,同样都是一大批互相连接的信息传递和存储元素所组成的系统。所以有了这样的想法,加上他们得天独厚的数学功底,机器学习的前身也就孕育而生…...

【向生活低头】win7打印机共享给win11使用,win11无法连接问题的解决
打印机是跟win7的电脑连接的,然后试了很多方法,win11都没法添加该打印机去使用。 网上的方法乱七八糟啥都有,但试了以后,发现基本没什么用。 刚刚发现知乎上的一个回答是有用的,这里做记录以备后用。 1.打开控制面板的…...

HarmonyOS鸿蒙原生应用开发设计- 元服务(原子化服务)图标
HarmonyOS设计文档中,为大家提供了独特的元服务图标,开发者可以根据需要直接引用。 开发者直接使用官方提供的元服务图标内容,既可以符合HarmonyOS原生应用的开发上架运营规范,又可以防止使用别人的元服务图标侵权意外情况等&…...

rhcsa-vim
命令行的三种模式 将ets下的passwd文件复制到普通用户下面 编辑模式的快捷方式 a--光标后插入 A--行尾插入 o--光标所在上一行插入 O--光标所在上一行插入 i--光标前插入 I--行首插入 s--删除光标所在位然后进行插入模式 S--删除光标所在行然后进行插入 命令模式的快捷…...

Rocky9 上安装 redis-dump 和redis-load 命令
一、安装依赖环境 1、依赖包 dnf -y install perl gcc gcc-c zlib-devel2、编译openssl 1.X ### 下载编译 wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz tar xf openssl-1.1.1t.tar.gz cd openssl-1.1.1t ./config --prefix/usr/local/openssl make make ins…...

Azure机器学习 - 使用与Azure集成的Visual Studio Code实战教程
本文介绍如何启动远程连接到 Azure 机器学习计算实例的 Visual Studio Code。 借助 Azure 机器学习资源的强大功能,使用 VS Code 作为集成开发环境 (IDE)。 在VS Code中将计算实例设置为远程 Jupyter Notebook 服务器。 关注TechLead,分享AI全维度知识。…...

内网渗透-域信息收集
域环境 虚拟机应用:vmware17 域控主机:win2008 2r 域成员主机:win2008 2r win7 一.域用户和本地用户区别 使用本地用户安装程序时,可以直接安装 使用域用户安装程序时,需要输入域控管理员的账号密码才能安装。总结…...

三国志14信息查询小程序(历史武将信息一览)制作更新过程02-基本架构
0,前期准备 (1)一台有公网IP的云服务器,服务器上安装MySQL数据库,启用IIS服务。出入端口号配置运行(服务器和平台都要配置),IIS服务器上安装SSL证书 (2)域名…...

【51单片机】LED与独立按键(学习笔记)
一、点亮一个LED 1、LED介绍 LED:发光二极管 补:电阻读数 102 > 10 00 1k 473 > 47 000 2、Keil的使用 1、新建工程:Project > New Project Ctrl Shift N :新建文件夹 2、选型号:Atmel-AT89C52 3、xxx…...

package.json(2)
发布配置 和npm 项目包发布相关的配置。 private private 字段可以防止我们意外地将私有库发布到 npm 服务器。只需要将该字段设置为 true: "private": true preferGlobal preferGlobal 字段表示当用户不把该模块安装为全局模块时,如果设…...

Docker(2)——Docker镜像的基本命令
目录 一、简介 二、基本命令 1. Docker命令官方文档 2. 展示镜像 3. 搜索镜像 4. 下载镜像 5. 删除镜像 一、简介 本篇文章是Docker专栏的第二章,主要用于介绍Docker镜像的一些基本命令 二、基本命令 1. Docker命令官方文档 本篇博客仅记录常用的Docker镜…...

IT技术发展背景下的就业趋势:哪个领域最受欢迎?
IT技术发展背景下的就业趋势:哪个领域最受欢迎? 随着科技的不断进步和互联网的普及,IT行业正以惊人的速度蓬勃发展。在这个数字化时代,IT技术已经渗透到各个行业和领域中,为人们带来了巨大的便利和机遇。那么…...

日本移动支付Merpay QA团队的自动化现状
Merpay是日本最大的网购平台之一Mercari的无现金支付系统。Merpay 的主要功能是让用户在 Mercari的网站上购物,也可以在日本的许多实体店和餐厅使用它,也可以理解为日本的“支付宝”。以下为Merpay QA 团队在自动化方面的一些思考: 这几年&am…...

EasyExcel复杂表头数据导入
目录 表头示例导入代码数据导出 表头示例 导入代码 Overridepublic void importExcel(InputStream inputStream) {ItemExcelListener itemExcelListener new ItemExcelListener();EasyExcel.read(inputStream, ImportItem.class, itemExcelListener).headRowNumber(2).sheet()…...

【Redis】Redis安装教程基本操作语法
【Redis】Redis安装教程&基本操作语法 一、Redis简介1.1.什么是Redis1.2.Redis与传统数据库的区别主要 二、Linux安装Redis2.1.安装Redis2.2.解压安装包2.3.解压后执行安装gcc2.4.编译Redis2.5.修改Redis为守护进程2.6.启动Redis服务2.7.配置密码且外部连接2.8.重启服务器2…...

spring-boot-autoconfigure.jar/META-INF/spring.factories介绍
spring-boot-autoconfigure.jar/META-INF/spring.factories是Spring Boot自动配置的核心文件,它包含了各种自动配置类的注册信息。这个文件是Spring Boot根据应用程序的依赖关系和配置文件中的条件注解,自动加载和配置所需的Bean的依据。 在spring.fact…...

vue3视频大小适配浏览器窗口大小
目标:按浏览器窗口的大小,平铺视频,来适配屏幕的大小。 考虑使用 DPlayer.js、video.js、vue-video-player等视频插件,但报了各种各样的错;试过使用 js 对视频进行同比例放大,再判断其与窗口的大小取最小值…...

Nignx安装负载均衡动静分离以及Linux前端项目部署将域名映射到特定IP地址
目录 一、nginx简介 1.1 定义 1.2 背景 1.3 作用 二、nginx搭载负载均衡提供前后分离后台接口数据 2.1 nginx安装 2.1.1 下载依赖 2.1.2 下载并解压安装包 2.1.3 安装nginx 2.1.4 启动nginx服务 2.2 tomcat负载均衡 2.2.1 负载均衡所需服务器准备 2.2.2 配置修改 …...

Plist编辑软件 PlistEdit Pro mac中文版功能介绍
PlistEdit Pro mac是一款功能强大的Plist文件编辑软件。Plist文件是苹果公司开发的一种XML文件格式,用于存储应用程序的配置信息和数据。PlistEdit Pro可以帮助用户轻松地编辑和管理Plist文件。 PlistEdit Pro具有直观的用户界面和丰富的功能。用户可以使用该软件打…...

CSS3网页布局基础
CSS布局始于第2个版本,CSS 2.1把布局分为3种模型:常规流、浮动、绝对定位。CSS 3推出更多布局方案:多列布局、弹性盒、模板层、网格定位、网格层、浮动盒等。本章重点介绍CSS 2.1标准的3种布局模型,它们获得所有浏览器的全面、一致…...

【npm run dev 报错:error:0308010C:digital envelope routines::unsupported】
问题原因: nodejs版本太高(nodejs v17版本发布了openSSL3.0对短发和密钥大小增加了更为严格的限制,nodejs v17之前版本没有影响,但之后的版本会出现这个错误,物品的node版本是20.9.0) 解决方式࿱…...

天猫商品评论API接口(评论内容|日期|买家昵称|追评内容|评论图片|评论视频..)
要获取天猫商品评论接口,您需要使用天猫开放平台提供的API接口。以下是一些可能有用的步骤: 注册并登录天猫开放平台,获取开发者账号。在开发者中心创建一个应用,获取应用的App Key和App Secret。使用天猫开放平台的API接口&…...

redis数据库简介
Redis是什么 Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性: 基于内存运行,性能高效支持分布式,理…...

数据结构 - ArrayList - 动态修改的数组
目录 实现一个通用的顺序表 总结 包装类 装箱 / 装包 和 拆箱 / 拆包 ArrayList 与 顺序表 ArrayList基础功能演示 add 和 addAll ,添加元素功能 ArrayList的扩容机制 来看一下,下面的代码是否存在缺陷 模拟实现 ArrayList add 功能 add ind…...

python爬虫实战——今日头条新闻数据获取
大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 第三方库: requests >>> pip install requests 第三方模块安装: win R 输入cmd 输入安装命令 pip install 模块名 (如果你觉得安装速度比较慢, 你…...