配置 qspi flash 部分的 log 输出等级为 debug,查看完整日志
[C] 纯文本查看 复制代码 CONFIG_LOG=y
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_FLASH_LOG_LEVEL_DBG=y
这是我这边的 spi_flash 全部日志内容,测试位置改为了 0x1000
[C] 纯文本查看 复制代码 [00:00:00.000,000] <dbg> flash_stm32h7: stm32h7_flash_init: Flash initialized. BS: 32
[00:00:00.008,000] <dbg> flash_stm32h7: stm32h7_flash_init: Block 0: bs: 131072 count: 32
[00:00:00.016,000] <inf> flash_stm32_qspi: Reading SFDP
[00:00:00.022,000] <inf> flash_stm32_qspi: W25Q256: SFDP v 1.5 AP ff with 1 PH
[00:00:00.030,000] <inf> flash_stm32_qspi: PH0: ff00 rev 1.5: 16 DW @ 80
[00:00:00.037,000] <inf> flash_stm32_qspi: Reading SFDP
[00:00:00.042,000] <inf> flash_stm32_qspi: W25Q256: 32 MiBy flash
[00:00:00.049,000] <dbg> flash_stm32_qspi: spi_nor_process_bfp: Erase 4096 with 20
[00:00:00.057,000] <dbg> flash_stm32_qspi: spi_nor_process_bfp: Erase 32768 with 52
[00:00:00.065,000] <dbg> flash_stm32_qspi: spi_nor_process_bfp: Erase 65536 with d8
[00:00:00.073,000] <dbg> flash_stm32_qspi: spi_nor_process_bfp: Page size 256 bytes
[00:00:00.081,000] <dbg> flash_stm32_qspi: spi_nor_process_bfp: Flash size 33554432 bytes
[00:00:00.090,000] <dbg> flash_stm32_qspi: qspi_send_cmd: Instruction 0xb7
[00:00:00.097,000] <dbg> flash_stm32_qspi: qspi_send_cmd: CCR 0x1b7
[00:00:00.104,000] <inf> flash_stm32_qspi: Flash - address mode: 4B
[00:00:00.110,000] <inf> flash_stm32_qspi: Quad read mode 4 instr [0x6b] supported
[00:00:00.118,000] <inf> flash_stm32_qspi: Quad read mode 7 instr [0xeb] supported
[00:00:00.126,000] <inf> flash_stm32_qspi: Quad read mode 7 instr [0xeb] will be used
[00:00:00.134,000] <inf> flash_stm32_qspi: QE requirement mode: 4
[00:00:00.141,000] <inf> flash_stm32_qspi: Quad mode enabled
[00:00:00.147,000] <dbg> flash_stm32_qspi: setup_pages_layout: layout page 256 not compatible with erase size 4096
[00:00:00.158,000] <dbg> flash_stm32_qspi: setup_pages_layout: erase size will be used as layout page size
[00:00:00.168,000] <dbg> flash_stm32_qspi: setup_pages_layout: layout 8192 x 4096 By pages
[00:00:00.177,000] <dbg> flash_stm32_qspi: flash_stm32_qspi_init: Write Un-protected
[00:00:00.185,000] <inf> flash_stm32_qspi: NOR quad-flash at 0x90000000 (0x2000000 bytes)
*** Booting Zephyr OS build v4.2.0-2084-g0fe091bc4691 ***
W25Q256 SPI flash testing
==========================
SPI_FLASH_TEST_REGION_OFFSET = 0x1000, 4096
SPI_FLASH_SECTOR_SIZE = 0x1000, 4096
Perform test on single sector
Test 1: Flash erase
[00:00:00.215,000] <dbg> flash_stm32_qspi: qspi_send_cmd: Instruction 0x6
[00:00:00.222,000] <dbg> flash_stm32_qspi: qspi_send_cmd: CCR 0x106
[00:00:00.229,000] <dbg> flash_stm32_qspi: qspi_send_cmd: Instruction 0x20
[00:00:00.236,000] <dbg> flash_stm32_qspi: qspi_send_cmd: CCR 0x3520
Flash erase succeeded!
Test 2: Flash write
Attempting to write 4 bytes
[00:00:00.280,000] <dbg> flash_stm32_qspi: qspi_send_cmd: Instruction 0x6
[00:00:00.287,000] <dbg> flash_stm32_qspi: qspi_send_cmd: CCR 0x106
[00:00:00.294,000] <dbg> flash_stm32_qspi: qspi_write_access: Instruction 0x32
[00:00:00.302,000] <dbg> flash_stm32_qspi: qspi_write_access: CCR 0x3003532
Data read matches data written. Good!!
Perform test on multiple consecutive sectors
Test 1: Flash erase
[00:00:00.318,000] <dbg> flash_stm32_qspi: qspi_send_cmd: Instruction 0x6
[00:00:00.326,000] <dbg> flash_stm32_qspi: qspi_send_cmd: CCR 0x106
[00:00:00.332,000] <dbg> flash_stm32_qspi: qspi_send_cmd: Instruction 0x20
[00:00:00.340,000] <dbg> flash_stm32_qspi: qspi_send_cmd: CCR 0x3520
[00:00:00.378,000] <dbg> flash_stm32_qspi: qspi_send_cmd: Instruction 0x6
[00:00:00.385,000] <dbg> flash_stm32_qspi: qspi_send_cmd: CCR 0x106
[00:00:00.392,000] <dbg> flash_stm32_qspi: qspi_send_cmd: Instruction 0x20
[00:00:00.399,000] <dbg> flash_stm32_qspi: qspi_send_cmd: CCR 0x3520
Flash erase succeeded!
Test 2: Flash write
Attempting to write 4 bytes at offset 0x1000
[00:00:00.444,000] <dbg> flash_stm32_qspi: qspi_send_cmd: Instruction 0x6
[00:00:00.451,000] <dbg> flash_stm32_qspi: qspi_send_cmd: CCR 0x106
[00:00:00.457,000] <dbg> flash_stm32_qspi: qspi_write_access: Instruction 0x32
[00:00:00.465,000] <dbg> flash_stm32_qspi: qspi_write_access: CCR 0x3003532
Data read matches data written. Good!!
Attempting to write 4 bytes at offset 0x2000
[00:00:00.480,000] <dbg> flash_stm32_qspi: qspi_send_cmd: Instruction 0x6
[00:00:00.487,000] <dbg> flash_stm32_qspi: qspi_send_cmd: CCR 0x106
[00:00:00.494,000] <dbg> flash_stm32_qspi: qspi_write_access: Instruction 0x32
[00:00:00.501,000] <dbg> flash_stm32_qspi: qspi_write_access: CCR 0x3003532
Data read matches data written. Good!!

