浅谈针对Nor flash状态寄存器保护位修改方法

news2024/10/18 9:05:35

浅谈针对Nor flash状态寄存器保护位修改


✨最近在写QSPI驱动Nor flash过程中,在操作芯片的状态寄存器的时候,遇到的一些问题和解决办法。

  • 🔬操作Nor flash测试芯片:GD25Q64
  • 🔖以QSPI测试为例,SPI方式修改没有测试过。

Nor flash整个状态寄存器,控制着对存储芯片的数据访问速度和方式,以及操作权限。

存储器芯片数据保护,是存储芯片的重要组成部分,不同的存储芯片都会有各自的数据保护机制。

  • 📑芯片DIP封装引脚定义:
    在这里插入图片描述
    在这里插入图片描述

  • 🍁功能控制块:
    在这里插入图片描述

  • 📄单词释义

  • non-volatile:非易失性,掉电不丢失。
  • volatile:易失性,掉电或复位操作会导致该位数据丢失,恢复默认值。

📗 状态寄存器描述:

  • ✨不同品牌的的Nor flash芯片的操作指令和状态寄存器位可能存在差异。
  • 🔨Read Status Register (RDSR) (05H or 35H or 15H):读状态寄存器1-3指令。
  • 指令0x05,用来读取S0 - S7 位。
  • 指令0x35,用来读取S8 - S15 位。
  • 指令0x15,用来读取S16 - S23 位。
  • 🔨Write Status Register (WRSR) (01H or 31H or 11H):写状态寄存器1-3指令
  • 写指令0x01,用来写S0 - S7 位。
  • 写指令0x01,用来写S8 - S15 位。
  • 写指令0x01,用来写S16 - S23 位。

在这里插入图片描述

  • 🌿数据内容本身保护位:BP0 - BP4(掉电不丢失)
    The Block Protect (BP4, BP3, BP2, BP1, and BP0) bits are non-volatile. They define the size of the area to be software protected against Program and Erase commands. These bits are written with the Write Status Register (WRSR) command. When the Block Protect (BP4, BP3, BP2, BP1, BP0) bits are set to 1, the relevant memory area (as defined in Table1).becomes protected against Page Program (PP), Sector Erase (SE) and Block Erase (BE) commands. The Block Protect (BP4, BP3, BP2, BP1, and BP0) bits can be written provided that the Hardware Protected mode has not been set. The Chip Erase (CE) command is executed, if the Block Protect (BP2, BP1, and BP0) bits are 0 and CMP=0 or the Block Protect (BP2, BP1, and BP0) bits are 1 and CMP=1.
  • CMP比较位,配合BP0 - BP4位使用
  • 保护的是以数据块为范围:
  • 🌿CMP位等于0时,BP0 - BP4配置的保护范围:
    在这里插入图片描述

  • 🌿CMP位等于0时,BP0 - BP4配置的保护范围:
    在这里插入图片描述

  • 🌿对状态寄存器操作保护位:SRP1和 SRP0
    The Status Register Protect (SRP1 and SRP0) bits are non-volatile Read/Write bits in the status register. The SRP bits control the method of write protection: software protection, hardware protection, power supply lock-down or one time programmable protection.
    在这里插入图片描述

状态保护位,主要是从硬件和软件方面提供保护支持。

  • 当SRP1=0,SRP0=0;则是软件保护。可以通过编程,实现对整个状态寄存器1-3的相关位,进行进行配置修改。
  • 当SRP1=0,SRP0=1,且#WP物理引脚接GND,则是硬件保护。则无法对整个状态寄存器1-3的相关位,无法进行配置修改。
  • 当SRP1=0,SRP0=1,且#WP物理引脚上拉:.硬件上对状态寄存器位无保护。
  • 常规的SPI接口:
    在这里插入图片描述
  • QSPI接口:4条数据通信
    在这里插入图片描述
📘手册写状态寄存器流程描述:(这里以GD25Q64手册介绍为例)

原文:The Write Status Register (WRSR) command allows new values to be written to the Status Register. Before it can be accepted, a Write Enable (WREN) command must previously have been executed. After the Write Enable (WREN)
command has been decoded and executed, the device sets the Write Enable Latch (WEL).
The Write Status Register (WRSR) command has no effect on S23, S20, S19, S18, S17, S16, S15, S10, S1 and S0 of the Status Register. CS# must be driven high after the eighth bit of the data byte has been latched in. If not, the Write Status Register (WRSR) command is not executed. As soon as CS# is driven high, the self-timed Write Status Register cycle (whose duration is tW) is initiated. While the Write Status Register cycle is in progress, the Status Register may still be read to check the value of the Write In Progress (WIP) bit. The Write In Progress (WIP) bit is 1 during the self-timed Write Status Register cycle, and is 0 when it is completed. When the cycle is completed, the Write Enable Latch (WEL) is reset. The Write Status Register (WRSR) command allows the user to change the values of the Block Protect (BP4, BP3, BP2, BP1, and BP0) bits, to define the size of the area that is to be treated as read-only, as defined in Table1. The Write Status Register (WRSR) command also allows the user to set or reset the Status Register Protect (SRP1 and SRP0) bits in accordance with the Write Protect (WP#) signal. The Status Register Protect (SRP1 and SRP0) bits and Write Protect (WP#) signal allow the device to be put in the Hardware Protected Mode. The Write Status Register (WRSR) command is not executed once the Hardware Protected Mode is entered.

