STM32——SPI通信协议以及软件读写

news2025/1/10 18:26:52

1、SPI协议

SPI相对于I2C传输速度更快;设计简单,通信协议使用硬件线比较多,有些资源浪费

以下设备需要进行共地,如果从机没有独立的供电源,主机需要给供电

SS线低电平有效,主机只能选择一个从机

推挽输出的高低电平均有高驱动能力,(I2C为防止电路短路采用开漏输出模式)

当某个从机未被选中时,它的MISO为高阻态,并不输出有用信息

首先由波特率发生器产生时钟上升下降沿

当主机中的数据是10101010,从机为01010101时,此时产生一个上升沿

此时MOSI通信线上为1,为高电平,MISO线为0,为下降沿,之后迎来一个下降沿时

主从机都会进行数据采样输入,如下所示:

同样的方式,直到第8个时钟之后:

以上是同时发送和接收

只有发送不想接收时,只读从机数据即可;只想接收不想发送,只看主机接收数据即可

之后是SPI时序条件:

上升沿时主机和从机分别移出数据最高位,下降沿时,主机移出的数据移入从机数据的最低位,从机的最高位移入主机数据的最低位。模式1与模式3的CPOL=1,SCK取反

MISO在SS为高电平是一直处于高阻态。以下和上述介绍的一样

除了以上模式外,还有提前半个相位的模式0,此时SCK的动作不一致,它需要在第0个边沿移出数据,然后移入等,相当于SS的下降沿也当为时钟的一部分,(这种模式使用更多)与模式2不同就是CPOL=1,SCL极性取反:

一些指令时序:

写使能指令,厂家定义0X06是写使能,由主机发送从机接收

高组态时没有规定为什么电平,因此这里设置为高电平

相当于主机发送0X06,从机发送0XFF(因为发送接收同时发生,如果是只发送,不管从机发送来的数据即可)

第二条指令:

首先发送写指令0X02

指定位置为24位,需要分成3个字节来构成,写指令之后的字节定义为地址高位,因此

0X12就是指定地址的23~16位

继续发送剩余字节 0X34、0X56,最终构成指定地址0X123456:

之后发送数据0X55:

以上表示在0X123456的地址写入0X55数据。

之后是:

先是读指令0X03

之后是地址与上边一样,之后读取数据,此次在MISO线上读取数据:

2、W25Q64芯片

数据掉电不丢失

Dual SPI表示厂商为不浪费资源,让MISO和MOSI同时收发数据相当于80MHz成为160MHz,可传输2位。实际上还是80MHz.

24位地址最大存储16M字节

上面有一杠表示低电平有效

之后是Flash一些操作事项:

掉电不丢失、容量大、成本低

在擦除后Flash显示为0XFF,此时为没有数据(擦除也算忙状态)

擦除时最小是一个扇区擦除(页>块>扇区)

之后是软件编程实现读写功能:

其中SPI需要完成封装、通信引脚初始化、起始、终止、交换字节

W25Q64需要完成写使能、擦除、页编程、读数据等

首先编写SPI协议代码:

对引脚进行初始化,输出(相对于主机)配置为推挽输出,输入(相对于主机)配置为上拉模式

因此主机有3条输出线,一条输入线

此时SS为高电平(无选择从机),SCL为低电平

之后为配置电平方便,将以上程序进行封装:

对SS进行写封装

SCL写封装

MOSI写封装

MISO读封装

之后是3个时序单元

起始条件:SS置低电平(由于引脚初始化时SS为高电平,这里可以直接置为低电平,不需要先置高电平再低电平)

终止条件:SS置高电平

交换一个字节:

对于硬件来说,由于存在移位寄存器,所以时钟的上升或者下降沿时,数据的移入或移出是同时发生的;

但是对于软件来说,程序是一条条执行,存在先后顺序,因此是时钟上升沿——移入数据,时钟下降沿——移出数据

通过掩码的方式取出数据指定一位

模式0就是相当于在第0个SCL电平变化时移出数据,第一个上升沿移入,第二个下降沿。

移出数据——上升沿——移入数据——下降沿

之后是W25Q64的代码:

主要分为初始化(调用MySPI初始化)、读ID号、写数据、是否忙状态、页编程、擦除、读数据

初始化:

1、读ID号:分为8位厂商ID和16位设备ID(高8位是寄存器类型,低8位是容量)

首先发送读ID的指令,不要接收的信息,没用;之后发送无意义信息为了接收到ID信息

第一次DID直接接收8位信息,第二次需要写成或等于防止高8位被覆盖。 

2、写使能

