最近在项目中用到 W25N01GV 这颗芯片。它是华邦公司的大容量 SPI 接口 Nand Flash,有 1Gbit (128M Bytes)大小,价格也不高。但是在网上找了很久也没找到相关的驱动代码。比较容易找到的是 W25Q128,或 W25Q256 的代码。
还有这篇在 Xilinx 公司的 XC6SLX45-2CSG324 上驱动 W25Q128BV 的代码 ( 作者 jgliu )。写的很详细。
https://www.cnblogs.com/liujinggang/p/9651170.html
但是 W25N01GV 这颗芯片的指令和 W25Q128/256 还是有不少区别的。下面的代码是在 jgliu 的代码的基础上移植的,在 Altera 的 Cyclone V + W25N01GVxxIG上调试通过了。下面总结一些需要注意的要点:
1. SPI 的信号线最好加 1k 上拉电阻, 实测发现 W25N01GV 这颗芯片的驱动能力比较弱。在调试的时候这可能发生误导,因为 BUSY = 0 时表明命令执行完毕,实际上是读回来的虚假低电平。
2. Protection Register / Status Register-1 (Volatile Writable, OTP lockable) 此寄存器上电后的默认值是 0b01111100,也就是说 Flash 处于写保护状态。我们需要用 Write Status Register (1Fh/01h) 这条指令清除写保护。 否则擦写指令不起作用。
3. 要注意两个型号的区别
W25N01GVxxIG, 默认 BUF = 1, 处于 Buffer Read Mode。
W25N01GVxxIT, 默认 BUF = 0,处于 Continous Read Mode。
两种模式可以用过命令切换。