🎉吐槽一下:国内的这些厂商就是奇怪,明明是国内企业,所销售产品的客户对象,大部分在国内,产品手册只提供英文文档。
在这里插入图片描述

  • 📜操作流程图(来自网络)
    在这里插入图片描述
  1. 写使能(WREN)命令: • 在对状态寄存器进行任何修改之前,必须先执行写使能(WREN)命令来设置写使能锁存(WEL)。
  2. 写状态寄存器(WRSR)命令: • 用于修改状态寄存器中的非易失性位。需要按照特定的命令序列发送命令代码和新的状态寄存器值。
  3. 写非易失性,状态寄存器(01H/31H/11H)命令: • 用于快速修改状态寄存器中的易失性位。在执行写易失性状态寄存器命令之后,可以立即执行写状态寄存器(WRSR)命令来修改易失性位。
  4. 查询状态寄存器(WIP)位: 用于检测是否写入操作完成。

实际在使用QSPI操作过程中发现,有些状态寄存器指令,按照此流程并不能修改成功。为此一直以为是代码问题。

  • 🌿能遵循此流程,实现状态寄存器修改的是有0x01指令。也就是S0-S7位的修改。
  • 需要注意的是, 在修改状态寄存器1时,同时会导致状态寄存器2的QE置1.
void W25QXX_Write_SR(uint8_t regno,uint8_t sr)   
{   
	QSPI_CommandTypeDef cmd;
		QSPI_AutoPollingTypeDef s_config;		// 轮询比较相关配置参数
		QSPI_W25Qxx_WriteEnable();//WREN=1
//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET) ;//CS
	switch(regno)
	{
		case 1:
				cmd.Instruction=W25X_WriteStatusReg1;    //写状态寄存器1指令
				break;
		case 2:
				cmd.Instruction=W25X_WriteStatusReg2;    //写状态寄存器2指令
				break;
		case 3:
				cmd.Instruction=W25X_WriteStatusReg3;    //写状态寄存器3指令
				break;
		default:
				cmd.Instruction=W25X_WriteStatusReg1;    
				break;
	}   
	cmd.Address = 0;
	cmd.AlternateBytes = 0;
	cmd.AddressSize = QSPI_ADDRESS_24_BITS;
	cmd.AlternateBytesSize = 0;
	cmd.DummyCycles = 0;
	cmd.InstructionMode = QSPI_INSTRUCTION_1_LINE;
	cmd.AddressMode = QSPI_ADDRESS_NONE;
	cmd.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
	cmd.DataMode = QSPI_DATA_1_LINE;
	cmd.NbData = 1;
	cmd.DdrMode = QSPI_DDR_MODE_DISABLE;
	cmd.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
	cmd.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
	
	 HAL_QSPI_Command(&hqspi, &cmd, 10000);
	 HAL_QSPI_Transmit(&hqspi, &sr, 10000);
//	__NOP();
//	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET) ;//CS

// 不停的查询W25Qxx_CMD_ReadStatus_REG1寄存器,将读取到的状态字节中的W25Qxx_Status_REG1_wip与0x00作比较
// 读状态寄存器1的第1位(只读),WEL写使能标志位,该标志位为1时,代表可以进行写操作
	
	s_config.Match           = 0x00;  		// 匹配值
	s_config.Mask			 = 0x01;				// 读状态寄存器1的第1位WIP(只读),=0时,代表可以进行写操作
	s_config.MatchMode       = QSPI_MATCH_MODE_AND;			 		// 与运算
	s_config.StatusBytesSize = 1;									// 状态字节数
	s_config.Interval        = 0x10;							 	// 轮询间隔
	s_config.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;			// 自动停止模式

	cmd.Instruction    = 0x05;			// 读状态信息寄存器
	cmd.DataMode       = QSPI_DATA_1_LINE;					// 1线数据模式
	cmd.NbData         = 1;									// 数据长度

	// 发送轮询等待命令	
	HAL_QSPI_AutoPolling(&hqspi, &cmd, &s_config, HAL_QPSI_TIMEOUT_DEFAULT_VALUE);	      
} 
  • 🔧S8 - S15位的修改方式:需要使用0x01操作指令,而不是使用0x31操作指令。(只是个人在使用0x35操作指令上没有修改成功过。不知道其他人使用该指令是否能修改成功)。这样的操作方式让人困惑,但是能修改成功。