尝试读取状态寄存器来判断是否存在部分写保护的情况
WPS bit 位于状态寄存器3中,CMP bit 位于状态寄存器2中,TB、 BP3、 BP2、 BP1、 BP0 位于状态寄存器1中。
你的日志显示是在 0x1000 处发现擦除失败,也就是靠前的位置。
使用非易失性存储器的应用程序必须考虑到噪声和其他可能影响数据完整性的不利系统条件。为解决这一问题,W25Q256JV提供了多种方式来保护数据免受意外写入的影响。
 当VCC低于阈值时,器件复位
 上电后有延时写禁止功能
 写使能/禁止指令,以及擦除或编程后自动写禁止
 使用状态寄存器实现软件和硬件(/WP引脚)写保护
 用于阵列保护的额外独立块/扇区锁定
 使用掉电指令实现写保护
 状态寄存器的写保护锁定,直至下一次上电
 使用状态寄存器对阵列和安全寄存器进行一次性编程(OTP)写保护*
*注:此功能需特殊订购。详情请联系华邦电子。
在上电或掉电过程中,当VCC低于VWI的阈值时,W25Q256JV将保持复位状态(参见上电时序和电压电平以及图43)。在复位状态下,所有操作均被禁用,且不识别任何指令。上电期间,当VCC电压超过VWI后,所有与编程和擦除相关的指令会再被禁用一段延时tPUW。这包括写使能、页编程、扇区擦除、块擦除、芯片擦除和写状态寄存器指令。请注意,在电源上电期间,直到达到VCC最小值和tVSL延时之前,片选引脚(/CS)必须跟随VCC电源电平变化;在掉电时,它也必须跟随VCC电源电平变化,以防止出现不利的命令序列。如有需要,可在/CS引脚上使用上拉电阻来实现这一点。
上电后,器件会自动进入写禁止状态,状态寄存器的写使能锁存器(WEL)被设置为0。在页编程、扇区擦除、块擦除、芯片擦除或写状态寄存器指令被接受之前,必须先发出写使能指令。完成编程、擦除或写指令后,写使能锁存器(WEL)会自动清零,回到写禁止状态(0)。
通过写状态寄存器指令并设置状态寄存器保护(SRP、SRL)和块保护(CMP、TB、BP[3:0])位,可以实现软件控制的写保护。这些设置可将部分或整个存储阵列配置为只读模式。与写保护(/WP)引脚配合使用时,可在硬件控制下启用或禁用对状态寄存器的更改。有关更多信息,请参见状态寄存器部分。此外,掉电指令提供了额外级别的写保护,因为除释放掉电指令外,所有指令都将被忽略。
W25Q256JV还提供了另一种使用独立块锁定的写保护方法。每个64KB块(顶部和底部块除外,共510个块)以及顶部/底部块内的每个4KB扇区(共32个扇区)都配备有一个独立块锁定位。当锁定位为0时,相应的扇区或块可以被擦除或编程;当锁定位设置为1时,对相应扇区或块发出的擦除或编程命令将被忽略。器件上电时,所有独立块锁定位均为1,因此整个存储阵列都受到保护,防止被擦除/编程。必须发出“独立块解锁(39h)”指令才能解锁任何特定的扇区或块。
状态寄存器3中的WPS位用于决定应使用哪种写保护方案。当WPS=0(出厂默认值)时,器件仅使用CMP、TB、BP[3:0]位来保护阵列的特定区域;当WPS=1时,器件使用独立块锁定进行写保护。
不知道你是不是用的正点原子的这个 QSPI 例程,这个程序只是测试了存储空间的末尾的一小段,因为你的日志显示 0x1000 处发现擦除出问题了。因此也就需要通过检查状态寄存器来判断是否存在部分写保护的问题。
可以尝试更改这个程序进行全片或者部分的(至少是 0x1000 这个位置)的擦写读测试。而且一定要判断擦完后是否是 0xFF
最后还是没有办法的话,尝试更换一片新的 Flash
|