SPI协议——对外部SPI操作(跨页读写)

关于W25Q32JVSSIQ的详细内容在之前的两篇文章中已经详细介绍,本文不做太多赘述,如果对芯片的了解有缺失的话,可以参考:

SPI协议——对外部SPI Flash操作-CSDN博客

SPI协议——读取外部SPI Flash ID_spi flash 读取id-CSDN博客

目录

一、代码编写

1.发送/接收单/多个字节的函数

2.实现扇区擦除

3.实现跨页写

 4.读取数据

 二、运行结果

 


 

一、代码编写

1.发送/接收单/多个字节的函数

这样设计代码可以随意选择自己是否忽略发送/接受的数据

void SPI_FLASH_Xfer(uint8_t *snd_buf, uint8_t *recv_buf, int bytes)
{int 		i;uint8_t		send_data, recv_data;for(i = 0; i < bytes; i ++){send_data = (snd_buf != NULL) ? snd_buf[i] : 0xFF;recv_data = SPI_FLASH_SendByte(send_data);if( recv_buf != NULL ){recv_buf[i] = recv_data;}printf("Sending: 0x%02X, Received: 0x%02X\n", send_data, recv_data);}HAL_Delay(1);
}

2.实现扇区擦除

int New_SPI_FLASH_SectorErase(uint32_t addr, uint32_t size)
{uint32_t sector, first, last;uint32_t address;int rv;first = addr / Sector_Size;last = (addr + size - 1) / Sector_Size;/* Start to erase all sectors */for (sector = first; sector <= last; sector++){address = sector * Sector_Size;printf("Norflash Erase Sector@%lx ...\r\n", address);SPI1_FLASH_WaitEnd();SPI1_FLASH_WriteEnable();cs_low();SPI_FLASH_SendByte(0x20); // 发送扇区擦除命令/* Send the addr */SPI_FLASH_SendByte((address & 0xFF0000) >> 16);SPI_FLASH_SendByte((address & 0xFF00) >> 8);SPI_FLASH_SendByte(address & 0xFF);cs_high();// 确保擦除完成SPI1_FLASH_WaitEnd();HAL_Delay(10); // 增加延时,确保擦除完成}// 检查整个擦除区域是否已擦除rv = SPI_FLASH_VerifyErase(addr, size);if (rv != 0){printf("Erase the sector error\n");return -1;}else{printf("Erase ok\n");}return 0;
}

3.实现跨页写

int New_SPI_FLASH_PageWrite( uint32_t addr, uint8_t *data, uint32_t size)
{uint32_t			first, last, page;uint32_t			address, ofset, len;uint8_t				buf[Page_Size+5];int					bytes = 0;if( addr + size > 0x400000 )return -1;/* find the fist and the last page */first = addr / Page_Size;last = ( addr + size - 1 ) / Page_Size;printf("Norflash Write %ld Bytes to addr@0x%lx Begin...\r\n", size, addr );/*Initial  address in page and offset in buffer */address = addr;ofset = 0;/* Start to write to all pages */for( page = first; page <= last; page ++){len = Page_Size - ( address % Page_Size );len = len > size ? size : len;bytes = 0;printf("Norflash write addr@0x%lx, %lu bytes,and the data is %s \r\n", addr, len, data);buf[bytes++] = 0x02;buf[bytes++] = (addr & 0xFF0000) >> 16 ;buf[bytes++] = (addr & 0xFF00) >> 8 ;buf[bytes++] = (addr & 0xFF);/* send command and data */memcpy(&buf[bytes], data+ofset, len);bytes += len;printf("Norflash write addr@0x%lx, %lu bytes, data : ", address, len);for( int i = 4; i < bytes; i++ ){printf("0x%02x", buf[i]);printf("\n");}SPI1_FLASH_WriteEnable();cs_low();SPI_FLASH_Xfer(buf, NULL, bytes);cs_high();SPI1_FLASH_WaitEnd();addr  += len;ofset += len;size  -= len;}HAL_Delay(10);printf("Norflash WriteByte@0x%lx done.\r\n", addr);return 0;}

 4.读取数据

void New_SPI_FLASH_BufferRead(uint32_t addr, uint8_t *buffer, uint32_t size)
{uint8_t cmd[4];cmd[0] = 0x03; // Read Data commandcmd[1] = (addr >> 16) & 0xFF;cmd[2] = (addr >> 8) & 0xFF;cmd[3] = addr & 0xFF;cs_low();//发送读取命令和地址SPI_FLASH_Xfer(cmd, NULL, 4);//读取数据SPI_FLASH_Xfer(NULL, buffer, size);cs_high();// 调试输出,可选项,用于验证发送的命令和接收到的数据
/*    printf("SPI Flash Read: Address = 0x%lx, Data: ", addr);for (int i = 0; i < size; i++){printf("0x%02x ", buffer[i]);}printf("\n");*/
}

 二、运行结果

 

 

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

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

相关文章

【SpringCloud应用框架】Nacos集群配置

第八章 Spring Cloud Alibaba Nacos之集群配置 文章目录 一、Linux版NacosMySql生产环境配置具体配置&#xff1a; 二、Nacos集群配置更改Nacos启动命令配置原理具体配置测试启动总结 一、Linux版NacosMySql生产环境配置 上一篇博客中已经了解了Nacos生产环境下需要搭建集群配…

ubuntu20.04:ROS驱动usb相机和livox雷达——Noetic版本

简单记录驱动相机和雷达并录包。 目录 前言 一、ROS的简单安装 二、安装USB相机驱动 1.准备工作 2.安装usb_cam驱动 3.修改配置文件和启动相机节点 另一种安装方式 三、配置Livox雷达 1.安装Livox SDK2 2.安装livox_ros_driver2 3.配置和启动雷达节点 四、录制bag包…

XDMA原理学习(1)——DMA技术详解

目录 一、什么是DMA&#xff1f;为什么需要DMA&#xff1f; 二、DMA分类 2.1 Block DMA 2.2 Scatter-Gather DMA 2.3 Ring buffer DMA 三、实际案例 3.1 STM32微处理器 3.1.1 Block DMA 3.1.2 Scatter-Gather DMA 3.1.3 使用场景举例&#xff1a; 3.1.4 配置与实现 …

Q_OBJECT 的作用

在Qt框架中&#xff0c;Q_OBJECT宏起着至关重要的作用。当你在一个类中使用Q_OBJECT宏时&#xff0c;它提供了以下功能&#xff1a; 元对象系统支持&#xff1a;Q_OBJECT宏启用了Qt的元对象系统&#xff0c;允许对象进行内省&#xff08;introspection&#xff09;。这意味着对…

MySQL8之mysql-community-client-plugins的作用

mysql-community-client-plugins是MySQL社区版客户端的一组插件&#xff0c;它们扩展了MySQL客户端的功能。这些插件通常用于增强客户端的某些特定能力&#xff0c;如连接管理、数据处理、安全验证等。以下是对mysql-community-client-plugins的详细解释&#xff1a; 一、功能…

3GPP R18 Multi-USIM 是怎么回事?(三)

这篇内容相对来说都是一些死规定,比较枯燥。主要是与MUSIM feature相关的mobility and periodic registration和service request触发过程的一些规定,两部分的内容是有部分重叠的,为保证完整性,重复部分也从24.501中摘了出来。 24.501 4.25 网络和MUSIM UE可以支持MUSIM fe…

idea控制台乱码问题解决教程

注&#xff1a;按顺序来操作&#xff0c;完成后要重启软件 方案一&#xff1a;修改Tomcat的编码设置 在Tomcat的VM options中添加了-Dfile.encodingUTF-8 方案二&#xff1a;修改IDEA的编码设置 File->Settings->Editor->File Encodings 将Global Encoding、Proj…

应用服务启动提示数据库连接太多,被锁住 同一ip无法再次连接问题

今天在启动应用的时候 提示数据库连接过多&#xff0c;对应的ip无法再次连接到数据库导致应用无法启动的问题 临时解决方案&#xff1a; 1、查看目前最大连接数是多少 show variables like ‘%max_connect_errors%’; 2、修改最大连接数为1000 set global max_connect_errors…

STM32-外部中断浅析

本篇解释了STM32中断原理 MCU为什么需要中断 中断&#xff0c;是嵌入式系统中很重要的一个功能&#xff0c;在系统运行过程中&#xff0c;当出现需要立刻处理的情况时&#xff0c;暂停当前任务&#xff0c;转而处理紧急任务&#xff0c;处理完毕后&#xff0c;恢复之前的任务…

深度学习之正则化

目标 我们学习正则化之前应该先了解我们为什么要用正则化 。正则化解决了什么问题 。我们讲正则化之前 &#xff0c;先了解一个概念–》过拟合 过拟合 数据增强 L1和L2正则化 Dropout 注意&#xff1a;Dropout是不适合用在卷积神经网络的 提前终止 一般的做法是&#xff1a;记…

pytorch通过 tensorboardX 调用 Tensorboard 进行可视化

示例 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transformsfrom tensorboardX import SummaryWriter# 定义神经网络模型 class SimpleCNN(nn.Module):def __init__(self):…

B端工作台如何设计?指导思想+布局建议+大厂案例全给你

一、B端工作台设计的指导思想 要做好B端工作台设计&#xff0c;以下是一些建议和策略&#xff1a; 1. 用户研究&#xff1a;深入了解目标用户的需求、行为和工作流程。通过用户研究方法&#xff0c;如用户访谈、观察和调研&#xff0c;收集用户反馈和意见&#xff0c;了解他们…

spark 中hint使用总结

在spark sql 中用户可以使用Join hint来建议Spark使用哪一种Join。在Spark 3.0以前&#xff0c;只支持BROADCAST这种Join hint。从Spark 3.0开始增加了MERGE、SHUFFLE_HASH和SHUFFLE_REPLICATE_NL这三种Join Hint。优先级为BROADCAST > MERGE > SHUFFLE_HASH > SHUFFL…

【计算机组成原理】计算机系统概述(上)

&#xff08;一&#xff09;计算机系统简介 计算机系统有“硬件”和“软件”两大部分组成。 1&#xff09;所谓“硬件”即指见计算机的实体部分&#xff0c;它由看得见摸得着的各种电子元器件、各类光、电、机设备的事物组成&#xff0c;如主机、外设等等。 2&#xff09;所谓…

以SGET协会OSM标准首创有662引脚的OSM模组——凌华智能引领嵌入式运算市场

在可焊接的45 x 45mm尺寸上提升功率 开启嵌入式运算发展的新时代 摘要&#xff1a; 1.开放式标准模块(OSM™)&#xff0c;最大尺寸仅45 x 45mm&#xff0c;采用零开销的模块化系统简化生产&#xff0c;并提供662个引脚以增强小型化和物联网应用。 2.凌华智能提供基于NXP i.M…

持续提升入境游客支付便利性 支付宝可绑银联国际卡支付

随着免签等系列便利入境游政策的推出、国际航班的持续复苏&#xff0c;越来越多的全球游客来中国旅行&#xff0c;入境游持续升温。为进一步助力全球游客用一个支付宝畅游中国&#xff0c;提升入境游客支付便利性&#xff0c;7月8日&#xff0c;支付宝表示将联合银联国际升级支…

快速掌握AI的最佳途径实践

科技时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为许多人希望掌握的重要技能。对于普通人来说&#xff0c;如何快速有效地学习AI仍然是一个挑战。本文将详细介绍几种快速掌握AI的途径&#xff0c;并提供具体的操作步骤和资源建议。 前言 AI的普及和应用已经深…

独立站爆款产品的选品思路及底层逻辑拆解

在这个竞争激烈的跨境电商市场&#xff0c;有一件事情比网站设计、营销策略、物流服务都更重要。那就是选品。跨境独立站选品是独立站成功的第一步&#xff0c;如果选错了产品&#xff0c;那么所有努力都可能白费。可能会面临库存积压、利润低迷、客户流失等问题。但是如果选对…

【一文看懂yarn的安装与使用以及如何初始化项目】

Yarn是一个流行的JavaScript包管理工具&#xff0c;它提供了一套用于安装、管理和发布包的工具和命令。以下将详细说明Yarn的安装、使用以及配置方法。 一、Yarn的安装 Yarn的安装方法多样&#xff0c;主要包括使用npm安装、系统包管理器安装以及直接下载安装程序。 使用npm安…

HackTheBox--BoardLight

BoardLight 测试过程 1 信息收集 NMAP端口扫描 端口扫描开放 22、80 端口 80端口测试 # 添加 boardLight.htb 到hosts文件 echo "10.10.11.11 boardLight.htb" | sudo tee -a /etc/hosts检查网页源代码&#xff0c;发现 board.htb # 添加 board.htb 到 hosts 文…