void W25QXX_QSPI_ENABLE()   
{   
	QSPI_CommandTypeDef cmd;
	uint8_t Data[2]={0x02,0x02};

	QSPI_W25Qxx_WriteEnable();//WREN=1
//	HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_SET) ;
//	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET) ;//CS

	cmd.Instruction=W25X_WriteStatusReg1;    //写状态寄存器指令0x01  
	cmd.Address = 0;
	cmd.AlternateBytes = 0;
	cmd.AddressSize = QSPI_ADDRESS_24_BITS;
	cmd.AlternateBytesSize = 0;
	cmd.DummyCycles = 0;
	cmd.InstructionMode = QSPI_INSTRUCTION_1_LINE;
	cmd.AddressMode = QSPI_ADDRESS_NONE;
	cmd.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
	cmd.DataMode = QSPI_DATA_1_LINE;
	cmd.NbData = 2;
	cmd.DdrMode = QSPI_DDR_MODE_DISABLE;
	cmd.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
	cmd.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
	 HAL_QSPI_Command(&hqspi, &cmd, 10000);
	 HAL_QSPI_Transmit(&hqspi, Data, 10000);
//__NOP();
//   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET) ;//CS=1
	W25qxx_Is_Busy(hqspi);	         	      
} 
  • 🌿S16-S23 状态寄存器3,可以直接安装手册描述进行编程,写入没有问题。(代码配置参考上面的状态寄存器1)

📒CH341B编程器修改状态寄存器1

  • 🍕使用H341B编程器,如果通过AsProgrammer或者NeoProgrammer上位机软件,只能修改状态寄存器1,其他2个状态寄存器可以读取,但是不能写入成功。
  • 🌟使用AsProgrammer上位机软件,可以对Nor flash的3个状态寄存器f中的非易失性读写位(non-volatile Read/Write bit),都可以修改成功。
  • asprogrammer-dregmod-v3.15: https://github.com/therealdreg/asprogrammer-dregmod/releases

在这里插入图片描述

  • 软件使用比较简单,直接解压,即可打开使用,选择对应的编程器,进行连接即可操作Nor flash。
    在这里插入图片描述
  • 最新版链接下载:【2024-8-4】AsProgrammer V4.0 软件更新https://www.right.com.cn/forum/thread-8301742-1-1.html

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

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

相关文章

集成电路学习:什么是WLAN无线局域网

WLAN:无线局域网 WLAN,即无线局域网(Wireless Local Area Network),是一种通过无线技术构建的局域网络,它使用无线信号传输数据,取代了传统有线网络中的网线连接。以下是关于WLAN的详细解释&…

Lumerical学习——优化和参数扫描(Optimization and parameter sweeps)

一、概要介绍 这部分介绍优化和参数扫描项目设定的方法。在有大量数据模拟计算过程中这个特性允许用户使处理方法自动地查找期望的参数值。 ① 创建一个参数扫描任务 ② 创建一个优化任务 ③ 创建一个良率分析任务 ⑤ 打开所选择项目的编辑窗口,编辑其属性…

stm32 bootloader写法

bootloader写法: 假设app的起始地址:0x08020000,则bootloader的范围是0x0800,0000~0x0801,FFFF。 #define APP_ADDR 0x08020000 // 应用程序首地址定义 typedef void (*APP_FUNC)(void); // 函数指针类型定义 /*main函数中调用rum_app&#x…

【Unity】Unity Shader学习笔记(八)基础纹理2:高度纹理、法线纹理、模型空间下的法线纹理、切线空间下的法线纹理光照计算

文章目录 凹凸映射法线纹理设置高度纹理(Height Map)法线纹理(Normal Map)模型空间的法线纹理切线空间的法线纹理优劣对比 切线空间下的法线纹理光照计算最终效果完整代码TANGENT语义内置宏 TANGENT_SPACE_ROTATIONObjSpaceLightD…

前缀和--一维和二维模板

前缀和 【模板】前缀和 描述 给定一个长度为n的数组a1,a2,…ana1,a2,…a**n. 接下来有q次查询, 每次查询有两个参数l, r. 对于每个询问, 请输出alal1…ara**la**l1…a**r 输入描述: 第一行包含两个整数n和q. 第二行包含n个整数, 表示a1,a2,…ana1,a2,…a**n.…

JavaWeb——Maven(4/8):Maven坐标,idea集成-导入maven项目(两种方式)

