当前位置: 首页 > news >正文

【STM32】SPI初步使用 读写FLASH W25Q64

硬件连接

在这里插入图片描述

(1) SS( Slave Select):从设备选择信号线,常称为片选信号线,每个从设备都有独立的这一条 NSS 信号线,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI通讯。所以 SPI通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号。

(2) SCK (Serial Clock):时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。

(3) MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。

(4) MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。

通信协议

在这里插入图片描述

起始信号:NSS 信号线由高变低,是 SPI 通讯的起始信号。
数据有效性:MOSI 及 MISO 的数据在 SCK 的上升沿期间变化输出,在SCK 的下降沿时被采样。即在 SCK 的下降沿时刻,MOSI 及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。
CPOL/CPHA 及通讯模式:总的来说是根据CR寄存器中对CPOL/CPHA的配置来决定总线空闲时 SCK 的时钟状态以及数据采样时刻,一般使用模式0和3
在这里插入图片描述

编程要点

(1) 初始化通讯使用的目标引脚及端口时钟;
(2) 使能 SPI 外设的时钟;
(3) 配置 SPI 外设的模式、地址、速率等参数并使能 SPI 外设;
(4) 编写基本 SPI 按字节收发的函数;
(5) 编写对 FLASH 擦除及读写操作的的函数;
(6) 编写测试程序,对读写数据进行校验。

配置GPIO复用

//GPIO 配置
GPIO_InitTypeDef GPIO_InitStructure;
NSS片选引脚配置为普通GPIO
MISO MOSI SLK引脚配置为复用推挽输出
GPIO_Init(FLASH_SPI_MOSI_PORT, &GPIO_InitStructure);

配置SPI

SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd (SPI1, ENABLE );SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(FLASH_SPIx, &SPI_InitStructure);SPI_Cmd(FLASH_SPIx, ENABLE);

使用SPi 读写FLASH W25Q64

使用 SPI 发送和接收一个字节的数据

 #define Dummy_Byte  0xFF