3、是否忙状态

4、页编程(输入为写入地址、数据、写入的数量)

起始条件——发送指令码02——发送3个字节地址(高8位,中间8位,低8位,Swap只接受8位数据)——发送数据组(最大发256个字节,超过将会覆盖从第一个开始)——停止条件——等待忙状态

5、擦除(输入一个地址)

一共有4种擦除,以扇区擦除为例:

起始——发送指令20——发送3个字节地址——停止——等待忙

6、读使能

起始——发送读取数据指令——3个字节地址——发送无用信息接收有用信息——停止

由于注意事项中写入之前要有写指令,因此在页编程和擦除前先加一个写使能!!!以及最后加一个是否忙状态(对应写入状态结束后,芯片进入忙状态),事后等待。

之后是实验结果:

1、输入01、02、03、04

2、只擦除不写入

此时读的数据就是擦除之后的结果,全为1,FF

3、验证只能1写0,不能0写1

先写入AA、BB、CC、DD(此时擦除开启)

之后关闭擦除功能,并写入55、66、77、88

可以看出写入的数据改变,读取的数据因为没有擦除功能后,只能1写0,不能0写1,因此读出的状态就由一开始的AA:10101010,到55:01010101,没有擦除就变成了00000000,即显示的结果。相当于读取的数据=写入的数据&原始数据(按位与)

4、写入不能跨页,读取可以跨页

之前知道页地址是从xxxx00到xxxxFF,因此将读、写地址直接改到FF时观察写入的数据能否到下一页写

此时写入01、02、03、04,读出来是01、FF、FF、FF

表明写入的01在地址FF,02由于不能跨页,因此又返回该页页首00;

不过读取可以跨页,剩余FF是第二页的数据,由于被擦除,所以都是FF

之后修改读取地址,从00开始读,写依然在FF开始写,可以看出此时06、07、08均在该页地址的00、01、02处,由于地址03为写入因此读取结果为FF

页编程的写入如下所示:写不能跨页!!!

之后学习SPI的硬件外设读写功能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring + Boot + Cloud + JDK8 + Elasticsearch 单节点 模式下实现全文检索高亮-分页显示 快速入门案例

1. 安装elasticsearchik分词器插件 sudo wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.13.4.zip sudo mkdir -p ./es_plugins/analysis-ik sudo mkdir ./es_data sudo unzip elasticsearch-analysis-ik-8.13.4.zip -d ./es_plugins/a…

SpringCloudAlibaba Seata分布式事务

分布式事务 事务是数据库的概念,数据库事务(ACID:原子性、一致性、隔离性和持久性); 分布式事务的产生,是由于数据库的拆分和分布式架构(微服务)带来的,在常规情况下,我们在一个进…

自己动手写CPU_step4_逻辑运算|移位指令

序 上一篇中我们解决了流水线的数据相关问题,本篇将添加多条逻辑运算和移位运算指令,这些指令的格式严格按照MIPS的指令格式设计。 MIPS指令格式 由于本人也是处于学习的一个过程,如有不对之处,还请大牛指正。 就逻辑运算和移位运…

【软件逆向】第11课,软件逆向安全工程师之windows API函数,每天5分钟学习逆向吧!

资料获取 关注作者,备注课程编号,获取本课配套课件和工具程序。 干货开始-windows API函数。 微软官方提供的应用程序接口,是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件提供的能力。 地址:h…

java基础 之 了解final

文章目录 定义使用及规则修饰类修饰方法修饰变量修饰成员变量修饰局部变量final与static共同修饰变量final修饰的变量和普通变量的区别 本篇文章代码就不附上了,建议大家实际敲一敲,更能加快理解 定义 final表示”最后的,最终的“含义&#…

精益思维赋能机器人行业的三大维度

在日新月异的科技浪潮中,机器人行业正以前所未有的速度蓬勃发展,成为推动产业升级与转型的关键力量。然而,如何在激烈的市场竞争中脱颖而出,实现高效、灵活与可持续的发展?精益思维,这一源自制造业的管理哲…

【el-switch更改高、宽、颜色样式】深入浅出element ui的switch同页面存在多个更改样式互不影响

1.技术: “vue”: “^2.6.14”, “element-ui”: “^2.15.6”, 2.需求: 同一个页面存在多个switch组件时, 需要更改各自的高度、宽度、选择颜色、非选中颜色等样式, 并且样式隔离互不影响! 3.效果图: 4.重要…

C++动态规划(背包问题)

