文章目录
示例代码下载
1.NOR与NAND的区别
Flash | NOR | NAND |
---|---|---|
接口 | RAM-Like,引脚多 | 引脚少,复用(地址数据共用) |
容量 | 小(1-32M) | 大(128M+) |
读 | 简单 | 复杂 |
写 | 发出特定命令(慢) | 发出特定命令(快) |
价格 | 贵 | 较便宜 |
缺点 | 无位反转、坏块 | 位反转、坏块 |
一般存放 | bootloader(关键程序) | 大文件、视频 |
xip | 可以 | 不可以 |
- xip(eXecute In Place),即芯片内执行,指应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。flash内执行是指nor flash 不需要初始化,可以直接在flash内执行代码。但往往只执行部分代码,比如初始化RAM.
2.命令表
- UBOOT下读写数据
2.1 读数据
md.b
为读命令mw.w
为写命令
md.b 0
2.2 读ID
- Nor手册
- 往(555H)写入AAH
- 往(2AAH)写入55H
- 往(555H)写入90H
- 读(0)得到厂家(Manifacture)ID:C2H
- 读(1)得到设备(Device)ID:22C4/2249
但是由于地址是错开1位的(具体原因可查看第15章),则往CPU写的地址需要addr<<1,即(地址*2)因此:
- UBOOT下
- 往(AAAH)写入AAH
- 往(554H)写入55H (这两步为解锁命令)
- 往(AAAH)写入90H(90H为命令)
- 读(0H)得到厂家(Manifacture)ID:C2H
- 读(2H)得到设备(Device)ID:22C4/2249
- 退出读ID状态(即复位)
mw.w aaa aa
mw.w 554 55
mw.w aaa 90
md.w 0 1 #读0地址1次
md.w 2 1
mw.w 0 F0
2.3 CFI模式
CFI(Common Flash Interface)
- Nor手册
- 往(55H)写入98H(进入CFI模式)
- 读(27H)得到容量2^n的n
- 退出CFI模式(复位)
- UBOOT下
- 往(AAH)写入98H(进入CFI模式)
- 读(4EH)得到容量2^n的n
- 往(0H)写入F0H
3.基本函数
3.1 写函数
- Nor Flash 地址线21:即可访问2M内存,
0x1FFFFF
,其范围地址为 0~0x1FFFFF
#define NOR_FLASH_BASE 0 /* Nor Flash基地址 nor-->cs0,base_addr = 0 */
/* Nor Flash写入一个字
* 基地址:base,偏移地址:offset,写入的值:value
* eg: 55 98
* 往(0 + (0x55)<<1 )写入0x98
*/
void nor_write_word(unsigned int base,unsigned int offset,unsigned short value)
{
volatile unsigned short *p = (volatile unsigned short *) (base + offset<<1);
*p = value;
}
- 进行封装
void nor_cmd(unsigned int offset,unsigned short cmd)
{
nor_write_word(NOR_FLASH_BAS