W25N01GV 驱动

最近在项目中用到 W25N01GV 这颗芯片。它是华邦公司的大容量 SPI 接口 Nand Flash,有 1Gbit (128M Bytes)大小,价格也不高。但是在网上找了很久也没找到相关的驱动代码。比较容易找到的是 W25Q128,或 W25Q256 的代码。

比如正点原子的代码里有 STM32F429 驱动 W25Q256 的代码。
http://www.openedv.com/thread-13912-1-1.html

正点原子阿波罗STM32F429开发板资料
https://pan.baidu.com/s/1qYWqGA4

还有这篇在 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。
两种模式可以用过命令切换。

4. 写入数据分两步:1. 先把数据传入芯片内部的 2048 字节 RAM 缓冲区。比如通过 Quad Program Data Load (32h) 指令装载数据。 2 执行 Program Execute (10h)。如果只执行第一步,不执行第二步,数据还可以从缓冲区读出来。但是掉电后数据就没有了。

5. 在执行 Block Erase,Program Execute 等命令前要先执行 Write Enable (06h) 指令,否则指令不起作用。

下面的代码尚未优化,当前运行在比较低的频率上。实现了擦除,和读写操作。

W25N01G Demo Code

 

0

发表评论