嵌入式linux学习笔记 1-15 Nor FLash原理即硬件操作

目录

1. NorFlash与NandFlash的特点

2. 使用U-boot体验Nor Flash操作

2.1 读数据

2.2 读ID

 2.3 Nor Flash的两种规范,jedec, cfi(common flash interface)

2.4 NorFlash写数据


1. NorFlash与NandFlash的特点

Nor FlashNand 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上操作cfi2440上操作cfiU-BOOT上操作cfi
往55H地址写入98H往AAH地址写入98Hmw.w aa 98
读地址10H得到0051读地址20H得到0051md.w 20 1
读地址11H得到0052读地址22H得到0052md.w 22 1
读地址12H得到0059读地址24H得到0059md.w 24 1
读地址27H得到容量读地址4EH得到容量md.w 4e 1

在任意地址写入F0H

(退出CFI模式,实则

就是reset)

在任意地址写入F0Hmw.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位,判断两次的电平是否相同,若相同则命令执行完毕,否则命令未执行完毕。
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值