上两篇都是对串行flash的介绍,我们的主角FPGA还没有登场。大家如果看了前两篇关于串行flash的介绍,这么多的命令,这么多的操作,需要有一根主线把他们串起来,这根主线应该就是FPGA中的状态机。
本设计采用的SO管脚作为忙状态信号的方式,整个操作分为2组状态机,第一组位于底层,主要控制flash各命令时序的产生;第二组位于第一组的上层,控制flash各个操作对应的命令流。
首先介绍控制flash各命令时序产生的状态机,该状态机包括所有命令的所有状态,如表1所示。
表1
符号 |
名称 |
功能 |
IDLE |
空闲 |
无任何操作进行的状态 |
CMD |
命令传输 |
向flash发送8bits命令的状态,不同的命令发送不同的命令字 |
ADDR_H |
高位地址 |
向flash发送8bits高位地址的状态 |
ADDR_M |
中间地址 |
向flash发送8bits中间地址的状态 |
ADDR_L |
低位地址 |
向flash发送8bits低位地址的状态 |
DUMMY |
地址填充位 |
向flash发送8bits地址填充位的状态 |
REG_DATA |
读状态寄存器数据 |
从flash读取状态寄存器数据的状态 |
ID_DATA |
读芯片ID数据 |
从flash读取芯片ID的状态 |
RX_DATA |
接收数据 |
从flash存储单元读取数据的状态 |
TX_DATA |
发送数据 |
向flash存储单元写入数据的状态 |
AAI_TX_ DATA_H |
AAI word编程高位字节数据 |
在AAI word编程模式下,向flash存储单元写入高8位数据的状态 |
AAI_TX_ DATA_L |
AAI word编程低位字节数据 |
在AAI word编程模式下,向flash存储单元写入低8位数据的状态 |
AAI_TEMP |
AAI word数据传输间隔 |
在AAI word编程模式下,数据传输的间隔,在此间隔状态下,需判断SO管脚电平,SO为0表示忙,1表示空闲,在空闲状态下可进行下一次双字节数据的写入。 |
AAI_TX_ CMD |
AAI word数据传输过程中的命令字 |
在AAI word编程模式下,在进行下一个双字节数据的传输前,需要传输8bits的AAI word编程命令。 |
DONE |
传输完成 |
传输完成 |
对应于flash操作的各个命令(参见第二篇),其状态机过程如表2所示。
表2
命令 |
命令字 |
状态机跳转过程 |
读操作(25Mhz) |
8'h03 |
IDLE - CMD - ADDRH/M/L - RX_DATA - DONE |
高速读操作(50MHz) |
8'h0b |
IDLE - CMD - ADDRH/M/L - DUMMY - RX_DATA - DONE |
扇区擦除 |
8'h20 |
IDLE - CMD - ADDRH/M/L - DONE |
32K字节块擦除 |
8'h52 |
IDLE - CMD - ADDRH/M/L - DONE |
64K字节块擦除 |
8'hb8 |
IDLE - CMD - ADDRH/M/L - DONE |
芯片擦除 |
8'h60 或8'hc7 |
IDLE - CMD - DONE |
Byte编程 |
8'h02 |
IDLE - CMD - ADDRH/M/L - TX_DATA - DONE |
AA word编程 |
8'had |
IDLE - CMD - ADDRH/M/L - AAI_TX_DATA_H - AAI_TX_DATA_L - AAI WAIT - AAI_TEMP - CMD - AAI_TX_DATA_H - AAI_TX_DATA_L - AAI WAIT - AAI_TEMP - CMD - AAI_TX_DATA_H - AAI_TX_DATA_L - AAI WAIT - AAI_TEMP - DONE |
读状态寄存器 |
8'h05 |
IDLE - CMD - REG_DATA - DONE |
使能写状态寄存器 |
8'h50 |
IDLE - CMD - DONE |
写状态寄存器 |
8'h01 |
IDLE - CMD - TX_DATA - DONE |
写使能 |
8'h06 |
IDLE - CMD - DONE |
写去使能 |
8'h04 |
IDLE - CMD - DONE |
读ID |
8'h90 或8'hab |
IDLE - CMD - ADDRH/M/L - ID_DATA - DONE |
JEDEC读ID |
8'h9f |
IDLE - CMD - RX_DATA - DONE |
使能SO作为忙状态信号 |
8'h70 |
IDLE - CMD - DONE |
去使能SO作为忙状态信号 |
8'h80 |
IDLE - CMD - DONE |
下面介绍控制flash读写操作对应命令流的状态机,该命令流默认前一次命令操作完成,总线空闲。flash命令集请参见第一篇的表3。
执行一次写操作(包括Byte编程和AAI word编程模式)需执行的命令流为:
WREN:写使能;
EWSR:使能写状态寄存器;
WRSR:写状态寄存器,将BPL位置为0;
WREN:写使能;
Sector/Block/Chip erase:擦除操作,在写入前必须对相应的存储区域进行擦除;
WREN:写使能;
EBSY:使能SO作为忙状态信号;
Byte/AAI word program:Byte编程和AAI word编程模式;
DBSY:去使能SO作为忙状态信号;
WRDI:写去使能。
执行一次读操作(包括25MHz和50MHz的读模式)可直接发送相应的读命令和读地址,无需配合其他命令。
以上是FPGA控制串行flash的主线,欢迎各位高手大牛指正。如果您想了解设计的细节部分,欢迎留言,我会尽力作答。
另外我手头上有串行flash和SRAM数据通讯的源代码,哦,你想要啊?你想要啊?你想要说清除就行了嘛。你想要的话我会给你的,你想要我当然不会不给你的,不可能你说要我不给你,你说不要我却偏要给你,大家讲道理嘛。现在我数三下,你要说清楚你到底要不要。要的话就留言吧,对了还要留下你的邮箱。
另外的另外,请允许我抒发一下感情。这段代码是我在没有任何借鉴的情况下死磕出来的,唯一的参考就是FLASH芯片和SRAM芯片的datasheet。期间遇到了许多问题,也是凭着一股死磕的劲把一个一个问题搞定了,我可以保证这段代码是经过仿真和板级验证过的。技术就是通过不断的分享和交流才能进步,希望这段代码能对您的工作学习有帮助,也欢迎各位大牛能提出改进建议!如果您能为我的博文投上一票,将是对我的劳动成果的鼓励,也是对死磕、分享和交流精神的鼓励,谢谢!
用户377235 2016-6-14 11:30
用户448088 2016-1-5 22:52
用户406627 2016-1-4 10:57
用户406627 2016-1-4 10:54
用户377235 2015-11-13 12:34
用户894053 2015-10-11 21:28
用户1851029 2015-10-8 11:40
用户1756156 2015-10-5 14:39
楼主辛苦了,求发一下代码,1206901571@qq.com
用户1845900 2015-9-30 16:29
用户1856179 2015-9-30 09:12