STM32--SPI通信与W25Q64(2)
STM32–SPI通信与W25Q64(1)
文章目录
- SPI外设
- 特征
- SPI框图
- 传输模式
- 主模式全双工连续传输
- 非连续传输
- 硬件SPI读写W25Q64
SPI外设
STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担。
特征
3线全双工同步传输 |
8或16位传输帧格式选择 |
主或从操作 |
支持多主模式 |
8个主模式波特率预分频系数(最大为fPCLK/2) |
主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变 |
可编程的数据顺序, MSB在前或LSB在前 |
可编程的时钟极性和相位 |
SPI总线忙状态标志 |
兼容I2S协议 |
STM32F103C8T6 硬件SPI资源:SPI1、SPI2
SPI框图
通过主控制电路来控制数据的传输;
先看左上角部分,对于接收的数据,会从MISO引脚进入;数据一位一位的进入移位寄存器,当有一个字节(或者两个字节大小)的数据在移位寄存器时,传送移位寄存器里的数据到接收缓冲器,并且RXNE标志被置位;
这里的RXNE是是接收缓冲区的标志位,
读SPI_DR接收寄存器可以清除RNXE标志位;
在连续传输数据中,一个要接收的数据只有被读出,下一个数据才有机会进入接收缓冲器。而利用RNXE标志位即可知道当前数据是否被读出。否则,下一个数据会对当前数据进行覆盖,那么读取数据就会造成错误。
对于要发送的数据,会将写入数据先放在发送缓冲器中,在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到MOSI脚上;(可自行设定低位先行还是高位先行); 数据从发送缓冲器传输到移位寄存器时TXE标志将被置位。
发送到移位寄存器的标志位
只要写入SPI_DR寄存器那么TXE标志位就会被清除。这里将移位寄存器和接收缓冲区和发送缓冲区合在一起,就是数据寄存器;
这里要注意,数据寄存器内部会分为两部分,接收和发送,移位寄存器是共用的,但传输单位最小是8bit或者是16bit,都是以字节为单位的,不会造成同时进行发送和接收的冲突;
右边则是将寄存器的位都标出来了,CR是控制寄存器,只要是产生使能的寄存器;SR是状态寄存器,比较重要的就是刚才介绍的两个RXNE和TXE;
波特率发生器用来控制SCK分频;
传输模式
主模式全双工连续传输
同时进行传输的
一开始,会先写入一个数据1,接着会使标志位TXE置非空,等到TXE位空时,再写入一个数据2,此时会等待RXNE非空时,读取数据A1,接着就是等到TXE为空,再写入一个数据3,然后又是等待RXNE非空时,读取数据A2…以此传输下去,到最后,RXNE非空,读取数据AN,TXE也为空时,BSY位置0,关闭SPI模块;
这里的连续传输就是在一开始一个数据写入之后,还会继续写入一个数据,由于是同时进行传输,所以等到读取数据后又写入一个数据;
在最后会连续读取两个数据表示结束。
非连续传输
一开始写入一个数据1,接着会等待TXE为空时,此时读取一个数据A1,接着会等待RXNE非空时,再写入数据2,以此类推。
对于写入的数据,等待TXE为空后,本来可以再写入一个数据,但是在这种模式是读取一个数据,等到RXNE非空时,再写入数据;
你会发现,在标志位后本来是做出对应的事件,但是这种方式却是选择等待,也就是传输的数据是不连续的。
硬件SPI读写W25Q64
这里的接线方式和试验方法和软件读写是一致的,只是将MySPI.进行改装。
#include "stm32f10x.h" // Device header//片选电平
void MySPI_W_SS(uint8_t Byte)
{GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)Byte);
}//初始化
void MySPI_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);SPI_InitTypeDef SPI_InitStructure;SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_128; //设置SCK时钟波特率分频值SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//指定哪个边沿开始捕获SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //低边沿为常态SPI_InitStructure.SPI_CRCPolynomial=7; //CRC设置值,默认值为7SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//传输数据大小(bit)SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置双工和收发SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;//指定传输从低位还是高位开始SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//主从模式SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//软件设置SPI_Init(SPI1,&SPI_InitStructure);SPI_Cmd(SPI1,ENABLE);MySPI_W_SS(1);}
//开始
void MySPI_Start()
{MySPI_W_SS(0);
}
//结束
void MySPI_Stop()
{MySPI_W_SS(1);
}
//交换字节
uint8_t MySPI_SwapByte(uint8_t SendByte)
{while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));SPI_I2S_SendData(SPI1,SendByte);while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE));return SPI_I2S_ReceiveData(SPI1);
}
对于片选信号,我们用GPIO引脚表示高低电平会更加容易;
对于A5和A7引脚,由于SPI外设是GPIO口的片上外设,所以要采用复用功能;
这里SPI外设的传输是有多种模式,我们选择全双工收发模式;
高位开始低位开始传输也是可以选择的;
最后要记得要启用SPI,否则将无效;
这里的交换字节采用非连续传输的方式,我们的顺序与上面的逻辑图是相反的,是因为对于标志位,在读取和写入时会自动清除标志位,先写标志位,再写发送数据和读出数据会更加方便;
在这里说一下试验的注意事项,
对于扇区擦除,只要输入的数据在指定扇区,那么就会对那一片扇区进行擦除;
这是一片扇区,那么输入000000h到000FFFh的地址位,都是对该扇区的擦除;
对于测试连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入。
我们可以以000000h为头,那么0000FFh就是尾,(页的大小)进行测试;通过改变地址来进行验证。
相关文章:

