Cannot find SPI Flash Memory IC matching iCE40LP Requirements

2026-05-09

Stack Overflow: View Question

Tags: fpga, circuit, ice40

Score: 0 | Views: 44

The asker is selecting a configuration PROM for an iCE40LP4K-CM121. Lattice's programming and configuration guide states the SPI flash "must be ready to accept commands 10µs after meeting its power-on conditions." Every SPI NOR flash they've checked specifies a power-up-to-ready time (typically called tVSL or tPU) of 100µs at minimum, often 10ms. They're stuck — even Lattice's own breakout boards seem to use parts that don't meet this 10µs spec.

Why this is interesting: It's a great example of a datasheet "requirement" that, on inspection, doesn't reflect how the silicon actually behaves. Anyone building a real iCE40 board hits this and panics. Reconciling the docs with what every reference design actually does requires understanding the FPGA's boot state machine, not just the timing tables.

The resolution: The 10µs figure is the worst-case window in which the iCE40 starts polling — it isn't a hard timeout that bricks the boot. In SPI master mode (SPI_SS_B tied appropriately), the iCE40 issues a 0xAB Release-Power-Down / Read-ID command and then a 0x03 Read at address 0. If the flash NACKs or returns garbage because it's still in its power-up reset, the FPGA simply re-reads. The configuration logic tolerates a flash that wakes up later than 10µs because the read of the bitstream header byte 0x7E won't match until valid data appears. Lattice's own AN can be read this way; their reference designs use Winbond W25Q-series and Macronix MX25 parts with 100µs+ power-up times, and they work.

Practical approach:

Gotchas: (1) The flash must support the 0x03 Read opcode at clock speeds the iCE40 generates during boot (~25MHz default; some "high-speed only" parts require 0x0B Fast Read with a dummy byte and won't boot). (2) Power sequencing matters more than wake-up time — if VCCIO_2 rises slowly, the FPGA may begin configuration before the flash has stable I/O. (3) Don't share the config SPI bus with another master unless you tri-state during boot.

The challenge: A datasheet number that looks like a hard requirement is actually a polling-window detail, and the "right" answer is to ignore it and rely on the FPGA's retry behavior — which only the reference designs make obvious.

All newsletters