第15课.Nor Flash
Posted huangdengtao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第15课.Nor Flash相关的知识,希望对你有一定的参考价值。
1.Nor Flash与Nand Flash的对比
a.Nor Flash的块大小范围为64kb,128kb:Nand Flash的块大小范围为8kb,64kb,擦/写一个Nor Flash块需4s,而擦/写一个Nand Flash块仅需2ms
b.Nand Flash一般以512字节为单位进行读写。这使得Nor Flash适合运行程序,而Nand Flash更适合于存储数据
c.容量相同的情况下,Nand Flash的体积更小。Nor Flash的容量通常为1MB~4MB(也有32M的Nor Flash),Nand Flash的容量为8MB~512MB
d.在Nor Flash上常用jffs2文件系统,而在Nand Flash常用yaffs文件系统。在更底层,有MTD驱动程序实现对他们的读,写,擦除操作。它也实现了EDC/ECC校验
e.这里用的Nor里面有4个bank,每个bank里面有若干block(擦除大小),不同bank里面的block可能不一样
2.引脚接口
2440的A1接到Nor的A0,所以2440发出(555h<<1)(左移一位),Nor才能收到555h这个地址
3.NOR FLASH的命令
解析:
Read Mood:先发送地址,然后就有数据得到和正常的读内存是一样的
Reset Mood:往任意地址写0xF0都退出特殊模式
读ID:Nor Flash分为1字节和2字节模式,所以有两种情况的操作指令,板载2字节的操作如下:
·发送地址555,发送数据AA,0x555*2 = 0xaaa
·发送地址2AA,发送数据55,0x2AA*2 = 0x554
·发送地址555,发送数据90,0x555*2 = 0xaaa
·发送地址00, 发送数据C2
注意:
1.板载的MCU的A1接到Nor的A0,所以也就是Nor获得的地址为,实际MCU出的地址<<1(2的多少次方就是<<多少位)
2.写数据时需确保addr上的数据为0xffff,否则写失败,即需要先擦除,再烧写
3.CFI是制定的一个接口,用来帮助读取Flash制造商ID和设备ID,确定Flash大小物理特性,以及block的信息
1. 读数据
2. 读ID
往地址555H写AAH
往地址2AAH写55H
往地址555H写90H
读0地址得到厂家ID: C2H
读1地址得到设备ID: 22DAH或225BH
退出读ID状态: 给任意地址写F0H
3.读取CFI信息
进入CFI模式 往55H写入98H
读数据: 读10H得到0051
读11H得到0052
读12H得到0059
读27H得到容量
4. 写数据
往地址555H写AAH
往地址2AAH写55H
往地址555H写A0H
往地址PA写PD
5.擦除
往地址AAAH写AAH
往地址554H写55H
往地址AAAH写80H
往地址AAAH写AAH
往地址554H写55H
往地址写30H
6.region and block
进入CFI模式 往55H写入98H
读地址0x2c得到regions
读0x2c后的4位地址0x2d, 0x2e, 0x2f, 0x30得到blocks,block size
继续读下一个region,知道region读完
a.erase block region
一个Nor Flash含有一个或多个region,一个region含有1个或多个block(block大小相等)
b.erase block region information:
前2字节 + 1:表示该region有多少个block
后2字节 * 256:表示block的大小
eg:
写2c读erase block region的个数
前两字节:
2D 低位
2E << 8 高位
后两字节:
2F 低位
3D << 8 高位
4.代码
nor_flash.c
/* 比如: 55H 98
* 本意是往(0 + (0x55) << 1 )写入0x98
*/
void nor_write_word(unsigned int base, unsigned int offset, unsigned int val)
{
volatile unsigned short *p = (volatile unsigned int *)(base + (offset << 1))
*p = val;
}
void nor_cmd(unsigned int offset, unsigned int cmd)
{
nor_write_word(NOR_FLASH_BASE, offset, cmd);
}
unsigned int nor_read_word(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 nor_read_word(NOR_FLASH_BASE, offset);
}
/* */
void wait_ready(unsigned int addr)
{
unsigned int val;
unsigned int pre;
pre = nor_dat(addr>>1);
val = nor_dat(addr>>1);
while((val & (1<<6)) != (pre & (1<<6)))
{
pre = val;
val = nor_dat(addr>>1);
}
}
/* 进入NOR FLASH的CFI模式
* 读取各类信息
*/
void do_scan_nor_flash(void)
{
char str[4];
unsigned int size;
int regions, i;
int region_info_base;
int block_addr, blocks,block_size, j;
int cnt;
int vendor, device;
/* 打印厂家ID,设备ID */
nor_cmd(0x555, 0xaa); /* 解锁 */
nor_cmd(0x2aa, 0x55);
nor_cmd(0x555, 0x90); /* read id */
vendor = nor_dat(0);
device = nor_dat(1);
nor_cmd(0, 0xf0); /* reset */
/* 进入CFI模式 */
nor_cmd(0x55, 0x98);
str[0] = nor_dat(0x10);
str[1] = nor_dat(0x11);
str[2] = nor_dat(0x12);
str[3] = '