Nor Flash具有其独特的数据保护机制,它可以像内存一样读,但是它不可以像内存一样写,这就会导致我们在向Nor Flash中写数据时会稍显麻烦。这篇文章介绍Nor Flash 的一般操作,适合大多数的Nor Flash芯片,笔者使用的芯片是MX29LV160D T/B,容量为2MB。
拿到一款Nor Flash芯片,我们首先简明扼要的浏览数据手册上芯片的特性(FEATURES),做到一个大概的了解,接着看相关操作的命令介绍及文字说明,一般来说,芯片手册上的 NOTE内容很重要。至于相关操作的时序,如果你使用的微控制器内部集成有内存控制器,那么你在操作之前,必须严格遵守相关时序来配置内存控制器的寄存器;如果你使用的微控制器内部没有集成内存控制器,那么相关操作中,严格按照时序来编程。
图1 相关操作指令
从图1中可以看出,像Nor Flash芯片发送数据或者是读取数据有两种方式,一种是2字节方式(发送的数据和读取的数据都是2字节,short),一种是1字节方式(发送的数据和读取的数据都是1字节,char)。这个特点在编程的时候一定注意,即数据的类型不要搞错了。
举个例子,进入CFI(COMMON FLASH MEMORY INTERFACE)模式,我们首先向地址为55H的地方写入数据98H即可。
对于芯片的读写操作,一般都是先编写基本读、写函数。
/*写一个字,微控制器的A1->nor的A0,故需要左移一位*/
#define NOR_FLASH_BASE 0X0
void write_word_nor_flash(unsigned int base,unsigned int offset,unsigned int word)
{
Volatile unsigned short * p=(volatile unsigned short *)(base+(offset<<1));
*p=word;
}
/*写命令*/
void nor_command(unsigned int offset,unsigned int command)
{
write_word_nor_flash(NOR_FLASH_BASE,offset,command);
}
/* 读数据 */
unsigned int read_data_nor_flash(unsigned int base,unsigned int offset)
{
volatile unsigned short * p=(volatile unsigned short *)(base+(offset<<1));
return *p;
}
unsigned int nor_dat(unsigned int offset)
{
return read_data_nor_flash(NOR_FLASH_BASE, offset);
}
想要进入某种模式,输入对应的命令即可。注意,像芯片写数据时,所对应的扇区的初始值一定要是0XFFFF,否则,写无效 。擦除操作或者是写操作时,一定要结合状态位来判断芯片是否擦除或者是写完成。
图(2)擦除操作状态位说明