1.Nor-Flash 接口如RAM一样 引脚很多 地址线和数据线是分开的
2. 容量小 1~32M
3. 读写很简单 不过写命令需要向里面写入特定的命令 比NandFlash慢
4. 价格贵 不过不会产生坏块。
当CPU选择NOR-flash 作为启动的芯片的时候 则nor的0地址就是cpu的0地址 且nor 连接在了CS0上面 所以说nor flash的地址就是0
而且此时nor-flash不需要初始化(其实还有一个原因就是nor-flash的速度很快)
LADDR1 连接在 A0上面 所以说数据每次需要左移一位来保持数据正确。
上图的这个表描述了各种命令如何访问nor-flash
比如 读ID
1. 在555H写AAH
2. 在2AAH写0x55H
3. 在555H写90
4. 读0地址得到厂家ID(C2H)
5.读1地址得到设备ID(22DAH或225BH)
6. 往任意地址写0x0F退出读ID模式
进入CFI模式(统一norflash 信息)
1. 在0x55 写入0x98
2. 读10 11 12地址的值得出ID
写操作:
往地址555H写AAH(解锁)
往地址2AAH写55H
往地址555H写A0H
往Addr写Data
等待第六比特数据不变 完成写操作
#include "my_printf.h"
#include "string_utils.h"
#define NOR_FLASH_BASE 0 /* jz2440, nor-->cs0, base addr = 0 */
/* 比如: 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 short *)(base + (offset << 1));
*p = val;
}
/* offset是基于NOR的角度看到 */
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 */
nor_cmd(0x55, 0x98); /* 进入cfi模式 */
str[0] = nor_dat(0x10);
str[1] = nor_dat(0x11);
str[2] = nor_dat(0x12);
str[3] = '