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仿真模型文件)相关推荐

  1. 痞子衡嵌入式:串行NOR Flash的页编程模式对于量产效率的影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是串行NOR Flash的页编程模式对于量产效率的影响. 任何嵌入式产品最终都绕不开量产效率话题,尤其是对于主控是非内置 Flash 型 ...

  2. 串行 spi Flash 跨页编程的注意点

    spi Flash 进行 page program的时候,编程的数据为1-256个字节不等.在Datasheet中,如果编程的数据为256个字节,那么,输入的起始地址需要256个字节对齐,即需要页对齐 ...

  3. WEB编程开发常用的代码[转]

    转自:http://blog.csdn.net/goaler/archive/2005/01/13/251090.aspx 1. ASP与Access数据库连接: dim conn,mdbfile  ...

  4. 知识库递归编程java和prolog代码;逻辑语言Prolog简介(附24555字PDF发“递归prolog简介”下载)

    知识库递归编程java和prolog代码:逻辑语言Prolog简介(附24555字PDF发"递归prolog简介"下载) 数据简化DataSimp 今天 数据简化DataSimp导 ...

  5. FLASH模拟EEPROM编程

    单片机内存FLASH模拟EEPROM编程 一,简述 很多单片机本身是没有自带EEPROM,但是一般具有在应用编程(IAP:In Application Programming)功能,可以把它的内存FL ...

  6. nand flash (k9f5608)驱动编程

    nand flash (k9f5608)驱动编程 1.nand flash的引脚 nand flash比较重要的几个引脚如下 I/O引脚:对于该款flash芯片I/O引脚有8个0-7,有的芯片有16个 ...

  7. 电脑识别指令和代码的原理

    电脑识别指令和代码的原理 一.前言 电脑代bai码,就du是让电脑执行的命令.可以让电脑执行相应zhi的命令.就电脑本身底层代码所言就dao是0和1,或者说二进制码.十六进制等等.还有汇编.C.C++ ...

  8. 嵌入式编程C语言提高代码效率的14种方法

    嵌入式编程C语言提高代码效率的14种方法 1.在可能的情况下使用typedef替代define.当然有时候你无法避免define,但是typedef更好. typedef int* INT_PTR; ...

  9. MCS-51单片机的指令时序

    时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍.状态.机器周期和指令周期,接下来我们分别加以说明. ·节拍与状态: 我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示),振荡 ...

最新文章

  1. 使用lua实现一个简单的事件派发器
  2. 三目运算符 改变a标签的class属性
  3. 2.4 梯度下降法-深度学习-Stanford吴恩达教授
  4. 国内外NLP领域学术界和工业界的牛人和团队
  5. AV1为何有信心打败H.265?
  6. 连续子数组的最大和python_连续子数组的最大和
  7. Treap树堆(bzoj 3224: Tyvj 1728 普通平衡树)
  8. Spring AOP(二)之AfterReturning增强处理
  9. mysql数据库中文选什么数据类型_Mysql 数据类型及选择原则
  10. js混淆还原工具_JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
  11. 市场上主要的PB系统提供商简介
  12. 数字图像处理:图像直方图基础知识介绍
  13. 微信开发如何屏蔽投诉按钮(附代码)
  14. 频域法分析系统详解及个人笔记
  15. DNS这位“翻译官”是如何转换域名和IP地址的?
  16. 开源免费录屏和直播软件OBS Studio教程(01)
  17. 制作像UberEats和Deliveroo这样的移动应用程序需要多少钱
  18. 关于阴影映射的那些事,shadow acne(阴影失真)和peter panning(阴影悬浮)
  19. java example使用_关于通用 Mapper Example 使用记录
  20. 隔壁女邻居半夜睡不着,我用python给她写了一个

热门文章

  1. DES和RSA加密解密实例
  2. ubuntu滚动屏幕长截屏,截取整个网页
  3. 学会向上管理,4个提问技巧,让你事半功倍
  4. JAVA潜心修炼五天——第4天
  5. javascript百炼成仙 第一章 掌握JavaScript基础1.4数据类型
  6. unity画一条流动的弧线(贝塞尔线)
  7. 警惕,贡献商业源码入群!专门针对程序员的一种网络诈骗!
  8. Hrbust 1837 Dream【dp】
  9. BugkuCTF-Crypto题python_jail
  10. arm oe linux gnueabi 系统,OpenCV ARM移植(交叉编译opencv) arm-oe-linux-gnueabi-gcc编译opencv3.1.0...