STM32--SPI通信与W25Q64(2)
STM32–SPI通信与W25Q64(1) 文章目录 SPI外设特征 SPI框图传输模式主模式全双工连续传输 非连续传输硬件SPI读写W25Q64 SPI外设 STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担。 特…...

微信小程序 校园周边美食商城分享系统
管理员、会员、商家可通过Android系统手机打开系统,注册登录后可进行管理员后端;首页、个人中心、会员管理、商家管理、美食类型管理、美食信息管理、美食交流、我的收藏管理、系统管理、订单管理,会员前端;首页、美食信息、美食交…...

K8S - 架构、常用K8S命令、yaml资源清单部署、Ingress、故障排查、存储卷
K8S K8S官网文档:https://kubernetes.io/zh/docs/home/学习东西还是要从官方文档入手;用于管理、扩展、自动部署容器; 其实就是 对多个跨机器的Docker集群; K8S特性 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 …...
micro benchmark 使用经验
文章目录 User Guide User Guide User Guide: https://github.com/google/benchmark/blob/main/docs/user_guide.md #include <benchmark/benchmark.h> #include <chrono> #include <thread>void BM_DemoSleep(benchmark::State& state) {for (auto _ …...
nodejs发布静态https服务器
1、先用 npm init 创建一个package.json,然后添加依赖 node-static ,package.json 如下: {"name": "freeswitch","version": "1.0.0","description": "test freeswitch for webrtc&…...

国产系统下开发QT程序总结
国产系统下开发QT程序总结 1. 国产系统简介 开发国产系统客户端的过程中,会出现兼容性问题。以下介绍Kylin和UOS环境下开发QT程序, 首先麒麟和统信这两个系统基于Ubuntu开发的。所以在Ubuntu开发理论上在国产系统上也能运行。芯片架构又分为amd,arm,mi…...

【Redis】redis入门+java操作redis
目录 一、Redis入门 1.1 Redis简介 1.2 Redis下载与安装 1.2.1 下载 1.2.2 linux安装 1.2.3 windows安装 1.3 Redis服务启动与停止 1.3.1 linux启动、停止Redis服务 1.3.2 windows启动、停止Redis服务 1.4 修改Redis启动密码 1.4.1 Linux修改设置 1.4.2 windows设…...

无涯教程-Android - Spinner函数
Spinner允许您从下拉菜单中选择一个项目 例如。使用Gmail应用程序时,将显示如下所示的下拉菜单,您需要从下拉菜单中选择一个项目。 Spinner Example 示例 本示例演示计算机的类别,您需要从类别中选择一个类别。 以下是修改后的主要Activity文件src/com.example.spinner/Andr…...

国标GB28181视频平台EasyGBS国标平台智能边缘计算网关关于小区电动车进电梯的应用方案设计
一、行业背景 随着人工智能技术的不断成熟与落地,各行各业也逐渐融入AI智能检测技术,尤其是在视频监控领域,通过AI视频智能检测与分析,可以大大提高视频的自动化、智能化监控能力。比如在小区的管理中,由电动车上楼入…...

supervisorctl(-jar)启动配置设置NACOS不同命名空间
背景 由于需要在上海服务器上面配置B测试环境,原本上面已有A测试环境,固需要将两套权限系统分开 可以使用不同的命名空间来隔离启动服务 注:本文章均不涉及公司机密 1、新建命名空间 命名空间默认会有一个public,并且不能删除&a…...

如何解决 Out Of Memory 的问题
背景 在用 Excel Importer 导入数据,当数据量超过 1w 行,经常会出现 OutOfMemory 的错误。(用 Excel Exporter 导出数据时,也会有类似问题)。 通常的表现症状如下,即在导入成功若干行之后,爆出…...
代码随想录训练营二刷第九天 | 字符串结束
总结 总体来说字符串的题目除了KMP之外难度不大,但是细节不少,有翻转的有双指针操作的。 此外一般使用双指针都是为了降低时间复杂度,从On2到On,链表除外。...
javaee spring jdbcTemplate的使用
依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 htt…...

qt day
#include "widget.h" #include "ui_widget.h" void Widget::my_slot() {} Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowIcon(QIcon(":/wodepeizhenshi.png"));//設置窗口的…...

Configurable Weather Parameters
1. Weather Parameters 2. Classification ClearNoon, CloudyNoon, WetNoon, WetCloudyNoon, SoftRainNoon, MidRainyNoon, HardRainNoon, ClearSunset, CloudySunset, WetSunset, WetCloudySunset, SoftRainSunset, MidRainSunset, HardRainSunset to do list: 可以关注一下…...

MySQL 8 数据清洗总结
MySQL 8 数据清洗三要素: 库表拷贝和数据备份数据清洗SQL数据清洗必杀技-存储过程 前提:数据库关联库表初始化和基础数据初始化: -- usc.t_project definitionCREATE TABLE t_project (id varchar(64) NOT NULL COMMENT 主键,tid varchar(…...

设计模式第九讲:常见重构技巧 - 去除不必要的!=
设计模式第九讲:常见重构技巧 - 去除不必要的! 项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢?本文是设计模式第九讲,讲解常见重构技巧:去除不必要的! 文章目录…...
自动化安装系统问题记录
Cobbler 版本更新 https://github.com/cobbler/cobbler/releases Centos7/8 Cobbler 问题: 部署cobbler时,使用cobbler get-loaders从网络下载引导加载程序时提示命令未找到 解决: yum -y install syslinux Rockylinux9.2 Cobbler3.…...

centos7 docker安装记录
以下所有命令都在root用户下进行,若为普通用户,需要在所有命令前加上 sudo。 1、更新yum包 将yum包更新到最新 yum update2、安装需要的软件包 yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的; yum …...
全网实时热点热榜事件API
全网热榜API 一、全网热榜二、使用步骤1、接口2、请求参数 三、 案例和demo 一、全网热榜 1个免费的帮助你获取全网热点事件的接口API 二、使用步骤 1、接口 重要提示:建议使用https协议,当https协议无法使用时再尝试使用http协议 请求方式: GET https://luckycola.com.cn…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...