目录 一:动态规划是什么 二.动态规划的运用 (1).用动态规划解决重复子问题 (2).动态规划使用的条件与流程 Ⅰ.动态规划的使用条件: Ⅱ.动态规划的使用流程 (3).背包问题 三.…

IO进程(学习)2024.8.22

信号 信号函数 信号处理函数 #include <signal.h> sighandler_t signal(int signum, sighandler_t handler); 功能&#xff1a;信号处理函数 参数&#xff1a;signum&#xff1a;要处理的信号 handler&#xff1a;信号处理方式 SIG…

基于矢量控制器的PMSM永磁同步电机速度控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于矢量控制器的PMSM永磁同步电机速度控制系统simulink建模与仿真&#xff0c;仿真输出电机转速跟踪曲线&#xff0c;PID控制器输出曲线以及Te输出曲线。 2.系统仿真结果 &…

kafka的一个有趣问题(BUG)

这是我的第104篇原创文章 问题由来 在使用kafka时&#xff0c;创建topic&#xff0c;对某个topic进行扩分区的操作&#xff0c;想必大家肯定都使用过。尤其是集群进行扩容时&#xff0c;对流量较大的topic进行扩分区操作。一般而言&#xff0c;期望的效果是&#xff1a;新扩的分…

AI在医学领域:HYDEN一种针对医学图像和报告的跨模态表示学习方法

近年来&#xff0c;跨模态文本-图像表示学习在诸多领域取得了显著的突破&#xff0c;尤其是在零样本学习和图像-文本检索等任务上。这一成果的取得很大程度上归功于大量弱监督的图像-文本配对数据的利用&#xff0c;这些数据有效地增强了视觉-语言表示学习的能力。在医学成像领…

如何保证每次生成的都同一张人脸?AI绘画Stable Diffusion的Reference only插件人物一致性教程

Ai绘画有一个很现实的问题&#xff0c;要保证每次画出的都是同一个人物的话&#xff0c;很费劲。 Midjourney就不必说了&#xff0c;人物的高度一致性一直得不到很好的解决。而在Stable Diffusion&#xff08;SD&#xff09;中&#xff0c;常用办法是通过同一个Seed值&#xf…

Linux宝塔面板使用教程 - Centos/Alibaba Cloud Linux,解放命令实现可视化

使用前注意事项&#xff1a;为了您的正常使用&#xff0c;请确保使用全新或纯净的系统安装宝塔面板&#xff0c;不支持已部署项目/环境的系统安装 1.安装命令 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &&…

Godot《躲避小兵》实战之创建游戏主场景

游戏主场景 现在是时候将我们所做的一切整合到一个可玩的游戏场景中了。 创建新场景并添加一个 Node节点&#xff0c;命名为 Main。&#xff08;我们之所以使用 Node 而不是 Node2D&#xff0c;是因为这个节点会作为处理游戏逻辑的容器使用。本身是不需要 2D 功能的。&#x…

ZooKeeper 的3种部署模式

ZooKeeper 的3种部署模式 1. 单机模式&#xff08;Standalone Mode&#xff09;2. 伪集群模式&#xff08;Pseudo-Cluster Mode&#xff09;3. 集群模式&#xff08;Cluster Mode&#xff09; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496;…

[000-01-011].第2节:持久层方案的对比

我的后端学习大纲 MyBatis学习大纲 1.持久层解决方案&#xff1a; 1.1.面试1&#xff1a;请说一说持久层解决方案有哪些&#xff1f;&#xff1f;&#xff1f; 1.jdbc JDBC为访问不同的数据库提供了一种统一的途径&#xff0c;为开发者屏蔽了一些细节问题。Java程序员使用JDB…

Vodafone 推出了与 Wi-Fi 竞争的基于树莓派私人5G技术

随着全球5G网络的逐步推出&#xff0c;在其过程中遇到了可预见的起起伏伏&#xff0c;并且蜂窝技术也开始进入另一个无线技术 Wi-Fi &#xff0c;并且已经占据的市场。私有5G网络&#xff08;即个人或公司建立自己的全设施蜂窝网络&#xff09;如今正在寻找曾经属于Wi-Fi的唯一…

Unity低延迟播放RTSP视频流

Unity播放RTSP视频流这个功能在好几个项目中用到&#xff0c;虽然有一些现成的插件&#xff08;VLC for unity、UMP&#xff09;可以使用&#xff0c;但是延迟高&#xff08;300毫秒以上&#xff09;的问题一直没法解决。 最近终于下定决心来解决这个问题&#xff0c;经过几天…

基于 Jenkins、Gitlab、Harbor、Helm 和 Kubernetes 的 CI/CD

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…