本文叙述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