目录 Maven坐标 导入Maven项目 第一种方式 第二种方式 Maven坐标 Maven 坐标 是 Maven 当中资源的唯一标识。通过这个坐标,我们就能够唯一定位资源的位置。 Maven 坐标主要用在两个地方。第一个地方:我们可以使用坐标来定义项目。第二个地方&#…

CLANet:基于明场图像的跨批次细胞系识别综合框架|文献速递-基于深度学习的医学影像分类,分割与多模态应用

Title 题目 CLANet: A comprehensive framework for cross-batch cell line identificationusing brightfield images CLANet:基于明场图像的跨批次细胞系识别综合框架 01 文献速递介绍 细胞系鉴定(Cell Line Authentication,CLA&#x…

英飞达医学影像存档与通信系统 WebUserLogin.asmx 信息泄露漏洞复现

0x01 产品简介 英飞达医学影像存档与通信系统 Picture Archiving and Communication System,它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟,DICOM,网络…

二叉树与堆讲解

目录 1.树的概念及结构 1.树的概念 2.树的相关概念 3.树的表示 2.二叉树 1.概念 2.特殊的二叉树 1.满二叉树 2.完全二叉树 3.二叉树的性质 4.二叉树的存储结构 1.顺序结构 2.链式存储 3.堆 1.堆的概念及结构 2.堆的实现 1.堆的创建 2.堆的初始化(H…

力扣力扣力:206. 反转链表

leetcode链接:206. 反转链表 题目描述: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5]输出:[5,4,3,2,1] 示例 2: 输入&#xff1…

手写Spring IOC-简易版

目录 项目结构entitydaoIUserDaoUserDaoImpl serviceIUserServiceUserServiceImpl ApplicationContext 配置文件初始化 IOC 容器RunApplication 注解初始化 IOC 容器BeanAutowired Reference 项目结构 entity User Data NoArgsConstructor AllArgsConstructor Accessors(chai…

面试八股(自用)

什么是java序列化,什么时候需要序列化? 序列化是指将java对象转化成字节流的过程,反序列化是指将字节流转化成java对象的过程。 当java对象需要在网络上传输 或者 持久化到存储文件中,就需要对java对象进行序列化处理。 JVM的主要组成部分…

Leetcode—1242. 多线程网页爬虫【中等】Plus(多线程)

2024每日刷题&#xff08;187&#xff09; Leetcode—1242. 多线程网页爬虫 实现代码 /*** // This is the HtmlParsers API interface.* // You should not implement it, or speculate about its implementation* class HtmlParser {* public:* vector<string>…

【Java 并发编程】阻塞队列与仿真餐厅

前言 阻塞队列 (BlockingQueue) 顾名思义是一种支持阻塞操作的队列&#xff0c;因为内部机制中添加了 wait 和 notify 方法&#xff0c;所以阻塞队列具备了线程之前相互协调的功能。阻塞队列主要运用于两个场景&#xff0c;一是生产者与消费者模型&#xff0c;二是线程池。本章…

【C语言】循环嵌套:乘法表

循环嵌套&#xff0c;外层循环执行一次&#xff0c;内层循环执行i次。分别控制 在循环的过程中加一层循环。 多层循环属于循环嵌套、嵌套循环 #include <stdio.h> #include <math.h> /* 功能&#xff1a;循环嵌套 乘法表 时间&#xff1a;2024年10月 地点&#xf…

可编辑73页PPT | 企业智慧能源管控平台建设方案

荐言分享&#xff1a;随着全球能源形势的日益紧张和智能化技术的快速发展&#xff0c;企业对于能源的高效利用和精细化管理需求愈发迫切。智慧能源管控平台作为一种集成了物联网、大数据、云计算、人工智能等先进技术的综合管理系统&#xff0c;旨在帮助企业实现能源数据的实时…

【线性回归分析】:基于实验数据的模型构建与可视化

目录 线性回归分析&#xff1a;基于实验数据的模型构建与可视化 1. 数据准备 2. 构建线性回归模型 3. 可视化 数据分析的核心 构建预测模型 应用场景 预测模型中的挑战 结论 线性回归分析&#xff1a;基于实验数据的模型构建与可视化 在数据分析领域&#xff0c;线性…

永恒之蓝漏洞

MS17-010是微软于2017年3月发布的一个安全补丁&#xff0c;旨在修复Windows操作系统中的一个严重漏洞&#xff0c;该漏洞被称为“永恒之蓝”&#xff08;EternalBlue&#xff09;。这个漏洞影响了Windows的Server Message Block&#xff08;SMB&#xff09;协议&#xff0c;允许…

JavaEE-线程安全问题

1.多线程带来的的⻛险-线程安全 1.1 观察线性不安全 // 此处定义⼀个 int 类型的变量 private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {// 对 count 变量进⾏⾃增 5w 次for (int i 0; i…

基于Java微信小程序的水果销售系统详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…