要对Flash进行读写操作,应使用W25Q128的指令系统,由MCU向芯片输出指令与参数,再由芯片返回相应的数据。由于使用了SPI接口,数据按位传输。完成一个字节传输后,再发送下一个字节。有些指令是单字节指令,有些指令必须附加参数,会有好几个字节,因此MCU往Flash发送指令时也要按照W25Q128的指令表发送数据,标准SPI指令表如表9-4所示。
指令表中Byte1列是指令编码,之后的Byte2、Byte3等列是指令参数,比如第一个指令Write Enable(写使能)是单字节指令,后面无指令参数。再比如指令Read Data(读字节)是一个5字节指令,指令编码是03h,Byte2~Byte4为读取的Flash目标单元地址,地址有24位,Byte5为读取的数据,数据长度为8位(1个字节)。表中的Dummy是任意数的意思,以A字母开头的代表地址的含义,以D字母开头的代表数据的含义,以S字母开头的代表状态的含义,以MF字母开头的代表厂家的含义,以ID字母开头的代表身份码的含义,比如W25Q128的产品的ID是0xEF4018。移位时按MSB在前的模式输出。
表9-4 W25Q128 SPI指令表
注:带括号的数据代表从设备发生的数据。
除了标准的SPI指令外,W25Q128还有DUAL与QUAD SPI指令集。这些指令集可以极大地增加Flash的读写效率。相对来说,这些增强指令集的字节数比标准SPI指令的长度要长。本项目旨在学习SPI的使用方法,因此使用标准SPI指令即可。对于具体的指令集,读者可以查阅W25Q128数据手册。
光看指令表还不足以掌握如何使用该Flash,读者可查阅相关数据手册。对于其中一条最常见的指令Read Data,读者可以查阅W25Q128数据手册找到时序图,通过对时序图的分析,掌握一般SPI器件的使用方法。图9-8为Read Data指令时序图。
图9-8 Read Data指令时序图
首先,CS引脚要在低电平时才进入有效通信状态,时钟CLK有模式0或者模式3,因此使用了虚线表示模式3,这并不影响解读时序关系。
W25Q128的DI端口有第一个字节数据到达,字节内容为03h,即MCU的MOSI端输出第一个字节03h。查阅指令表可知,03h代表Read Data指令,这时W25Q128解析该指令,等着接收余下的三个地址单元地址,而这段时间DO端输出高阻状态。
其次,DI接收由MCU的MOSI端发过来的三个字节,即A23~A0的24位目标单元地址,由于W25Q128已经识别了Read Data的指令,DO端仍然相应连续输出24个时钟的高阻状态。
W25Q128接收完24位地址后,从该地址读出数据(1个字节),将该数据存放到输出缓冲区,在DO端移位输出。DI端口处于接收状态,即使MCU的MOSI有数据传入W25Q128,也不产生任何影响。(www.xing528.com)
细心的读者可以发现指令表中没有写数据指令,只写了状态寄存器的指令。这是因为W25Q128的128M位被组织为65536个可编程的页(page),每页256 Bytes。要对W25Q128写入数据,必须按页操作。哪怕只想写入一个字节,也必须将256个字节一起写入。
页编程指令允许将1~256字节写入存储器的某一页,而这一页必须是被擦除过的(也就是只能写0,不能写1,擦除时全写为1),这是由NOR Flash特性决定的。
可以查阅到指令表中有Page Program,该指令的时序图如图9-9所示。
图9-9 Page Program时序图
首先拉低端的电平,使之处于通信有效状态,然后在DI上传输指令代码02h,接着传输24位的地址,再接着要传输的数据至少为一个字节,当要写入多个字节时,在24位地址后添加多个字节即可。
如果一次写一整页数据(256字节),最后的地址字节(A7~A0)应该全为0。如果最后8位字节地址不为0,但是要写入的数据长度超过页剩下的长度,那么芯片会回到当前页的开始地址写入数据。写入的数据少于256字节时,对页内的其他数据没有任何影响。对于这种情况的唯一要求是,时钟数不能超过剩下页的长度。如果一次写入多于256字节的数据,那么在页内会往回写,先前写的数据会被覆盖。
前面介绍了进行页编程前页必须是被擦除过的。在指令表中我们可以找到三条有关擦除的指令:Sector Erase(4KB)、Block Erase(32KB)与Block Erase(64KB)。W25Q128将16M字节的容量分成了256个块(Block),每个块大小为64K字节,每个块又分为16个扇区(Sector),每个扇区4K个字节,即4096个字节。使用这三条指令,可对4KB、32KB、64KB容量进行擦除操作。Sector Erase指令时序图如图9-10所示。DI输入02h的指令代码后跟随3个字节24位的地址,完成扇区擦除。
图9-10 Sector Erase指令时序图
器件的所有指令执行都需要时间,在芯片处理指令的过程中,状态寄存器的BUSY位=1。当BUSY=1时,芯片不接受其他指令。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。