nRF54H20 DK NOR flash (MX25UW6345G) won't write, reads JEDEC 0x000000 at boot

Hi, I'm experiencing flash write issues on an nRF54H20 DK's on-board NOR flash. I'm using ncs and toolchain v3.3.0.

Setup: the on-board MX25UW6345G on EXMIF, using the jedec,mspi-nor driver (flash_mspi_nor) over MSPI, board-default Octal at 50 MHz. I have it set up as a flash-disk + FATFS + USB MSC, and I'm using the flash shell to debug.

At boot the JEDEC read comes back as zeros:

[00:00:00.099] <err> flash_mspi_nor: JEDEC ID mismatch, read: 00 00 00, expected: c2 84 37
[00:00:00.100] <err> flashdisk: Flash area 0 open error -19
[00:00:00.100] <err> fs: fs mount error (-5)

and device list shows mx25uw6345g@0 (DISABLED).

The behavior is deterministic based on reset type:

  • After a soft/warm reset (west flash, reset button): JEDEC reads 00 00 00, device DISABLED.
  • After a full power cycle (both USB out, ~10 s): JEDEC reads fine, device shows READY.

Even when it comes up READY, writes do not stick:

uart:~$ flash test mx25uw6345g@0 0x0 0x1000 1
Erase OK.
Write OK.
Verification ERROR!
uart:~$ flash read mx25uw6345g@0 0x0 0x10
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

After an erase it reads back 00 instead of FF, and writes do not verify.

I reproduced the same thing with the stock zephyr/samples/drivers/spi_flash (unmodified, built for nrf54h20dk/nrf54h20/cpuapp with "west build -p -b nrf54h20dk/nrf54h20/cpuapp" and "west flash"), which prints:

mx25uw6345g@0: device not ready.

I have three DKs. The stock sample and my app work fine (Verify OK) on one of them, and show all of the above on the other two. It is consistent per board. All 3 boards worked with my app initially, and stopped after a few power cycles.

Relevant bits of my config for my custom app (the rest is unrelated). The MX25 node's jedec-id, sfdp-bfp, reset-gpios, mspi-io-mode, and mspi-max-frequency come from the board DTS and are unchanged.

Overlay:

&gpio6 { status = "okay"; };
&exmif { status = "okay"; };

&mx25uw63 {
    status = "okay";
    partitions {
        compatible = "fixed-partitions";
        #address-cells = <1>;
        #size-cells = <1>;
        nor_storage: partition@0 {
            label = "nor-storage";
            reg = <0x0 DT_SIZE_M(8)>;
        };
    };
};

/ {
    nor_disk: nor_disk {
        compatible = "zephyr,flash-disk";
        partition = <&nor_storage>;
        disk-name = "NOR";
        cache-size = <65536>;
    };
};

prj.conf (MSPI_DW and FLASH_MSPI_NOR are auto-selected by the enabled DT nodes):

CONFIG_FLASH=y
CONFIG_DISK_ACCESS=y
CONFIG_DISK_DRIVER_FLASH=y
CONFIG_FLASH_SHELL=y
CONFIG_FILE_SYSTEM=y
CONFIG_FAT_FILESYSTEM_ELM=y
CONFIG_FS_FATFS_LFN=y

Things I have already tried, with no change on the affected boards:

  • Full power-down with both USB cables removed
  • supply-gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; (as in the flash driver test overlay)
  • initial-soft-reset; (0x66/0x99), in single-line and Octal
  • mspi-io-mode Single vs Octal
  • Deferred flash init with a VCC settle delay before device_init()
  • Clearing the status-register block-protect bits (WREN + WRSR 0x00) at init
  • Stripping the wiring down to just the DK

A few questions:

  • What would make the JEDEC read return 00 00 00 after a soft reset but succeed after a full power cycle?
  • When it does come up READY, why would erase/write still fail to verify (it reads back 00 instead of FF after an erase)?
  • Is there a way to recover a device once it is in this state?
Related