Wow, yesterday I had zero solutions, and now I have two! Thank you!Are you sure these are good Flash defaults?
It looks like some kind of Dual mode.
The default after boot is Quad Mode Continuous (it uses only suffix 0xA0), and can see it in the capture below:
XIP-QSPI.png
First, yesterday I tried pulling the IO pins up to 3v3 through 2.2k resistors (which of course breaks flashing new firmware). That actually helped! Although it is a hardware workaround, and I do not like it, even if I replace them with smd ceramics. This is strictly a last fallback fix.
So today I investigated the issue with dual mode - for some reason the Pico SDK launches my flash in dual mode by default (no idea why). And after switching to quad, the hanging problem completely disappeared! I still have no solid theory on how exactly two pins with high impedance were affecting dual mode, but they were clearly messing something up.
Now nothing hangs anymore. At frequencies above 200 MHz I see data-validity issues, but that is not nearly as bad as full hangs (and theoretically fixable).
Thanks a lot — this was extremely non-obvious! And it saves my project!
Here are the current working parameters at 150 MHz:
Code:
Flash: Timings (M0): COOLDOWN = 1 PAGEBREAK = 2 SELECT_SETUP = 0 SELECT_HOLD = 0 MAX_SELECT = 0 MIN_DESELECT = 7 RXDELAY = 2 CLKDIV = 3 Read Format (M0): DTR = 0 DUMMY_LEN = 0 SUFFIX_LEN = 2 PREFIX_LEN = 1 DATA_WIDTH = 1 SUFFIX_WIDTH = 1 ADDR_WIDTH = 1 PREFIX_WIDTH = 0 Read Command (M0): PREFIX = 0xBB SUFFIX = 0x0 Write Format (M0): DTR = 0 DUMMY_LEN = 0 SUFFIX_LEN = 0 PREFIX_LEN = 1 DATA_WIDTH = 0 SUFFIX_WIDTH = 0 ADDR_WIDTH = 0 PREFIX_WIDTH = 0 Write Command (M0): PREFIX = 0x2 SUFFIX = 0xA0PSRAM: Timings (M1): COOLDOWN = 1 PAGEBREAK = 2 SELECT_SETUP = 0 SELECT_HOLD = 2 MAX_SELECT = 5 MIN_DESELECT = 8 RXDELAY = 2 CLKDIV = 1 Read Format (M1): DTR = 0 DUMMY_LEN = 6 SUFFIX_LEN = 0 PREFIX_LEN = 1 DATA_WIDTH = 2 SUFFIX_WIDTH = 2 ADDR_WIDTH = 2 PREFIX_WIDTH = 2 Read Command (M1): PREFIX = 0xEB SUFFIX = 0x0 Write Format (M1): DTR = 0 DUMMY_LEN = 0 SUFFIX_LEN = 0 PREFIX_LEN = 1 DATA_WIDTH = 2 SUFFIX_WIDTH = 2 ADDR_WIDTH = 2 PREFIX_WIDTH = 2 Write Command (M1): PREFIX = 0x2 SUFFIX = 0x0PSRAM Testing on mode: QSPI Fast mode: Current frequency test (150000 KHz): [OK][DMA OK, W: 54.01 MB/s, R: 44.16 MB/s] --- Frequency test 25000 KHz: [OK][DMA OK, W: 8.01 MB/s, R: 6.15 MB/s] Frequency test 50000 KHz: [OK][DMA OK, W: 15.82 MB/s, R: 12.14 MB/s] Frequency test 75000 KHz: [OK][DMA OK, W: 25.86 MB/s, R: 20.48 MB/s] Frequency test 100000 KHz: [OK][DMA OK, W: 35.17 MB/s, R: 28.21 MB/s] Frequency test 133000 KHz: [OK][DMA OK, W: 47.19 MB/s, R: 38.46 MB/s] Frequency test 150000 KHz: [OK][DMA OK, W: 54.01 MB/s, R: 44.16 MB/s] Frequency test 200000 KHz: [OK][DMA OK, W: 72.28 MB/s, R: 58.97 MB/s] Frequency test 225000 KHz: [OK][DMA OK, W: 81.62 MB/s, R: 61.77 MB/s] Frequency test 250000 KHz: [OK][DMA OK, W: 90.69 MB/s, R: 68.64 MB/s] Frequency test 300000 KHz: [OK][DMA OK, W: 63.73 MB/s, R: 52.94 MB/s] --- Safe mode: Current frequency test (150000 KHz): [OK][DMA OK, W: 51.05 MB/s, R: 42.12 MB/s] --- Frequency test 25000 KHz: [OK][DMA OK, W: 7.58 MB/s, R: 5.59 MB/s] Frequency test 50000 KHz: [OK][DMA OK, W: 14.97 MB/s, R: 11.02 MB/s] Frequency test 75000 KHz: [OK][DMA OK, W: 24.33 MB/s, R: 19.62 MB/s] Frequency test 100000 KHz: [OK][DMA OK, W: 33.21 MB/s, R: 27.15 MB/s] Frequency test 133000 KHz: [OK][DMA OK, W: 44.85 MB/s, R: 36.90 MB/s] Frequency test 150000 KHz: [OK][DMA OK, W: 51.06 MB/s, R: 42.13 MB/s] Frequency test 200000 KHz: [OK][DMA OK, W: 68.21 MB/s, R: 56.64 MB/s] Frequency test 225000 KHz: [OK][DMA DATA MISMATCH][DMA OK, W: 76.97 MB/s, R: 59.59 MB/s] Frequency test 250000 KHz: [OK][DMA DATA MISMATCH][DMA OK, W: 85.53 MB/s, R: 66.22 MB/s] Frequency test 300000 KHz: [FAILED][DMA DATA MISMATCH][DMA OK, W: 103.81 MB/s, R: 80.24 MB/s]Statistics: Posted by nightrain912 — Tue Nov 25, 2025 10:30 am