您的位置:首页 > 汽车 > 时评 > 网站建设教程_设计素材网站都是有哪几个_搜索引擎广告形式有哪些_广州搜发网络科技有限公司

网站建设教程_设计素材网站都是有哪几个_搜索引擎广告形式有哪些_广州搜发网络科技有限公司

2025/1/6 17:10:33 来源:https://blog.csdn.net/weixin_42880082/article/details/143019240  浏览:    关键词:网站建设教程_设计素材网站都是有哪几个_搜索引擎广告形式有哪些_广州搜发网络科技有限公司
网站建设教程_设计素材网站都是有哪几个_搜索引擎广告形式有哪些_广州搜发网络科技有限公司

浅谈针对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) ;//CSswitch(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) ;//CScmd.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=1W25qxx_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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com