u8 SPI_FLASH_SendByte(u8 byte)
{SPITimeout = SPIT_FLAG_TIMEOUT;/* 等待发送缓冲区为空,TXE 事件 *///读取SR寄存器 相关位while (SPI_I2S_GetFlagStatus(FLASH_SPIx, SPI_I2S_FLAG_TXE) == RESET){if ((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);	}/* 写入数据寄存器,把要写入的数据写入发送缓冲区 *///与大多数写DR寄存器操作一致,写动作会自动清空DR寄存器SPI_I2S_SendData(FLASH_SPIx, byte);SPITimeout = SPIT_FLAG_TIMEOUT;/* 等待接收缓冲区非空,RXNE 事件 */while (SPI_I2S_GetFlagStatus(FLASH_SPIx, SPI_I2S_FLAG_RXNE) == RESET){if ((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(1);}/* 读取数据寄存器,获取接收缓冲区数据 *///与大多数读DR寄存器操作一致,读动作会自动清空DR寄存器return SPI_I2S_ReceiveData(FLASH_SPIx);}

控制Flash的指令

FLASH 芯片自定义了很多指令,我们通过控制 STM32 利用 SPI 总线向 FLASH 芯片发送指令,FLASH芯片收到后就会执行相应的操作。

相关文章:

【STM32】SPI初步使用 读写FLASH W25Q64

硬件连接 (1) SS( Slave Select):从设备选择信号线,常称为片选信号线,每个从设备都有独立的这一条 NSS 信号线,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即…...

javaScript:DOM(父子/兄弟)常用属性

目录 前言 一.父子关系 父子关系的常用属性 childNodes 获取所有的子节点 children 获取所有的子元素(dom元素) firstChild 获取元素的第一个子节点,相当于 childNodes[0] firstElementChild 获取元素的第一个元素 相当于 children[0]…...

笔记:linux中LED(GPIO)驱动设备树配置和用法

设备树中节点配置 设备树中的LED驱动一般是这样写&#xff0c;LED驱动可以控制GPIO的电平变化&#xff0c;生成文件节点很方便 leds: leds {compatible "gpio-leds";gpio_demo: gpio_demo {label "gpio_demo";gpios <&gpio0 RK_PC0 GPIO_ACTIV…...

能耗管理+分区温控成为开发节能、省电神器的关键!从此告别电费刺客时代

取暖器在人们脑海中最深刻的印象&#xff0c;就是费电&#xff01;而它耗电量大的原因&#xff0c;主要在于它是靠电能直接转化为热能&#xff1a;在取暖设备通电后&#xff0c;内部高电阻的电热丝发热&#xff0c;风机会将这股热量吹散到室内&#xff0c;从而达到全屋取暖的效…...

垃圾回收 - 复制算法

GC复制算法是Marvin L.Minsky在1963年研究出来的算法。说简单点&#xff0c;就是只把某个空间的活动对象复制到其它空间&#xff0c;把原空间里的所有对象都回收掉。这是一个大胆的想法。在此&#xff0c;我们将复制活动对象的原空间称为From空间&#xff0c;将粘贴活动对象的新…...

基于SpringMVC实现常见功能

基于SpringMVC实现常见功能 防止XSS攻击 XSS攻击全称跨站脚本攻击&#xff0c;是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS&#xff0c;XSS是一种在web应用中的计算机安全漏洞&#xff0c;它允许恶意web用户将代码植入到…...

MetInfo5.0文件包含漏洞

MetInfo历史版本与文件 环境在这里下载&#xff0c;使用phpstudy搭建 我们来看到这个index.php&#xff0c;如下图所示&#xff0c;其中定义了fmodule变量与module变量&#xff0c;其中require_once语句表示将某个文件引入当前文件&#xff0c;在这个代码中&#xff0c;通过r…...

【SpringBoot】SpringBoot实现基本的区块链的步骤与代码

以下是Spring Boot实现基本的区块链代码的步骤&#xff1a; 创建一个Block类&#xff0c;它表示一个区块&#xff0c;包含一个区块头和一个区块体。区块头包括版本号、时间戳、前一个区块的哈希值和当前区块的哈希值。区块体包含交易数据。 创建一个Blockchain类&#xff0c;它…...

Photoscan/Metashape 2.0.0中的地面激光扫描处理

在Metashape(原Photoscan)2.0.0, 结构化地面激光扫描和非结构化航空激光扫描都可以使用导入点云&#xff08;文件>导入>导入点云&#xff09;命令导入。导入时会保留所有点属性&#xff08;包括结构化信息&#xff09;。 本文讨论以下主题 如何将激光扫描数据导入项目&am…...

git快速使用

1、下载git 设置签名 2、基本概念 工作区&#xff1a;写代码的地方。 暂存区&#xff1a;.git的.index 工作区&#xff1a;.git 3、常用操作 本地codinggit init&#xff0c; 初始化一个本地仓库&#xff0c;项目根目录下会出现个.gitgit remote add origin gitgithub.com…...

java 实现代理模式

代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许一个对象&#xff08;代理对象&#xff09;充当另一个对象&#xff08;被代理对象&#xff09;的接口&#xff0c;以控制对该对象的访问。代理模式通常用于以下情况&#xff1a; 远程代理…...

【每日一题】力扣1768. 交替合并字符串

题目以及链接&#xff1a; 1768. 交替合并字符串 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 示例 1&…...

vscode新建vue3文件模板

输入快捷新建的名字 enter 确认后在文件中输入以下内容 {// Place your snippets for vue here. Each snippet is defined under a snippet name and has a prefix, body and// description. The prefix is what is used to trigger the snippet and the body will be expand…...

MySql学习笔记02——MySql的简单介绍

MySQL 常用命令 注意在mysql中使用的命令需要用英文分号结尾&#xff08;启动/关闭mysql服务不需要带分号&#xff09; net start mysql 启动mysql服务&#xff08;需要管理员启动cmd&#xff09; net stop mysql关闭mysql服务&#xff08;需要管理员启动cmd&#xff09; m…...

mysql-1:认识mysql

文章目录 数据库概述什么是数据库什么是关系型数据库 MySQL的概述MySQL是什么MySQL发展历程 SQL的概述什么是SQLSQL发展的简要历史&#xff1a;SQL语言分类 数据库概述 什么是数据库 数据库就是[存储数据的仓库]&#xff0c;其本质是一个[文件系统]&#xff0c;数据按照特定的…...

算法通关村-----堆在查找和排序中的应用

数组中的第K个最大元素 问题描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。详见le…...

直方图统计增强方法

直方图统计增强方法的原理&#xff1a;   直方图统计增强是一种基于像素值分布的图像增强技术&#xff0c;通过调整像素值的分布来增强图像的对比度和细节。其原理是根据图像的直方图信息&#xff0c;将原始像素值映射到一个新的像素值域&#xff0c;从而改变图像的亮度和对比…...

字节二面:如果高性能渲染十万条数据?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;作为一名前端开发工程师&#xff0c;我们虽然可能很少会遇到后端返回十万条数据的情况&#xff0c;但是了解掌握如何处理这种情况&#xff0c;能让你对前端性能优化有更深的…...

Mysql高阶语句(二)

一、设置别名&#xff08;alias ——>as&#xff09; 在 MySQL 查询时&#xff0c;当表的名字比较长或者表内某些字段比较长时&#xff0c;为了方便书写或者 多次使用相同的表&#xff0c;可以给字段列或表设置别名。使用的时候直接使用别名&#xff0c;简洁明了&#xff0…...

算法笔记 二叉搜索树

二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种数据结构&#xff0c;用于存储具有可比较键&#xff08;通常是数字或字符串&#xff09;的元素 1 结构特点 节点结构&#xff1a;每个节点都有一个键和两个子节点&#xff08;左子节点和右子…...

保姆级教程:用交大镜像源5分钟安装PyTorch 2.3.0(支持CUDA 12.6)

5分钟极速部署PyTorch 2.3.0开发环境&#xff08;CUDA 12.6兼容方案&#xff09; 深度学习开发环境配置一直是让开发者头疼的问题&#xff0c;尤其是当硬件驱动与框架版本不匹配时。最近在技术社区中&#xff0c;"Torch CUDA is not available"成为高频搜索词&#x…...

从序列到结构:ESM蛋白质语言模型核心原理与实践解析

1. 蛋白质语言模型为何成为研究热点 最近几年&#xff0c;蛋白质语言模型突然在生物信息学领域火了起来。作为一个长期关注AI在生命科学领域应用的开发者&#xff0c;我发现这背后有两个关键驱动力&#xff1a;一是蛋白质结构预测的世纪难题有了新解法&#xff0c;二是Transfor…...

NEURAL MASK RMBG-2.0技术演进:从RMBG-1.0到ART-ENGINE的架构升级

NEURAL MASK RMBG-2.0技术演进&#xff1a;从RMBG-1.0到ART-ENGINE的架构升级 1. 背景与挑战 传统的图像抠图工具在面对复杂场景时往往力不从心。当遇到细微的发丝、半透明物体或者复杂的光影交错时&#xff0c;这些工具要么产生锯齿状的边缘&#xff0c;要么无法准确区分主体…...

终极多店铺管理指南:如何在Fecshop中轻松运营多个独立商城

终极多店铺管理指南&#xff1a;如何在Fecshop中轻松运营多个独立商城 【免费下载链接】yii2_fecshop Yii2_fecshop是一个基于Yii2框架的电商系统&#xff0c;适合用于搭建在线商城、B2C网站等。特点&#xff1a;功能丰富、易于扩展、支持多种支付方式。 项目地址: https://g…...

FLAC转ALAC踩坑实录:除了音质无损,你的专辑封面和元数据都保留了吗?

FLAC转ALAC终极指南&#xff1a;如何无损迁移音质、元数据与专辑封面 每次打开Apple Music看到那些没有封面的专辑&#xff0c;或是艺术家信息显示为"未知"的曲目&#xff0c;总让人有种说不出的别扭。作为一位十年资深的数字音乐收藏者&#xff0c;我深知真正的音乐…...

关于visio导出png jpg等格式图片边缘出现黄线的暂时解决方案

起因是更新windows后&#xff0c;visio导出图片边缘将会出现黄线&#xff0c;对于强迫症患者来说实在难以忍受。首先23H2是没有这个问题的&#xff0c;好像25H2才有的。随着我一直更新系统好像目前的黄线没有以前那么多了&#xff0c;但仍然有。删除更新感觉并不是一个很好的办…...

PyTorch 2.8镜像创意实践:AI音乐生成+歌词视频同步+多模态情感渲染

PyTorch 2.8镜像创意实践&#xff1a;AI音乐生成歌词视频同步多模态情感渲染 1. 项目背景与镜像优势 在数字内容创作领域&#xff0c;音乐视频制作一直是个耗时费力的过程。传统流程需要音乐制作、歌词设计、视频剪辑等多个专业环节配合&#xff0c;成本高且周期长。PyTorch …...

Anaconda环境下的LiuJuan20260223Zimage开发:创建独立Python沙箱

Anaconda环境下的LiuJuan20260223Zimage开发&#xff1a;创建独立Python沙箱 你是不是也遇到过这种情况&#xff1f;电脑上同时跑着好几个Python项目&#xff0c;一个需要TensorFlow 2.0&#xff0c;另一个却只能用TensorFlow 1.x&#xff0c;装来装去最后环境一团糟&#xff…...

5分钟搞定!cv_unet_image-matting图像抠图WebUI快速抠图技巧

5分钟搞定&#xff01;cv_unet_image-matting图像抠图WebUI快速抠图技巧 1. 为什么选择这款AI抠图工具 在电商设计、社交媒体运营、证件照处理等场景中&#xff0c;高质量图像抠图是刚需。传统手动抠图不仅耗时耗力&#xff0c;对技术要求也高。而这款基于U-Net架构的AI抠图工…...

国产AI芯动力:复旦微FMQL100TAI900 FPGA原型验证板全解析

1. 这块国产FPGA板卡凭什么值得关注&#xff1f; 第一次拿到复旦微FMQL100TAI900开发板时&#xff0c;最让我惊讶的是其全产业链国产化的完成度。从主芯片到电源管理IC&#xff0c;甚至每个电阻电容都贴着中文标识&#xff0c;这在三年前根本不敢想象。作为长期从事AI硬件开发的…...