net22 FPGA flash

SPI时序支持两种模式  

两个标志位  CPOL  CPHA

CPOL 0 CPHA 0 (都为0的状态) 时钟来临之前是0  最后是0

CPOL 1 CPHA 1 (都为1的状态) 上升沿来临之前是高电平,然后变为低电平。最后一个时钟结束的时候为高。

在案例中使用 0 0的比较多(在使用SPI总线的时候要先看是支持0 0模式还是 1 1 模式) 
 
 
扇区擦除(sector erase)和全擦除(bulk erase)
 

CS_N(S):为片选线,为fpga的输出信号,flash的输入信号,低电平有效

SCK(c):时钟线,为FPGA的输出信号,Flash的输入信号,flash根据该信号的上升沿锁存sdi发来的数据,根据该信号 的下降沿通过sdo输出数据

Sdi(D):数据线,为FPGA的输出信号,flash的输入信号,fpga可通过sdi的总线串行的传输数据到flash  

Sdo(Q):数据线,为FPGA的输出信号,flash的输入信号,FLASH 可通过 SDO 的总线串行的传输数据到 FPGA

falsh数据线有 1 根的 也有 2 根 的  输入 输出 一起使用的

 

把数据写入flash需要先把要写入的区域进行擦除,且擦除的标准是固定的,不能想擦除多大就擦除多大。

当写入数据到flash的时候,只能把flash里边的存储单元里边的1改变成0。也就是说写数据的时候只能把1改成0。所以需要在写入之前需要通过(SE)擦除的指令把flash的存储单元都变成1的状态 。

 

M25P16的flash芯片 最大时钟频率50Mhz  此处我们进行擦除时用12.5Mhz

32个扇区  每个扇区256页,每页256个字节   256X256=65536字节/1024=64K  

 

最小的一次能写入的数据量是1页(页写功能),一页包含256个字节(byte。所以最低的是8位地址线。11111_1111=256

再大一个级别是扇区,每个扇区包含256页(page),【相当于比页还大的区域】

不同的falsh存储空间不同,包含扇区不同,扇区地址不同。

需要23位地址线加上扩展的1bit地址线一共24bit地址线  24...16 扇区地址  15...8 页地址  7...0 字节地址

 

 

falsh的擦除分为扇区擦除,全擦除。

扇区擦除:只擦除扇区。

全擦除:擦除整片flash。

 

 在擦除之前会执行一个写使能指令(WREN),就是让我们去配置里边的寄存器,使得这里边能被写,能被操作。需要单独去发送,发送之后才能执行扇区擦除。当扇区擦除执行完之后,写使能寄存器会自动复位,又进入到非写使能状态。所以在每次进行SE指令前都要执行写使能指令。

 

flash根据sck的上升沿锁存sdi的数据,因此sdi的每一位最好都能被sck的上升沿采集到的稳定的时刻(sdi 的中间位置对着sck的上升沿时最稳定)。 

 

写使能指令:先把cs_n置为低,在确定sdi数据被锁存(8'h06)结束后,就可以将cs_n拉高。

写使能指令 8'h06 (flash芯片手册上查)   WREN结束后,为了保证WREN被FLASH存储,因此cs_n拉高的时间至少需要100ns

之后再次拉低cs_n为发送SE指令做准备。首先拉低cs_n,然后发送SE指令D8h,以及3个byte的地址位。由于是扇区擦除,给出的地址位只有高8位有效(扇区地址),低16位(页地址,字节地址)无论何值 都对该扇区的擦除没有影响。在给出最后一位byte地址位后,确保被选中的扇区可以被擦除,cs_n至少3秒高电平状态。

 

flash有状态寄存器可以读取现在擦除的状态,但是这样我们写的代码量会比较大。所以一般使用延时计数来去判断是否擦除完毕。

 

在给出最后1byte地址位后,确保被选中的扇区可以被擦除,cs_n需要至少3秒高电平的状态   等一会

 

写的时候  计数 0~8   9位  让cs做扩展 bit计数时让cs再晚一个bit 9个bit  确保不会因时钟掩盖之类的(0 0状态下sdi最后为0 没有这个写不进去)

 

可以把sdi赋值给移位寄存器,通过移位寄存器的方式把sdi时序生成出来。

 

 

 

ise: creat prom file界面,ise impact 固化程序,要的是mcs文件

固化mcs文件,直接就烧到flash上?不用写么?

 

 

 

 

 

 

页写功能(page program【简称PP】)

和擦除一样,执行页写功能之前需要执行写使能(WRITE EN)操作,执行完PP后写使能自动复位,每次执行页写之前都得先执行写使能操作。

页写 就要对页地址位进行操作,先是24位的页地址,后面是1~256字节的8位数据。

需要发送共 256X8+32=2080 bit数据。PP指令1字节,地址3字节,数据256字节,cs_n为低的冗余周期,共260*8+1个bit周期。0~2079。

执行页写的数据是在执行页写PP指令之前就需要把256字节的一页数据缓存到ram或者fifo缓冲器中,当pp_flag到来就可以从缓冲器中读取有个字节数据发送一个字节,知道1个页数据发送完毕。

位数太多,读取每个数据都要 rd_fifo_en就很麻烦,要找规律,因为是8bit数据 为1000,所以每次加 8 的话低 3 位数据不改变,所以以此为规律,当第三位为特定值的时候拉高 rd_fifo_en。

 

仿真  task gendata;  taskend

 

 

 

 

 

读控制器

READ DATA BYTE 读数据指令  简称RDB指令,指令码为8'h03,读指令可以读取flash地址空间的任何一个byte数据,不受扇区,页的限制。

读数据时只需要给出读命令即可,不需要像SE,PP先给出写使能  

posted @   涛大林  阅读(312)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示