精华内容
下载资源
问答
  • Serial Flash Loader读写Flash存储芯片

    千次阅读 2016-08-17 20:54:10
    主要通过调用Quartus的ip核Serial Flash Loader对M25P16的擦除,写和读因为Serial Flash Loader没有仿真库,所以验证数据是否写入和读出正确时,这里采用Quartus 自带的SignalTap II 在线调试验证的先来看一下Serial ...

    主要通过调用Quartus的ip核Serial Flash Loader对M25P16的擦除,写和读

    因为Serial Flash Loader没有仿真库,所以验证数据是否写入和读出正确时,这里采用Quartus 自带的SignalTap II 在线调试验证的

    先来看一下Serial Flash Loader的调用
    这里写图片描述

    代码实现分为SPI和SPI_ctrl两个模块,Flash的擦除,写入,读写都在SPI_ctrl模块中,当然也可以单独分开,擦除,写入,读写各作为一个模块

    先来一下RTL视图吧
    这里写图片描述

    实现以3个按键消抖后分别控制擦除,写入,和读

    时序图:
    SE(擦除)
    这里写图片描述
    PP(页写入)
    这里写图片描述
    RD(读)
    这里写图片描述

    实现代码:

    1.按键模块

    //key_press 主要代码
    //当按键按下时经过消抖延时后 产生一个按下的脉冲标志key_in_flag 
    module  key_press(
                        input sclk,
                        input rst_n,
                        input key_in,
                        output reg key_in_flag
                        );
    //  .....
    always @(posedge sclk or negedge rst_n)
        if(rst_n ==1'b0)
            state <= IDLE;
        else begin 
            case(state)
                IDLE    :   if(key_neg_flag == 1'b1)
                                state <=PRE_FLAG;
                PRE_FLAG:   if(pre_end_10ms == 1'b1 && key_in == 1'b0)
                                state <=KEY_FLAG;
                            else if(pre_end_10ms == 1'b1 && key_in == 1'b1)
                                state <= IDLE;
                KEY_FLAG:   if(key_pos_flag == 1'b1)
                                state <= POST_FLAG;
                POST_FLAG:  if(post_end_10ms == 1'b1)
                                state <= IDLE;
                default : state <=IDLE;
            endcase
        end
    
        //key flag
        always @(posedge sclk or negedge rst_n)
        if(rst_n == 1'b0)
            key_in_flag <= 1'b0;
        else if(state == KEY_FLAG && key_cnt == END_20MS)
            key_in_flag <= 1'b1;
        else
            key_in_flag <= 1'b0;
    //.......
    endmodule

    2.SPI_ctrl模块

    module SPI_ctrl(
                    input clk,
                    input rst_n,
                    input key_se,
                    input key_wr,
                    input key_rd,
    
                    output reg CS_n,
                    output reg SCK,
                    output reg DATA_IN
                    );
    //-------------instruction------
        parameter 
                WR_Instru   = 8'h06,
                SE_Instru   = 8'hd8,
                PP_Instru   = 8'h02,
                RD_Instru   = 8'h03,
                ADDR        = 24'h000000,
                WR_DATA     = 8'h0f;//写一个byte为例
    //--------部分主要代码-------------
    //---------state ctrl falg ----------------------------------------
        wire wr_state_flag,se_state_flag,pp_state_flag,rd_state_flag;
        assign wr_state_flag = (state == WREN && cnt_sck == 7'd19)? 1'b1:1'b0;
        assign se_state_flag = (state == SE && cnt_sck == 7'd67)? 1'b1:1'b0;
        assign pp_state_flag = (state == PP && cnt_sck == 7'd83)? 1'b1:1'b0;
        assign rd_state_flag = (state == RD && cnt_sck == 7'd83)? 1'b1:1'b0;
    
        //---------en_sck ctrl flag ----------------------------------------
        wire en_sck_wr,en_sck_se,en_sck_pp,en_sck_rd;
        assign en_sck_wr = (state == WREN && cnt_sck == 7'd17)? 1'b1:1'b0;
        assign en_sck_se = (state == SE && cnt_sck == 7'd65) ? 1'b1:1'b0;
        assign en_sck_pp = (state == PP && cnt_sck == 7'd81) ? 1'b1:1'b0;
        assign en_sck_rd = (state == RD && cnt_sck == 7'd81) ? 1'b1:1'b0;
    //----------chip selection ctrl----------------------------------------
        always @(posedge clk or negedge rst_n)
        if(!rst_n)  
            CS_n <= 1'b1;
        else if(key_se || key_wr || key_rd || cnt_delay == 4'd15)
            CS_n <= 1'b0;   
        else if(wr_state_flag||se_state_flag||pp_state_flag||rd_state_flag)
            CS_n <= 1'b1;
        else 
            CS_n <= CS_n;
    
        //------------cs_n==0 cnt_sck++-----------------------------------------
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            cnt_sck <= 7'd0;
        else if(CS_n == 1'b0)
            cnt_sck <= cnt_sck + 1'b1;
        else 
            cnt_sck <= 7'd0;
    
        //-------------SCK signel en-----------------------------------------   
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            en_sck <= 1'b0;
        else if(cnt_sck == 7'd1)
            en_sck <= 1'b1;
        else if(en_sck_wr ||en_sck_se || en_sck_pp || en_sck_rd)
            en_sck <= 1'b0;
        else
            en_sck <= en_sck;
    
        //-----------SCK = ~SCK-----------------------------------------------
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            SCK <= 1'b0;
        else if((state == WREN||state == SE||state == PP || state == RD) && en_sck)
            SCK <= ~SCK;
        else
            SCK <= 1'b0;
    
        //-------------DATA_IN ctrl-------------------------------------------- 
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            data_wr <= WR_Instru;
        else if(state == WREN && en_sck == 1'b1 && SCK == 1'b0)
            data_wr <= {data_wr[6:0],data_wr[7]};
        else 
            data_wr <= data_wr;
    
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            data_se <= {SE_Instru,ADDR};
        else if(state == SE && en_sck == 1'b1 && SCK == 1'b0)
            data_se <= {data_se[30:0],data_se[31]};
        else 
            data_se <= data_se;
    
        //-------------DATA_IN------------------------------
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            DATA_IN <= 1'b0;
        else begin
            case(state)
                WREN    :   DATA_IN <= data_wr[7];
                SE      :   DATA_IN <= data_se[31];
                PP      :   DATA_IN <= data_pp[39];
                RD      :   DATA_IN <= data_rd[31];
                default :   DATA_IN <= 1'b0;
            endcase
        end
    
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            data_pp <= {PP_Instru,ADDR,WR_DATA};
        else if(state == PP && en_sck == 1'b1 && SCK == 1'b0)
            data_pp <= {data_pp[38:0],data_pp[39]};
        else 
            data_pp <= data_pp;
    
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            shift_flag <= 1'b0;
        else if(cnt_sck > 7'd0 && cnt_sck <= 7'd63)
            shift_flag <= 1'b1;
        else 
            shift_flag <= 1'b0;
    
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            data_rd <= {RD_Instru,ADDR};
        else if(state == RD && en_sck == 1'b1 && SCK == 1'b0 && shift_flag == 1'b1)
            data_rd <= {data_rd[30:0],data_rd[31]};
        else 
            data_rd <= data_rd;
    
        //------------key state choose flag-----------------------------------
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            key_se_flag <= 1'b0;
        else if(key_se)
            key_se_flag <= 1'b1;
        else if(se_state_flag)// SE state end
            key_se_flag <= 1'b0;
        else 
            key_se_flag <= key_se_flag;
    
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            key_wr_flag <= 1'b0;
        else if(key_wr)
            key_wr_flag <= 1'b1;
        else if(pp_state_flag)// PP state end
            key_wr_flag <= 1'b0;
        else 
            key_wr_flag <= key_wr_flag;
    
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            key_rd_flag <= 1'b0;
        else if(key_rd)
            key_rd_flag <= 1'b1;
        else if(rd_state_flag)// RD state end
            key_rd_flag <= 1'b0;
        else 
            key_rd_flag <= key_rd_flag;
    
        //-------------DELAY state keep------------------------------------------   
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            cnt_delay <= 4'd0;
        else if(state == DELAY)begin
            if(cnt_delay == 4'd15)
                cnt_delay <= 4'd0;
            else 
                cnt_delay <= cnt_delay + 1'b1;      
        end
        else 
            cnt_delay <= 4'd0;
    
        //-------------------state skip-----------------------------------------
        always @(posedge clk or negedge rst_n)
        if(!rst_n)
            state <= IDLE;
        else begin
            case(state)
                IDLE    :   if(CS_n == 1'b0 && key_rd_flag)
                                state <= RD;
                            else if(CS_n == 1'b0)
                                state <= WREN;
                            else 
                                state <= IDLE;
                WREN    :   if(CS_n == 1'b1)
                                state <= DELAY;
                            else 
                                state <= WREN;
                DELAY   :   if(CS_n == 1'b0 && key_se_flag)
                                state <= SE;
                            else if(CS_n == 1'b0 && key_wr_flag)
                                state <= PP;
                            else 
                                state <= DELAY;
                SE      :   if(CS_n == 1'b1)
                                state <= IDLE;
                            else
                                state <= SE;
                PP      :   if(CS_n == 1'b1)
                                state <= IDLE;
                            else
                                state <= PP;
                RD      :   if(CS_n == 1'b1)
                                state <= IDLE;
                            else
                                state <= RD;
                default :   state <= IDLE;
            endcase     
        end
    
    endmodule
    

    3.TOP模块
    //因为Serial Flash Loader使用的是专用引脚,所以这里不用设置输出

    module SPI(
                        input clk,
                        input rst_n,
                        input key_se,
                        input key_wr,
                        input key_rd
    
                        );
    
    //M25P16根据手可知最大达到 50 MHz SPI Bus Interface 
    //而手册中read data byte可知,a maximum frequency fR,读数据最大频率20Mhz
    //所以这里SCK信号是12.5MHz
    //比较简单的实现方法是:通过PLL对系统时钟进行分频得到25Mhz即可
    key_press key_se_inst(
                        .sclk(clk_25M),
                        .rst_n(rst_n),
                        .key_in(key_se),
                        .key_in_flag(key_se_flag)
                        );
    //....
    SPI_ctrl SPI_ctrl_inst(
                    .clk(clk_25M),
                    .rst_n(rst_n),
                    .key_se(key_se_flag),
                    .key_wr(key_wr_flag),
                    .key_rd(key_rd_flag),
    
                    .CS_n(CS_n),
                    .SCK(SCK),
                    .DATA_IN(DATA_IN)
                    );
    
        spi_flash   spi_flash_inst (
        .asdo_in ( DATA_IN ),
        .asmi_access_granted ( 1'b1 ),
        .dclk_in ( SCK ),
        .ncso_in ( CS_n ),
        .noe_in ( 1'b0 ),
        .asmi_access_request ( ),
        .data0_out (  )
        );
    

    因为Serial Flash Loader不能仿真验证,这里只对擦除,写入和读的时序进行仿真
    这里写图片描述

    时序达到要求后,进一步使用Signaltap验证是否准确写入和读出

    擦除验证
    这里写图片描述
    写入验证
    这里写图片描述
    读出验证
    这里写图片描述

    这里可以看到 DATA0_OUT的输出是’h0f 与我们写入的数据一致

    展开全文
  • Jlink使用技巧之烧写SPI Flash存储芯片

    万次阅读 2019-01-12 22:04:24
    前言 大多数玩单片机的人都知道Jlink可以烧写Hex文件,作为ARM仿真调试器,但是知道能烧写SPI Flash的人应该不多,本篇文章将介绍如何使用...要烧写程序或读取程序的的Flash芯片:SPI协议的Flash都可以,如W25Q128。...

    前言

    大多数玩单片机的人都知道Jlink可以烧写Hex文件,作为ARM仿真调试器,但是知道能烧写SPI Flash的人应该不多,本篇文章将介绍如何使用JLink来烧写或者读取SPI Flash存储器,JLink软件包含的工具中,有一个是JFlashSPI工具,这就是一个烧写和读取SPI存储器的工具了。

    准备

    • 要烧写程序或读取程序的的Flash芯片:SPI协议的Flash都可以,如W25Q128。
    • JFlashSPI软件工具:在Jlink系列软件的安装目录下
    • JLink V9仿真器
    • 要烧写的文件:如GBK字库文件,UNIGBK.BIN

    硬件连接

    Jlink内部集成了SPI协议,部分接口是作为SPI复用功能的,具体硬件连接,如下图所示:

    对于20P的标准JTAG接口

    引脚编号 名称 输入输出 和SPI Flash的连接
    5 DI 输入 连接SPI Flash的MOSI引脚
    7 nCS 输出 连接SPI Flash的CS引脚
    9 CLK 输出 连接SPI Flash的CLK引脚
    13 DO 输出 连接SPI Flash的MISO引脚

    对于10P的JTAG接口

    引脚编号 名称 输入输出 和SPI Flash的连接
    2 nCS 输出 连接SPI Flash的CS引脚
    4 CLK 输出 连接SPI Flash的CLK引脚
    6 DO 输出 连接SPI Flash的MISO引脚
    8 DI 输入 连接SPI Flash的MOSI引脚

    这里要注意的一点,正版的Jlink仿真器1脚是输入引脚,是外部提供参考电平的,但由于现在大部分的JLink仿真器都是学习(dao)版的,1脚不是输入,而是3.3v的输出,所以可以直接用这个管教来给SPI Flash供电。

    1.打开

    有两个工具,一个是JFlashSPI.exe是图形化工具,一个JFlashSPI_CL.exe是命令行操作,这里重点介绍图形化工具JFlashSPI,打开Jlink软件的安装目录,双击打开JFlashSPI,界面和之前介绍的JFlash差不太多。

    2.连接SPI Flash芯片

    点击Target->Connect,如果连接成功的话,会在底部输出连接信息,会显示Flash芯片的型号,生产厂家,Flash ID等等信息。

    就像我这个Flash芯片,丝印明明写的华邦Winbond W25Q128,这里读取的却是飞索Spansion S25FL128K,难道是盗版芯片?

    3.打开程序文件

    点击File->Open data file,打开要烧写的字库文件,支持多种格式的文件,由于是选择的Bin文件,没有起始地址,所以手动输入烧写的起始地址,这里填写0就可以了。关于烧写文件的格式说明,可以查看之前的一篇文章:BIN、HEX、AXF、ELF文件格式有什么区别

    4.下载

    点击Target->Auto下载程序到Flash芯片内。

    下载完成后,会在底部窗口显示下载成功的信息,可以看出烧写速度还是比较快的,170KB的字库文件,用时不到1秒钟。

    5.程序文件的读取

    和读写单片机程序一样,也是支持读取SPI Flash芯片程序的,为了尊重他人的劳动成果,这里的介绍仅供学习使用,不可用于商业破解目的。

    可以看出,和下载相比,读写速度明显要慢得多,因为是读取的整个16M的存储区,所以时间会相对长一些。

    6.程序文件的保存

    程序文件读取完成后,可选择将文件保存到本地目录,保存格式可根据需要选择。

    7.命令行工具的使用

    JFlashSPI_CL.exe是JFlashSPI的命令行工具,通过输入命令实现读写Flash,这里简单介绍一下烧写功能。
    在终端运行:./JFlashSPI_CL.exe
    可看到一些帮助信息,主要是指令的说明:

    可以看到-connect连接,-open打开烧写文件,-auto烧写,如果是烧写,这3个命令就够了,首先把要烧写的文件复制到JFlashSPI_CL.exe同级目录,输入指令:

    ./JFlashSPI_CL.exe -open UNIGBK.BIN 0 -connect -auto
    

    可以看到,烧写成功

    为了方便快捷,我们可以将以上命令写成一个批处理命令,直接双击运行即可,
    新建download.bat文件,并以记事本方式打开,输入以下内容

    JFlashSPI_CL.exe -open UNIGBK.BIN 0 -connect -auto
    echo 程序烧写完成!
    pause
    

    然后将这个bat文件和要烧写的字库文件放到一个文件夹下。双击直接运行就可以直接烧写,是不是方便了许多呢?

    支持的芯片列表

    支持的Flash芯片多达百种,如Atmel的AT25系列,国产兆易的GD25Q系列等等,基本上常见的SPI协议Flash芯片都支持,具体的芯片列表可查看SEGGER官方网址:List of supported SPI flashes

    速度说明

    对于不同型号的Flash芯片,Jlink烧写器最大的写入速度也不同,具体可参考:

    Flash device Programming speed1 Flash device Programming speed1
    ISSI IS25LP128 500 KB/s Micron N25Q128A 270 KB/s
    ISSI IS25LD040 100 KB/s Micron M25P10 160 KB/s
    ISSI IS25LQ080 340 KB/s Micron M25PX16 230 KB/s
    ISSI IS25CD010 100 KB/s Micron M45PE10 230 KB/s
    ISSI IS25CQ032 190 KB/s Micron M25PE4 215 KB/s
    Macronix MX25L3235E 285 KB/s Spansion S25FL128 410 KB/s
    Macronix MX66L1G45G 430 KB/s Spansion S25FL116K 265 KB/s
    Macronix MX66L51235F 315 KB/s Winbond W25Q128FV 340 KB/s

    参考资料:

    J-Flash SPI

    JLink软件的下载

    JLink_Windows_V614b软件下载链接:JLink_Windows_V614b.exe


    Jlink使用技巧系列文章:


    欢迎大家关注我的个人博客

    或微信扫码关注我的公众号

    展开全文
  • Flash存储芯片M25P16中文资料

    千次阅读 2014-04-14 11:24:21
     M25P16是一款带有先进写保护机制和高速SPI总线访问的2M字节串行Flash存储器,该存储器主要特点:2M字节的存储空间,分32个扇区,每个扇区256页,每页256字节;写入1页数据所需时间为1.4 ms(典型值);能单块擦除和...
    1、M25P16概述
        M25P16是一款带有先进写保护机制和高速SPI总线访问的2M字节串行Flash存储器,该存储器主要特点:2M字节的存储空间,分32个扇区,每个扇区256页,每页256字节;写入1页数据所需时间为1.4 ms(典型值);能单块擦除和整块擦除:2.7~3.6 V单电源供电电压;SPI总线和50 MHz数据传输时钟频率;每扇区擦写次数保证10万次、数据保存期限至少20年。该款器件特别适用于一体化打印机、PC主板、机顶盒、CD唱机和DVD视盘机、数字电视、数码相机、图形卡和平面显示器等各种应用的代码和数据存储需求。
        M25P16采用SO16封装或VDFPN8封装,其引脚排列图如图1与图2所示。其部分主要引脚功能描述如下:
        引脚Q:输出串行数据。
        引脚D:输入串行数据。
        引脚C:串行时钟信号输入。
        引脚S:片选,该引脚低电平有效。若为高电平,串行数据输出(Q)为高阻抗状态。
        引脚HOLD:控制端,暂停串行通信。在HOLD状态下,串行数据输出(Q)为高阻抗,时钟输入(C)和数据输入(D)无效。
        引脚W:写保护端,能够限制写指令和擦除指令的操作区域,低电平有效。
            
                          图1                                                图2
    2、单片机SPI接口与M25P16的连接图如图3
        
                                                 图3
    3、M25P16工作原理
        M25P16写入一个字节数据需写使能(WREN)和写入(PP)指令。采用这两个指令实现单页编程。对于某个单字节空间的操作,在使用PP指令之前需要对其擦除(FFh)。擦除操作可通过单块擦除指令(SE)和整块擦除(BE)来完成。擦除之前需要先执行WREN指令。当片选S信号为低电平,则选中该器件,此时处于有效电源模式;当片选S信号为高电平,器件未被选中,但能在所有内部指令周期(写入,擦除,写状态寄存器)完成前保持有效电源模式。等指令周期完成则进入备用电源模式。通过特殊指令来读取或设置状态寄存器内的状态位和控制位,实现相应操作。
        在该器件所有输入输出的指令、地址和数据中,数据置于首位。当片选信号被拉为低电平,在时钟信号的第一个下降沿开始采样数据输入信号。每个指令序列都是以单字节指令代码开头,紧接着就是地址或数据。在读取数据、快速读取数据、读状态寄存器、读标识和读电子签名时,数据输出序列紧随输入指令序列。当数据输出序列的所有数据位都输出后,片选信号置为高电平。而在页面数据写入、单块擦除、整块擦除、写状态寄存器、写使能和写无效时,片选信号必须在一个字节内置为高电平。否则,指令不执行。也就是说,拉低片选信号后,时钟信号必须是8的整数倍。在写状态寄存器周期、数据写入周期或者擦除周期,则忽略任何对存储空间的访问,并不会对这些周期产生影响。表l为M25P16的指令表。
       
                         表1

        (1)写使能(WREN) 写使能指令用于设置内部写使能锁存器位。在页面数据写入、单块擦除、整块擦除和写状态寄存器之前,必须先执行写使能。当片选信号拉低后,就开始执行写使能指令,接着传输指令。指令发送完后,片选信号置为高电平。写使能时序如图4所示。
       
                                      图4
        (2)读标识指令(RDID) 首先需将片选信号拉为低电平,接着写入读标识指令(RDID),然后通过数据输入引脚读入3字节标识码。片选信号置为高电平终止数据读取指令。时序如图5所示:
       
                                                    图5
        (3)读状态寄存器(RDSR)几乎在任何时刻都能读取状态寄存器的值,甚至器件处于写入数据、擦除或写状态寄存器周期时。此时建议在传输新指令之前应先检查WIP位。状态寄存器的格式如表2所示。
       
                                        表2
    表2中,WIP位能够确定存储空间是否处于写状态寄存器、写入或擦除周期。WIP为“1”时则处于以上几个周期。WEL位能够确定内部写使能锁存器的状态。写入“1”时置位。写入“0”时,写状态寄存器、数据写入和擦除指令都无效。BP2,BPl,BPO位确定软件写保护的区域大小,并且是非易失性的。SRWD位用于在写无效位和写保护引脚工作时可使该器件处于硬件保护模式。此模式下,3个非易失性位变为只读位,并且写状态寄存器指令不会执行。
        (4)读取数据(READ) 首先需将片选信号拉为低电平,接着写读取数据指令和3个字节的地址(A23~A0)。然后通过数据输出引脚(O)输出该地址存储内容。地址的首字节可以是任意值。在输出每个字节数据后,地址自动加1,跳至下一地址。因此,整个存储空间的数据读取可通过一个简单的数据读取指令(READ)完成。当达到最高地址时,地址计数器自动清零。片选信号置为高电平可终止数据读取指令(READ)。数据输出的任何时候,片选信号都置为高电平。该器件处于擦除或数据写入周期时,数据读取指令无效并且对当前周期无任何影响。其页面数据写入指令时序如图6所示。
       
                                                 图6
        (5)页面数据写入(PP)执行PP指令之前,必须先执行写使能指令。写使能指令解码后,器件设置为写使能锁存器。片选信号必须拉低,接着是PP指令代码、3字节的地址和数据输入(至少一个字节)。如果地址的低8位(A7~AO)不全是O而写入的数据字节超出当前页的地址,超出部分则从下一页首地址开始写入。在整个数据写入时序中,片选信号必须拉低。如果写入的数据字节数大于256,则先前所锁存的数据被丢弃。将数据正确写入之后便可核对状态寄存器WIP位的值。若为1,则表明处于自定时数据写入周期;若为0,则此周期完成。如果某一页受到块保护(BP2,BPl,BP0位),则不能执行对此页的数据写入操作。按照上述指令操作,能够获得驱动程序的流程图。图7为数据写入(PP)操作的程序流程。
       
                                                 图7
        (6)扇区擦除指令(SE) 首先发送写使能指令(WREN),接着发送扇区擦除指令(SE),然后写入需擦除扇区的3字节地址。时序如图8
       
                                     图8
        (7)整块擦除指令(BE) 首先发送写使能指令(WREN),接着发送整块擦除指令(BE),便可将芯片所有数据擦除,所有的字节数据都变为FF。时序如图9
       
                                  图9
    4、M25P16的读写驱动程序:
       具体的程序例子可参考: 基于STM8单片机的M25P16读写驱动程序
    展开全文
  • 几种flash存储芯片的用途和分类

    千次阅读 2019-06-18 17:28:00
    1、IIC EEPROM------容量小,采用的是IIC通信协议;...2、SPI NorFlash------容量略大,采用的是SPI 通信协议;用于存放程序和数据。程序和数据可存放在同一芯片上,拥有独立的数据总线和地址总线,...

    1、IIC EEPROM------容量小,采用的是IIC通信协议;用于在掉电时,存系统配置参数,比如屏幕亮度等。常用芯片型号有 AT24C02、FM24C02、CAT24C02等,其常见的封装多为DIP8,SOP8,TSSOP8等;

     

    2、SPI NorFlash------容量略大,采用的是SPI 通信协议;用于存放程序和数据。程序和数据可存放在同一芯片上,拥有独立的数据总线和地址总线,能快速随机读取,允许系统直接从Flash中读取代码执行;可以单字节或单字编程,但

      不能单字节擦除,必须以Sector为单位或对整片执行擦除操作。常见到的S25FL128、MX25L1605、W25Q64等型号都是SPI NorFlash。

     

    3、SPI NandFlash------采用了SPI NorFlash一样的SPI的通信协议,用于存储数据;在读写的速度上没什么区别,但在存储结构上却采用了与Parallel NandFlash相同的结构,所以SPI nand相对于SPI norFlash具有擦写的次数多,擦写速度快的优势。

     

    4、eMMC Flash------eMMC采用统一的MMC标准接口,eMMC相当于NandFlash+主控IC;自身集成MMC Controller,存储单元与NandFlash相同。常见到的KLMAG8DEDD、THGBMAG8B4JBAIM、EMMC04G-S100等型号都是eMMC Flash。

     

    5、SD卡------它在MMC的基础上发展而来,有两个可选的通信协议:SD模式和SPI模式。

    转载于:https://www.cnblogs.com/duwenqidu/p/11046441.html

    展开全文
  • Jlink烧写SPI Flash存储芯片(W25QXX)

    千次阅读 2019-08-21 10:46:00
    JLink支持SPI协议,可以使用JFlashSPI.exe来烧录SPI FLASH芯片。 JLink的20PIN管脚定义如下: 而SPI接口所使用的接口与JTAG是复用的。 管脚序号 JTAG定义 SPI定义 5 TDI MOSI 7 TMS NSS ...
  • 存储芯片介绍

    千次阅读 2018-09-06 16:15:36
    W25Q80是台湾华邦电子(Winbond)生产的8M-bit串列flash晶片。主要特性有: 工作电压:2.5 ~ 3.6 V 功耗:读写(active)时4mA,低功耗(power-down)时&lt;1μA 容量:8M-bit/1M-byte,包含4096个页(每页大小...
  • Flash存储W25Q16芯片

    万次阅读 2015-03-09 15:06:15
    25Q系列比普通的串行Flash存储器更灵活,性能更优越。基于双倍/四倍的SPI,它们能够可以立即完成提供数据给RAM,包括存储声音、文本和数据。芯片支持的工作电压2.7V到3.6V,正常工作时电流小于4mA,掉电时低于1uA。...
  • 据媒体报道指国产存储芯片企业长江存储已开发出128层的NAND flash存储芯片,这是当前国际存储芯片企业正在投产的NAND flash技术,意味着中国的存储芯片技术已达到国际领先水...
  • flash芯片测试

    2020-05-20 08:40:06
    flash操作不同于sram,sram类似于在使用ram ip核(quartus/vivado)时生成的模块直接对存储操作,flash操作都是基于控制器的指令来的。flash在编程(写数据)之前是需要对芯片擦除(也就是写1),因为编程操作只能把1...
  • 最近很多工程师朋友都来找到我们,问我们的SD NAND到底是怎样一款芯片,今天就什么是SD NAND来聊一聊。...大家知道目前主流的存储芯片大致可以分为NOR Flash和NAND Flash。容量需要大一点的话,就会用采用NAND ...
  • 提取Flash芯片信息

    2020-06-18 23:08:23
    Flash芯片  一、IICEEPROM  二、SPINorFlash  三、ParallelNorFalsh(CFIFlash)  四、ParallelNandFlash  五、SPINandFlash  六、eMMCFlash  七、USF2.0 0X03Flash芯片提取固件 一、物理环境 二、...
  • 最近有一个项目是 一个嵌入式系统设备。 功能:信号采集,数据存储,数据传输(USB+蓝牙)。 主控MCU:一个M0核的单片机; 由于需要存储的数据有点大(大概130MB)。...存储:一个256MB的 nand flash...
  • Flash芯片(硬盘)与RAM芯片(内存)存储信息的区别   1.Flash芯片(硬盘)  硬盘就是采用磁性物质记录信息的,磁盘上的磁性物质被磁化了就表示1,未被磁化就表示0,因为磁性在断电后不会丧失,所以磁盘断电后...
  • STM32笔记--芯片Flash容量

    千次阅读 2020-04-23 23:00:44
    STM32不仅有产品唯一身份标识寄存器可以读取身份证信息,还可以读取闪存容量寄存器获得芯片存储容量 STM32芯片容量分类 以F103系列为列,共区分为小容量、中容量、大容量三类产品 小容量产品是指闪存存储器...
  • flash存储原理

    千次阅读 2012-09-03 15:17:14
    norflash 带有 SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内容每一字节; nandflash器件使用复杂的IO口串行的存取数据,读写操作采用512字节的块(也就是读/写某个字节,...flash存储原理 一、半导体存
  • ECU中用到的存储芯片通常有三种:FLASH,RAM,EEPROM,很多人都分不清楚这三种芯片有什么区别,其实是很好理解的。FLASH是一次写入,掉电数据不消失,也就是说只能在刷程序的时候写一次,我们不能调用2E服务对其进行...
  • Flash存储的故事

    千次阅读 2018-11-05 18:10:06
    Flash存储系统由于其优异的性能、高效的存储密度和出色的节能特性使得Flash存储有望替代机械磁盘成为企业级存储的核心。未来很有可能所有的数据都会存储Flash存储介质上面,包括银行、中小企业、互联网、电信等...
  • 之前一直以为STM32flash空间大小和hex文件 相关,以为hex文件大小超过flas大小后程序就会 出问题但是我发现hex文件大于flash也可以正常 下载,有的程序也可以正常运行,有的不可以,所 以经过总结如下:...
  • C8051F的读写芯片FLASH的注意事项

    千次阅读 2011-04-26 16:51:00
    解决方案任何系统,它包含程序的写或擦除FLASH存储器涉及一些风险,FLASH写/擦除程序将执行如果CPU频率的外部或系统时钟其定义的工作范围VDD,温度,。我们的目标是尽量减少这种风险通过启用FLASH写和擦除尽可能少...
  • Flash 芯片类型介绍

    千次阅读 2019-04-28 20:35:09
    ** 一、 IIC EEPROM ** IIC EEPROM,采用的是 IIC 通信协议;...一种电可擦除可编程只读存储器,掉电后数据不丢失,由于芯片能够支持单字节擦写,且支持擦除 的次数非常之多,一个地址位可重复擦写...
  • 嵌入式开发中用到的存储RAM FLASH ROM

    千次阅读 2016-01-04 11:19:46
    RAM(Random AccessMemory)的全名为随机存取记忆体,它相当于PC机上的移动存储,用来存储和保存数据的。它在任何时候都可以读写,RAM通常是作为操作系统或其他正在运行程序的临时存储介质(可称作系统内存)。  ...
  • 这篇文章讲的是如何设置芯片使用FLASH的大小,比如新塘的芯片N76E003的FLASH大小只有18K,但是我需要一些空间存储一些别的信息,掉电不丢失,那么我就要把FLASH空间分成两部分,第一部分用作存储代码,第二部分用作...
  • Flash ROM: SST39VF1601 数据位宽为16位(16根数据线);20根地址线;2M(1M*16bit)。 Ⅱ SDRAM: HY57V641620HG 数据位宽为16位(16根数据线);12根地址线(行地址选择线有12根,列地址选择线有8根(12根的低8...
  • arduino使用SPIFlash库 读写Flash芯片

    千次阅读 2018-02-03 08:59:57
    SPIFlash库 – SPI华邦电子闪存Flash芯片arduino库 GITHUB 工程地址:SPIFlash 该库是用于华邦串行闪存芯片的库。目前的形式支持识别闪存芯片和它的各种功能;自动地址分配管理;在不同位置读写数据类型bytes/chars/...
  • Flash芯片的通病

    千次阅读 2014-12-14 20:53:27
    1. Flash芯片存储的通病之一:Erase Before Overwrite 对于机械磁盘来说,磁盘可以直接用磁头将对应的区域磁化成任何信号,如果之前保存的数据是1,新数据还是1,则磁头对1磁化,结果还是1;如果新数据是0,则...
  • Flash存储控制器组成!(flash

    千次阅读 2018-11-10 17:26:49
    Flash存储控制器(Flash Memory Contoller.FMC)包括AHB从接口、Cacte存储控制器、Boot Loader、Flash控制寄存器、Flash初始化控制器、Flash操作控制器和片上Flash存储器。Flash 存储控制器框图如下图所示。   ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,690
精华内容 11,476
关键字:

存储芯片flash