FLASH(M25P16)-页编程(PP)指令时序代码及仿真波形(内含M25P16仿真模型文件)
PP指令
pp是页编程指令:需要先打开写使能(0000_0110),发送PP指令号(0000_0010),后面给24位地址,然后接数据,时序图发送如下图所示。
PP指令时序代码
//页编程(PP)指令:打开写使能,给PP命令,给24位地址,后面接数据
module flash_pp (input wire clk,input wire rst_n,output reg flash_cs_n,output reg flash_scl,output reg flash_d,input wire flash_q,output reg q
);localparam WREN = 8'h06;localparam PP = 8'h02;localparam T_half = 5;localparam ADDR = 24'h123456;always @ (posedge clk) q <= flash_q;reg [9:0] cnt;always @ (posedge clk) beginif (rst_n == 0)cnt <= 0;else if (cnt == 501)cnt <= cnt;elsecnt <= cnt + 1'b1;endalways @ (*) beginif (rst_n == 0) begin flash_cs_n = 1;flash_scl = 0;flash_d = 0;endelsecase (cnt)0 : begin flash_cs_n = 1;flash_scl = 0;flash_d = 0;end1 : begin flash_cs_n = 0;flash_d = WREN[7];end1 + T_half * 1 : begin flash_scl = 1;end1 + T_half * 2 : begin flash_scl = 0;flash_d = WREN[6];end1 + T_half * 3 : begin flash_scl = 1;end1 + T_half * 4 : begin flash_scl = 0;flash_d = WREN[5];end1 + T_half * 5 : begin flash_scl = 1;end1 + T_half * 6 : begin flash_scl = 0;flash_d = WREN[4];end1 + T_half * 7 : begin flash_scl = 1;end1 + T_half * 8 : begin flash_scl = 0;flash_d = WREN[3];end1 + T_half * 9 : begin flash_scl = 1;end1 + T_half * 10 : begin flash_scl = 0;flash_d = WREN[2];end1 + T_half * 11 : begin flash_scl = 1;end1 + T_half * 12 : begin flash_scl = 0;flash_d = WREN[1];end1 + T_half * 13 : begin flash_scl = 1;end1 + T_half * 14 : begin flash_scl = 0;flash_d = WREN[0];end1 + T_half * 15 : begin flash_scl = 1;end1 + T_half * 16 : begin flash_scl = 0;flash_cs_n = 1;end//写使能打开,正好是8个scl1 + T_half * 17 : begin flash_scl = 1;end1 + T_half * 18 : begin flash_scl = 0;end1 + T_half * 19 : begin flash_scl = 1;end1 + T_half * 20 : begin flash_scl = 0;flash_d = PP[7];flash_cs_n = 0;end1 + T_half * 21 : begin flash_scl = 1;end1 + T_half * 22 : begin flash_scl = 0;flash_d = PP[6];end1 + T_half * 23 : begin flash_scl = 1;end1 + T_half * 24 : begin flash_scl = 0;flash_d = PP[5];end1 + T_half * 25 : begin flash_scl = 1;end1 + T_half * 26 : begin flash_scl = 0;flash_d = PP[4];end1 + T_half * 27 : begin flash_scl = 1;end1 + T_half * 28 : begin flash_scl = 0;flash_d = PP[3];end1 + T_half * 29 : begin flash_scl = 1;end1 + T_half * 30 : begin flash_scl = 0;flash_d = PP[2];end1 + T_half * 31 : begin flash_scl = 1;end1 + T_half * 32 : begin flash_scl = 0;flash_d = PP[1];end1 + T_half * 33 : begin flash_scl = 1;end1 + T_half * 34 : begin flash_scl = 0;flash_d = PP[0];end1 + T_half * 35 : begin flash_scl = 1;end1 + T_half * 36 : begin flash_scl = 0;flash_d = ADDR[23];end //addr231 + T_half * 37 : begin flash_scl = 1;end1 + T_half * 38 : begin flash_scl = 0;flash_d = ADDR[22];end //addr221 + T_half * 39 : begin flash_scl = 1;end1 + T_half * 40 : begin flash_scl = 0;flash_d = ADDR[21];end //addr211 + T_half * 41 : begin flash_scl = 1;end1 + T_half * 42 : begin flash_scl = 0;flash_d = ADDR[20];end //addr201 + T_half * 43 : begin flash_scl = 1;end1 + T_half * 44 : begin flash_scl = 0;flash_d = ADDR[19];end //addr191 + T_half * 45 : begin flash_scl = 1;end1 + T_half * 46 : begin flash_scl = 0;flash_d = ADDR[18];end //addr181 + T_half * 47 : begin flash_scl = 1;end1 + T_half * 48 : begin flash_scl = 0;flash_d = ADDR[17];end //addr171 + T_half * 49 : begin flash_scl = 1;end1 + T_half * 50 : begin flash_scl = 0;flash_d = ADDR[16];end //addr161 + T_half * 51 : begin flash_scl = 1;end1 + T_half * 52 : begin flash_scl = 0;flash_d = ADDR[15];end //addr151 + T_half * 53 : begin flash_scl = 1;end1 + T_half * 54 : begin flash_scl = 0;flash_d = ADDR[14];end //addr141 + T_half * 55 : begin flash_scl = 1;end1 + T_half * 56 : begin flash_scl = 0;flash_d = ADDR[13];end //addr131 + T_half * 57 : begin flash_scl = 1;end1 + T_half * 58 : begin flash_scl = 0;flash_d = ADDR[12];end //addr121 + T_half * 59 : begin flash_scl = 1;end1 + T_half * 60 : begin flash_scl = 0;flash_d = ADDR[11];end //addr111 + T_half * 61 : begin flash_scl = 1;end1 + T_half * 62 : begin flash_scl = 0;flash_d = ADDR[10];end //addr101 + T_half * 63 : begin flash_scl = 1;end1 + T_half * 64 : begin flash_scl = 0;flash_d = ADDR[9];end //addr91 + T_half * 65 : begin flash_scl = 1;end1 + T_half * 66 : begin flash_scl = 0;flash_d = ADDR[8];end //addr81 + T_half * 67 : begin flash_scl = 1;end1 + T_half * 68 : begin flash_scl = 0;flash_d = ADDR[7];end //addr71 + T_half * 69 : begin flash_scl = 1;end1 + T_half * 70 : begin flash_scl = 0;flash_d = ADDR[6];end //addr61 + T_half * 71 : begin flash_scl = 1;end1 + T_half * 72 : begin flash_scl = 0;flash_d = ADDR[5];end //addr51 + T_half * 73 : begin flash_scl = 1;end1 + T_half * 74 : begin flash_scl = 0;flash_d = ADDR[4];end //addr41 + T_half * 75 : begin flash_scl = 1;end1 + T_half * 76 : begin flash_scl = 0;flash_d = ADDR[3];end //addr31 + T_half * 77 : begin flash_scl = 1;end1 + T_half * 78 : begin flash_scl = 0;flash_d = ADDR[2];end //addr21 + T_half * 79 : begin flash_scl = 1;end1 + T_half * 80 : begin flash_scl = 0;flash_d = ADDR[1];end //addr11 + T_half * 81 : begin flash_scl = 1;end1 + T_half * 82 : begin flash_scl = 0;flash_d = ADDR[0];end //addr01 + T_half * 83 : begin flash_scl = 1;end1 + T_half * 84 : begin flash_scl = 0;flash_d = 1;end //byte[0]1 + T_half * 85 : begin flash_scl = 1;end1 + T_half * 86 : begin flash_scl = 0;flash_d = 0;end //byte1[1]1 + T_half * 87 : begin flash_scl = 1;end1 + T_half * 88 : begin flash_scl = 0;flash_d = 1;end //byte1[2]1 + T_half * 89 : begin flash_scl = 1;end1 + T_half * 90 : begin flash_scl = 0;flash_d = 1;end //byte1[3]1 + T_half * 91 : begin flash_scl = 1;end1 + T_half * 92 : begin flash_scl = 0;flash_d = 0;end //byte1[4]1 + T_half * 93 : begin flash_scl = 1;end1 + T_half * 94 : begin flash_scl = 0;flash_d = 0;end //byte1[5]1 + T_half * 95 : begin flash_scl = 1;end1 + T_half * 96 : begin flash_scl = 0;flash_d = 1;end //byte1[6]1 + T_half * 97 : begin flash_scl = 1;end1 + T_half * 98 : begin flash_scl = 0;flash_d = 0;end //byte1[7] 正常pp指令后面可以接256byte,这里只写了1byte1 + T_half * 99 : begin flash_scl = 1;end1 + T_half * 100 : begin flash_scl = 0;flash_cs_n = 1;end //cs_n拉高default : ; endcaseend
endmodule
PP指令仿真代码
`timescale 1ns/1ps
module flash_pp_tb;reg clk;
reg rst_n;wire flash_cs_n;
wire flash_scl;
wire flash_d;wire flash_q;wire q;flash_pp flash_pp_inst(.clk (clk),.rst_n (rst_n),.flash_cs_n (flash_cs_n),.flash_scl (flash_scl),.flash_d (flash_d),.flash_q (flash_q),.q (q)
);m25p16 m25p16_inst(.c (flash_scl),.data_in (flash_d),.s (flash_cs_n),.w (1'b1),.hold (1'b1),.data_out (flash_q)
);initial clk = 1;
always # 10 clk = ~clk;initial beginrst_n = 0;#201rst_n = 1;repeat (500)@ (posedge clk);#200$stop;
end
endmodule
PP指令仿真图
完整工程:https://download.csdn.net/download/weixin_42263208/12890377
M25P16仿真模型文件:https://download.csdn.net/download/weixin_42263208/12889963
FLASH(M25P16)-页编程(PP)指令时序代码及仿真波形(内含M25P16仿真模型文件)相关推荐
- 痞子衡嵌入式:串行NOR Flash的页编程模式对于量产效率的影响
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是串行NOR Flash的页编程模式对于量产效率的影响. 任何嵌入式产品最终都绕不开量产效率话题,尤其是对于主控是非内置 Flash 型 ...
- 串行 spi Flash 跨页编程的注意点
spi Flash 进行 page program的时候,编程的数据为1-256个字节不等.在Datasheet中,如果编程的数据为256个字节,那么,输入的起始地址需要256个字节对齐,即需要页对齐 ...
- WEB编程开发常用的代码[转]
转自:http://blog.csdn.net/goaler/archive/2005/01/13/251090.aspx 1. ASP与Access数据库连接: dim conn,mdbfile ...
- 知识库递归编程java和prolog代码;逻辑语言Prolog简介(附24555字PDF发“递归prolog简介”下载)
知识库递归编程java和prolog代码:逻辑语言Prolog简介(附24555字PDF发"递归prolog简介"下载) 数据简化DataSimp 今天 数据简化DataSimp导 ...
- FLASH模拟EEPROM编程
单片机内存FLASH模拟EEPROM编程 一,简述 很多单片机本身是没有自带EEPROM,但是一般具有在应用编程(IAP:In Application Programming)功能,可以把它的内存FL ...
- nand flash (k9f5608)驱动编程
nand flash (k9f5608)驱动编程 1.nand flash的引脚 nand flash比较重要的几个引脚如下 I/O引脚:对于该款flash芯片I/O引脚有8个0-7,有的芯片有16个 ...
- 电脑识别指令和代码的原理
电脑识别指令和代码的原理 一.前言 电脑代bai码,就du是让电脑执行的命令.可以让电脑执行相应zhi的命令.就电脑本身底层代码所言就dao是0和1,或者说二进制码.十六进制等等.还有汇编.C.C++ ...
- 嵌入式编程C语言提高代码效率的14种方法
嵌入式编程C语言提高代码效率的14种方法 1.在可能的情况下使用typedef替代define.当然有时候你无法避免define,但是typedef更好. typedef int* INT_PTR; ...
- MCS-51单片机的指令时序
时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍.状态.机器周期和指令周期,接下来我们分别加以说明. ·节拍与状态: 我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示),振荡 ...
最新文章
- 使用lua实现一个简单的事件派发器
- 三目运算符 改变a标签的class属性
- 2.4 梯度下降法-深度学习-Stanford吴恩达教授
- 国内外NLP领域学术界和工业界的牛人和团队
- AV1为何有信心打败H.265?
- 连续子数组的最大和python_连续子数组的最大和
- Treap树堆(bzoj 3224: Tyvj 1728 普通平衡树)
- Spring AOP(二)之AfterReturning增强处理
- mysql数据库中文选什么数据类型_Mysql 数据类型及选择原则
- js混淆还原工具_JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
- 市场上主要的PB系统提供商简介
- 数字图像处理:图像直方图基础知识介绍
- 微信开发如何屏蔽投诉按钮(附代码)
- 频域法分析系统详解及个人笔记
- DNS这位“翻译官”是如何转换域名和IP地址的?
- 开源免费录屏和直播软件OBS Studio教程(01)
- 制作像UberEats和Deliveroo这样的移动应用程序需要多少钱
- 关于阴影映射的那些事,shadow acne(阴影失真)和peter panning(阴影悬浮)
- java example使用_关于通用 Mapper Example 使用记录
- 隔壁女邻居半夜睡不着,我用python给她写了一个
热门文章
- DES和RSA加密解密实例
- ubuntu滚动屏幕长截屏,截取整个网页
- 学会向上管理,4个提问技巧,让你事半功倍
- JAVA潜心修炼五天——第4天
- javascript百炼成仙 第一章 掌握JavaScript基础1.4数据类型
- unity画一条流动的弧线(贝塞尔线)
- 警惕,贡献商业源码入群!专门针对程序员的一种网络诈骗!
- Hrbust 1837 Dream【dp】
- BugkuCTF-Crypto题python_jail
- arm oe linux gnueabi 系统,OpenCV ARM移植(交叉编译opencv) arm-oe-linux-gnueabi-gcc编译opencv3.1.0...