Norflash读写擦除驱动

                                                          本文叙述S29GL256P90_NOR_FLASH的驱动问题


前言:

      Norflash地址线和数据线分开,来了地址和控制信号,数据就出来。Norflash闪存是随机存储介质,用于数据量较小的场合。Flash编程原理都是只能将1写为0,而不能将0写成1.所以在Flash编程之前,必须将对应的块擦除,而擦除的过程就是将所有位都写为1的过程,块内的所有字节变为0xFF.因此可以说,编程是将相应位写0的过程,而擦除是将相应位写1的过程,两者的执行过程完全相反.

Norflash 256内存图如下:

可查看扇区地址


1.Norflash芯片ID的读取

          查看Norflash芯片官方手册,读取ID所需要的命令如图


主要代码如下:

typedef  unsigned  short  Uint16;


Uint16  chip_id  =  0;


*((Uint16 *)base_addr  +  0x555)  = 0xAA;   //write unlock  cycle 1

*((Uint16 *)base_addr  +  0x2AA) = 0x55;   //write unlock  cycle  2

*((Uint16 *)base_addr   +  0x555) = 0x90;   //write autoselect  command


chip_id  =  *((Uint16 *)base_addr  +  0x000);    //read chip  ID


*((Uint16 *)base_addr  + 0x123)  =  0xF0;     //exit   and  write reset  command (复位命令的偏移地址可以任意)


2.Norflash芯片写操作

         1.单字或字节  查看芯片手册如下图:


主要代码如下(word address):

*((Uint16 *)base_addr + 0x555 ) = 0xAA;         //write unlock cycle 1
*((Uint16 *)base_addr + 0x2AA ) = 0x55;         //write unlock cycle 2
*((Uint16 *)base_addr + 0x555 ) = 0xA0;         //write program setup command

*((Uint16 *)base_addr + write_addr) = data;             //write data

*((Uint16 *)base_addr + 0x000) = 0xF0;                      //write reset command

          

          2.buffer  查看芯片手册如下图:


主要代码如下(word address):

UINT16 *src = source_of_data;         // address of source data
UINT16 *dst = destination_of_data;   // flash destination address
UINT16 wc = words_to_program -1;     // word count (minus 1)

*( (UINT16 *)base_addr + 0x555 ) = 0x00AA;   // write unlock cycle 1
*( (UINT16 *)base_addr + 0x2AA ) = 0x0055;  // write unlock cycle 2
*( (UINT16 *)sector_address ) = 0x0025;    // write write buffer load command
*( (UINT16 *)sector_address ) = wc;       // write word count (minus 1)

for (i=0;i<=wc;i++)
{
*dst++ = *src++;                        // ALL dst MUST BE in same Write Buffer
}
*( (UINT16 *)sector_address ) = 0x0029; // write confirm command


/* Example: Write Buffer Abort Reset */
*( (UINT16 *)addr + 0x555 ) = 0x00AA; // write unlock cycle 1
*( (UINT16 *)addr + 0x2AA ) = 0x0055; // write unlock cycle 2
*( (UINT16 *)addr + 0x555 ) = 0x00F0; // write buffer abort reset


3.Norflash芯片读操作

        查看芯片手册如下图:


主要代码如下:

*( (UINT16 *)base_addr + 0x456 ) = 0x00F0; // write reset command


 for ( iloop = 0 ; i < length ; iloop ++ )
        data[iloop] =  *( (UINT16 *)base_addr + iloop );


4.Norflash芯片擦除

      1.扇区擦除  芯片手册如下图:


主要代码如下:

*( (UINT16 *)base_addr + 0x555 ) = 0x00AA; // write unlock cycle 1
*( (UINT16 *)base_addr + 0x2AA ) = 0x0055; // write unlock cycle 2
*( (UINT16 *)base_addr + 0x555 ) = 0x0080; // write setup command


*( (UINT16 *)base_addr + 0x555 ) = 0x00AA; // write additional unlock cycle 1
*( (UINT16 *)base_addr + 0x2AA ) = 0x0055; // write additional unlock cycle 2
*( (UINT16 *)sector_address ) = 0x0030;       // write sector erase command


        2.芯片擦除  芯片手册如下图:

主要代码如下:

*( (UINT16 *)base_addr + 0x555 ) = 0x00AA; // write unlock cycle 1
*( (UINT16 *)base_addr + 0x2AA ) = 0x0055; // write unlock cycle 2
*( (UINT16 *)base_addr + 0x555 ) = 0x0080; // write setup command


*( (UINT16 *)base_addr + 0x555 ) = 0x00AA; // write additional unlock cycle 1
*( (UINT16 *)base_addr + 0x2AA ) = 0x0055; // write additional unlock cycle 2
*( (UINT16 *)base_addr + 0x555 ) = 0x0010; // write chip erase command






  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值