目录
2.3 Nor Flash的两种规范,jedec, cfi(common flash interface)
1. NorFlash与NandFlash的特点
Nor Flash | Nand Flash | |
接口 | RAM-like, | 引脚少,复用,数据线上传输命令、地址、数据 |
容量 | 小 | 大 |
读 | 简单,像内存一样读 | 复杂 |
写 | 发出特定命令(慢) | 发出特定指令(快) |
价格 | 贵(无位反转,坏块) | 便宜(但是会位反转有坏块) |
XIP (execute in place) 在芯片上直接运行 | 可以 | 不可以 |
因此根据他们的这些特点,当为了系统的稳定,一些关键性的程序,如BIOS,bootloader会存储在Nor Flash中;NandFlash会存储一些海量数据,如视频监控等。
2. 使用U-boot体验Nor Flash操作
2.1 读数据
使用“md.b +地址 +指令”指令来读取数据。如下图所示,读取0地址的数据,实际与我们烧写的U-boot.bin中的二进制数据一致。
2.2 读ID
如下表所示,往555H写AAH,往2AAH写55H,往555H写90H(这段操作称为解锁),最后读0地址得到厂家ID,读1地址得到设备ID。
需要注意的是,查看电路图可以看到,我们的Norflash是16位的,因此地址线并不是一一对应的, 是2440的A1接norflash的A0,也就是2440的A0没有接到norflash。因此2440需要发出(555H<<1), NOR才能收到555H这个地址。所以实际是往AAAH地址写AAH,往554H写55H,往AAAH写90H,最后读的地址也要左移1位。
写数据的指令为“mw.w + 地址 + 指令”。eg. mw.w aaa aa
输入以下指令。
2.3 Nor Flash的两种规范,jedec, cfi(common flash interface)
一种是 jedec 探测,就是在内核里面事先定义一个数组,该数组里面放有不同厂家各个芯片的一些参数,探测的时候将 flash 的 ID 和数组里面的 ID 一一比较,如果发现相同的,就使用该数组的参数。jedec 探测的优点就是简单,缺点是如果内核要支持的 flash 种类很多,这个数组就会很庞大。内核里面用 jedec 探测一个芯片时,是先通过发命令来获取 flash 的 ID,然后和数组比较,但是 flash.c 中连 ID 都是自己通过宏配置的。
一种是 CFI(common flash interface)探测,就是直接发各种命令来读取芯片的信息,比如 ID、容量等,芯片本身就包含了电压有多大,容量有有多少等信息。
Nor Flash上操作cfi | 2440上操作cfi | U-BOOT上操作cfi |
---|---|---|
往55H地址写入98H | 往AAH地址写入98H | mw.w aa 98 |
读地址10H得到0051 | 读地址20H得到0051 | md.w 20 1 |
读地址11H得到0052 | 读地址22H得到0052 | md.w 22 1 |
读地址12H得到0059 | 读地址24H得到0059 | md.w 24 1 |
读地址27H得到容量 | 读地址4EH得到容量 | md.w 4e 1 |
在任意地址写入F0H (退出CFI模式,实则 就是reset) | 在任意地址写入F0H | mw.w 0 fo |
注:若进入cfi模式但是不退出的话,会影响之后芯片对指令的响应。所以一定要记得退出cfi模式,也就是reset。
2.4 NorFlash写数据
之前介绍NorFlash并不能随意写。根据手册,norflash也要经过解锁以后才能往地址写入数据, 而且解锁之前还需要擦除地址上的数据才能写入成功。
先擦除
往地址555H写AAH
往地址2AAH写55H
往地址555H写80H
往地址555H写AAH
往地址2AAH写55H
往地址PA(program address)写30H再烧写
往地址555H写AAH
往地址2AAH写55H
往地址555H写A0H
往地址PA(program address)写PD(program data)
2440的A1接到NOR的A0,所以2440发出(555h<<1), NOR才能收到555h这个地址
UBOOT怎么操作?
往地址AAAH写AAH mw.w aaa aa
往地址554H写55H mw.w 554 55
往地址AAAH写80H mw.w aaa 80往地址AAAH写AAH mw.w aaa aa
往地址554H写55H mw.w 554 55
往地址0x100000写30h mw.w 100000 30往地址AAAH写AAH mw.w aaa aa
往地址554H写55H mw.w 554 55
往地址AAAH写A0H mw.w aaa a0
往地址0x100000写1234h mw.w 100000 1234
3.硬件知识
一个NorFlash含有1个或多个region,一个region内含有一个或多个block(扇区)。如下图所示,通过访问0x2C地址可以看到共有4个扇区。
关于扇区内的信息内容,表中提示我们要按照CFI pubulication 100来理解,以下截自CFI pubulication 100,来源:https://wenku.baidu.com/view/cd1c1e22482fb4daa58d4b42.html
规则是低两字节加一代表扇区的个数,高两字节乘256代表扇区的大小。
4. 编程中注意事项
1. 编译程序时加上: -march=armv4
否则
volatile unsigned short *p = xxx;
*p = val; // 会被拆分成2个strb操作
2. 把timer中断去掉
否则: 测试nor时进入CFI等模式时, 如果发生了中断,cpu必定读NOR,
那么读不到正确的指令,导致程序崩溃。
3. 关于地址
由于位宽的不同,NorFlash是16Bit的,所以地址总线的A1接的是NorFlash的A0。因此当我们要写NorFlash上的某些位的时候是,是从NorFlash的角度出发的,比如要修改Norflash上555的值,时间是CPU是要写1110的值,才能实现,所以每次要改Norflash的值都要人为地将地址<<1。但是如果是本来要改的值就是CPU地址上的值,那就只是按正常的来就可以了,比如要修改CPU
1000地址的值,实际上就存在NorFlash的500地址里,不需要人为地移位。
4. 判断NorFlash是否擦写完毕
查MX29LV800BT/BB datasheet第16页可知:
功能说明:用户可以通过查询第I位切换指示是否有自动程序或擦除算法正在进行或完成。
使用方法:执行擦除命令后,通过先后两次读取操作地址的第I位,判断两次的电平是否相同,若相同则命令执行完毕,否则命令未执行完毕。