目录
目录
1. 需求分析
预实现功能:按键控制实现读芯片ID操作、读芯片存储数据操作及写入数据操作
2. 模块划分
a. 需要使用按键控制,采用按键消抖模块
b. 对于flash读写操作,为清晰逻辑,分为读操作模块、写操作模块及读写控制模块
c. 由于需要与M25P16实现通信,所以需要SPI接口模块
d. 最终需要显示读写相关数据,采用动态数码管显示模块
模块划分框图如图2.1。
图2.1 模块框图
3. 主要原理概述
(1)SPI(见SPI前文,详情点击链接)
(2)M25P16(本系统所用知识点,详情点击链接)
a. 概述
- 可同时编程1-256 byte
- 一共32个扇区(sector),256 page/sector,256 byte/page
图3.1 M25P16逻辑图
表3.1 信号名
Serial Data Output (Q)
在串行时钟的下降沿,输入的数据data被串行地输出。
Serial Data Input (D)
输入数据可以是命令、地址或数据,在串行时钟的上升沿被锁存。
Serial Clock (C)
串行时钟为接口提供时序,命令、地址或数据在时钟上升沿被锁存,在时钟下降沿之后,输出数据Q改变。
Chip Select (S)
片选信号S为高时,flash未被选中,数据输出端Q为高阻态,除非内部编程擦除或写状态寄存器时,其处于待机模式,片选信号S为低时,flash处于激活状态。
Hold (HOLD)
保持信号用于在片选信号S为低时,取消flash与其他任何设备之间的通信。
Write Protect (W)
写保护信号的主要目的是冻结受编程或删除命令保护的内存区域。
b. SPI模式
支持SPI两种通信模式:
模式0:CPOL = 0,CPHA = 0;
模式3:CPOL = 1,CPHA = 1;
图3.2 SPI模式0、模式3时序
即M25P16:上升沿接收数据,下降沿数据改变
注意:Mode0模式的前8个Sclk周期之内,从机只能接收主机发送的数据,不能向主机发送数据,之后的时钟周期之内,从机和主机之间可以进行全双工通信,可以用于主机先向从机发命令,然后从机接收到命令后再向主机返回数据。
(3)命令
a. 读ID(RDID)
作用 :读取芯片ID;
Code:8’h9f
时序:
使用方法:1字节命令+3字节芯片ID
b. 读数据(READ)
作用 :读取芯片对应地址数据;
Code:8’h03
时序 :
使用方法:1字节命令+3字节地址+1字节以上数据
c. 写使能(WREN)
作用 :写操作之前发送写使能命令,进行写使能锁存,执行写使能被锁存才能进行相关写操作(SE/PP等);
Code:8’h06
时序:
使用方法:1字节命令+延时至少100ns
d. 扇区擦除(SE)
作用 : 擦除对应扇区数据全为1(FF),PP之前必须先擦除;
Code:8’hd8
时序:
使用方法:1字节命令+3字节地址+延时至少3s
e. 读状态寄存器(RDSR)
作用 :读取状态寄存器;
Code:8’h05
时序:
使用方法:1字节命令+至少1字节状态寄存器状态数据+延时至少100ns
状态寄存器格式
WIP bit :“正在写入”(WIP)位指示内存是忙于写入状态寄存器、编程或擦除周期。当设置为1时,这样的循环正在进行,当重置为0时,没有这样的循环正在进行。
WEL bit :写入使能锁存器(WEL)位表示内部写入使能锁存器的状态。当设置为1时,内部写使能锁存设置,当设置为0时,内部写使能锁存重置,不接受写状态寄存器、编程或擦除命令。
BP2, BP1, BP0 bits :块保护(BP2、BP1、BP0)位是非易失性的。它们定义了要被软件保护的区域的大小,以防止编程和擦除命令的使用。这些位是用写状态寄存器(WRSR)命令写入的。当块保护(BP2、BP1、BP0)位设置为1时,相关内存区域。不受页面编程(PP)和扇区擦除(SE)命令的保护。在没有设置硬件保护模式的情况下,可以写入块保护(BP2、BP1、BP0)位。当且仅当两个块保护(BP2、BP1、BP0)位均为0时,才执行批量擦除(BE)命令。
SRWD bit :状态寄存器写入禁用(SRWD)位与写入保护(W)信号一起操作。状态寄存器写禁用(SRWD)位和写保护(W)信号允许设备处于硬件保护模式(当状态寄存器写禁用(SRWD)位设置为1,并且写保护(W)被驱动为低)。在此模式下,状态寄存器(SRWD、BP2、BP1、BP0)的非易失性位变成只读位,而写状态寄存器(WRSR)命令不再被接受执行。
f. 页编程(PP)
作用:通过将擦除位全1状态的对应地址中的1翻转位0来写入响应的数据;
Code:8’h02
时序:
使用方法:1字节命令+3字节地址+至少1字节写入数据+延时至少5ms
(4)时钟
写时钟最大支持50MHz,读时钟最大支持20MHz,本设计基于FPGA芯片EP4CE6F17C8,时钟频率50MHz,为便于实现功能及提升满足读写时钟要求,本设计采用芯片时钟的16分频(4、8等皆可)。
4. 相关参数定义
//******************flash m25p16 命令参数***************************
`define WREN 8'h06 //写使能
`define WRDI 8'h04 //写设备ID
`define RDID 8'h9f //读设备ID
`define RDSR 8'h05 //读状态寄存器
`define WRSR 8'h01 //写状态寄存器
`define READ 8'h03 //读数据
`define FAST_READ 8'h0b //高速读数据
`define PP 8'h02 //页编程
`define SE 8'hd8 //扇区擦除
`define BE 8'hc7 //块擦除
`define DP 8'hb9 //深度断电
`define RES 8'hab //释放(from 深度断电 和 阅读电子签名)
//地址参数
`define INIT_ADDR 24'h01 //读写操作首地址
//************************字节参数定义*******************************
//max: 1字节命令 + 3字节地址或ID + 256字节数据(256 bytes/page)
//spi_interface
`define MUX_BIT 4'd7 //spi接口模块每次传输一个字节(8bit)数据 8-1
//flash_read
`define RDID_BYTES 9'd3 //命令字节 + 3字节ID 4-1
`define RDDATA_BYTES 9'd6 //命令字节 + 3字节地址 + 至少1字节数据(>=5) 7-1
//flash_write
`define WREN_BYTES 9'd0 //命令字节 1-1
`define SE_BYTES 9'd3 //命令字节 + 3字节地址 4-1
`define RDSR_BYTES 9'd1 //命令字节 + 3字节数据(状态寄存器)2-1
`define PP_BYTES 9'd6 //命令字节 + 3字节地址 + 至少1字节数据(>=5) 7-1
//**************************时间参数********************************
//flash_write
`define TIME_CMD 27'd9 //片选信号拉高后至少持续100ns才能执行下一个命令 200/20 - 1
//`define TIME_PP 27'd249_999 //页编程周期时间 5ms
`define TIME_PP 27'd249 //仿真专用
//`define TIME_SE 27'd149_999_99 //扇区擦除周期时间 3s
`define TIME_SE 27'd149 //仿真专用
//spi_interface
//分频时钟参数 由于读操作最大只支持20MHz,所以需要对50MHz进行分频 读写操作统一使用该时钟
`define FREQUENCY 5'd15 //16分频 16-1
`define SCLK_FALL 5'd3 //下降沿 16/4 - 1
`define SCLK_RISE 5'd11 //上升沿 16/4*3 - 1
ps:按键控制模块及数码管显示模块非本设计主部分暂不赘述。