NorFlash

本文详细介绍了Norflash的内部结构与工作原理,包括其与CPU的数据与地址交互方式,以及如何通过编程实现读、写、擦除操作。同时,文章提供了具体的编程实验步骤,如读取设备ID、信息扫描、数据读写与擦除。

一、Norfalsh原理介绍

  1. Norflash的内部结构
    (1)每个Norflash有多个regions,每个regions由blocks(块)组成。blocks大小范围为64kB、128kB。
    (2)Norfalsh可以像内存一样读,但无法像内存一样写;Norflash支持XIP,即代码可以直接在Norflash上执行,无需复制到内存中。
  2. Norflash的电路图
    在这里插入图片描述

(1)DQ0~DQ15:共16根数据总线,即CPU与Norflash可以一次传输16bit(2byte即1word)的数据。
(2)A0~A19:共20根地址总线,由于norflash为16bit半字(word,即2Byte)访问,即CPU发出一个地址信号,就可以访问norflash的2Byte的内容,所以可以访问2Byte*2^20的地址范围,即2M;
(3)由于Norflash是16bit设备,所以CPU的LADDR1与Norflash的A0相连,而LADDR0未连接到Norflash。
(4)nGCS0、LnOE、LnWE:片选引脚、读信号、写信号,是由内存控制器来控制,当CPU发出地址/读/写信号后,内存控制器会自动控制这些引脚拉底或升高。

  1. Norflash的操作原理
    (1)CPU访问Norflash统一编址:由于Norflash的地址总线引脚与CPU的错开一条地址线,即LADDR0未接,因此CPU发出的地址是以CPU的角度看到的统一编址的地址,norfalsh接收的地址实际少了一位,但由于内存控制器的存在,CPU依然可以得到想要地址的数据。
    (2)CPU访问Norflash自己编址:若CPU要访问Norflash自己编址的数据,需要将CPU发出的地址左移1位,即将LADDR0上的地址信号移到LADDR1上,此时Norflash就可以接收到CPU发过来完整的地址信号,以此地址来访问Norflash上自己编址的数据。而此时的访问就无关统一编址,而是访问的Norflash自己编址上的数据。
    (3)Norflash操作方法:由于Norflash并非内部芯片,因此除了需要开发板的芯片手册之外,还需要参考norflash自己的芯片手册来确定具体的操作流程。对于内存设备的操作通常包括:时序设置、扫描设备信息、读、写、擦除。

二、编程实验
在这里插入图片描述

1.Norflash命令函数
(1) 根据norflash芯片手册,某些命令需要向norflash自己编址的地址写入数据和读取数据,因此需要先定义数据偏移的函数:即将norflash的得到的地址信号左移一位,得到完整的CPU地址信号。

/**读命令**/
int read_cmd(int addr)
{
   volatile unsigned short *p = (volatile unsigned short *)(addr<<1);
   return *p;
}

/**写命令**/
int write_cmd(int addr, int val)
{
   volatile unsigned short *p = (volatile unsigned short *)(addr<<1);
   *p = val;
}

(2)由于Norflash是外部设备,因此在擦除和写命令发出后,CPU需要等待Norflash工作完成,才能进行下一步操作。根Norflash芯片手册,通过查询Q6是否变化来确定擦除或写命令是否执行完成(变化代表正在操作)。

int wati_ready(int addr)
{
	int pre = read_cmd(addr >> 1);	//前一次查询
	int aft = read_cmd(addr >> 1);	//后一次查询
	while((pre & (1<<6) != (aft & (1<<6))) )	//判断前后两次Q6是否相等
	{
		pre = aft;
		aft = read_cmd(addr >> 1);
	}
}
  1. 扫描norflash信息
    (1)读取设备ID在这里插入图片描述在这里插入图片描述
    根据norflash的芯片手册,需要向norflash自己编址的地址写入上图中的命令,实际上是解锁norflash读取ID的功能,然后再读取相关地址的数据。
	write_cmd(0x555, 0xaa);
	write_cmd(0x2aa, 0x55);
	write_cmd(0x555, 0x90);
	mc = read_cmd(0);		// manufacturer code
	dc = read_cmd(1);		//device code

(2)读取设备信息
在这里插入图片描述
在这里插入图片描述

write_cmd(0x55, 0x98);				//进入CFI模式
nor_size = (1 << read_cmd(0x27));	//读取norfalsh的容量
regions = read_cmd(0x2C);			//读取region数量

进入向Norflash中地址写入命令CFI模式后,读取相关地址上的数据就可以得到norflash的regions和blocks的信息。blocks的信息可以通过下图的方式得到在这里插入图片描述

//获取blocks的数量和大小
int block_base = 0x2d;
for(i = 0; i < regions; i++)
{
	blocks = 1 + read_cmd(block_base) + (read_cmd(block_base + 1)<<8);
	block_size = 256 * ((read_cmd(block_base + 2) + (read_cmd(block_base + 3) << 8)));
}
write_cmd(0xf0, 0);	//退出CFI模式
  1. 读取norfalsh数据
    在这里插入图片描述

(1)由于Norflash可以像内存一样读,如果想读取统一编址上norflash中的数据,通过指针的间接寻址方式,就可以读到。
(2)由于Norflash是16bit设备,因此一次会读取出2字节数据,内存控制器会自动根据CPU发出的地址来确定保留2个字节中的哪个字节。

addr = get_uint()		//获取地址
volatile unsigned char *p  = (volatile unsigned char *)addr; 
return *p;				//得到数据
  1. 擦除norflash数据在这里插入图片描述
    (1)通过norflash的写命令函数向norflash地址上写相应的命令,然后输入地址,就可以擦除该地址上内容.
    (2)擦除的范围为该地址所处整个block上的所有内容,由于norflash的每个block容量比较大(64kB、128kB),所以擦除的效率比较低。
    (3)由于擦除数据的操作本质是向norflash的写数据,而norflash无法像内存一样写,因此只能通过norflash自己的操作方法擦除数据,而无法通过指针间接访问的方式擦除。
    (4)由于是通过写命令函数来将擦除地址传入norflash,而写命令函数目的是通过将CPU的地址信号左移1位,来得到完整的地址信号,来操作norflash自己编址上的数据。因此如果想擦除norflash统一编址的内容,需要再将写命令函数得到的地址信号再右移1位,就可以擦除norflash上统一编址的数据。
//擦除命令
write_cmd(0x555, 0xaa);
write_cmd(0x2aa, 0x55);
write_cmd(0x555, 0x80);
write_cmd(0x555, 0xaa);
write_cmd(0x2aa, 0x55);
//擦除地址
write_cmd(addr>>1, 0x30);
  1. 写norflash数据
    在这里插入图片描述
    (1)通过norflash的写命令函数向norflash地址上写相应的命令,然后输入地址和数据,就可以将数据写到输入的地址;
    (2)同擦除操作,写数据操作也需要通过写命令函数发地址和数据到norflash,因此也需要将地址右移1位;
    (3)由于norflash是16bit设备,内部数据是以2字节位一个存储单位,即一个地址存储2字节数据,因此应一次写入2字节数据。
//写命令
write_cmd(0x555, 0xaa);			
write_cmd(0x2aa, 0x55);
write_cmd(0x555, 0xa0);
//得到地址和数据
addr = get_uint();
char str[100];
gets(str);
val = str[i] + (str[j]<<8);
j+=2;i+=2;addr+=2;
//写入数据
write_cmd(addr>>1, val);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值