zoukankan      html  css  js  c++  java
  • nand

    nand flash裸机编程
    第001节_NAND_FLASH操作原理
    第002节_NandFlash时序及初始化
    第003节_NandFlash的芯片id读取
    第004节_NandFlash的数据读取
    第005节_NandFlash的擦除与烧写

    第001节_NAND_FLASH操作原理
    NAND FLASH是一个存储芯片
    那么: 这样的操作很合理"读地址A的数据,把数据B写到地址A"

    问1. 原理图上NAND FLASH和S3C2440之间只有数据线,
    怎么传输地址?
    答1.在DATA0~DATA7上既传输数据,又传输地址
    当ALE为高电平时传输的是地址,

    问2. 从NAND FLASH芯片手册可知,要操作NAND FLASH需要先发出命令
    怎么传入命令?
    答2.在DATA0~DATA7上既传输数据,又传输地址,也传输命令
    当ALE为高电平时传输的是地址,
    当CLE为高电平时传输的是命令
    当ALE和CLE都为低电平时传输的是数据

    问3. 数据线既接到NAND FLASH,也接到NOR FLASH,还接到SDRAM、DM9000等等
    那么怎么避免干扰?
    答3. 这些设备,要访问之必须"选中",
    没有选中的芯片不会工作,相当于没接一样

    问4. 假设烧写NAND FLASH,把命令、地址、数据发给它之后,
    NAND FLASH肯定不可能瞬间完成烧写的,
    怎么判断烧写完成?
    答4. 通过状态引脚RnB来判断:它为高电平表示就绪,它为低电平表示正忙

    问5. 怎么操作NAND FLASH呢?
    答5. 根据NAND FLASH的芯片手册,一般的过程是:
    发出命令
    发出地址
    发出数据/读数据

          NAND FLASH                      S3C2440
    

    发命令 选中芯片
    CLE设为高电平 NFCMMD=命令值
    在DATA0~DATA7上输出命令值
    发出一个写脉冲

    发地址 选中芯片 NFADDR=地址值
    ALE设为高电平
    在DATA0~DATA7上输出地址值
    发出一个写脉冲

    发数据 选中芯片 NFDATA=数据值
    ALE,CLE设为低电平
    在DATA0~DATA7上输出数据值
    发出一个写脉冲

    读数据 选中芯片 val=NFDATA
    发出读脉冲
    读DATA0~DATA7的数据

    用UBOOT来体验NAND FLASH的操作:

    1. 读ID
      S3C2440 u-boot
      选中 NFCONT的bit1设为0 md.l 0x4E000004 1; mw.l 0x4E000004 1
      发出命令0x90 NFCMMD=0x90 mw.b 0x4E000008 0x90
      发出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
      读数据得到0xEC val=NFDATA md.b 0x4E000010 1
      读数据得到device code val=NFDATA md.b 0x4E000010 1
      0xda
      退出读ID的状态 NFCMMD=0xff mw.b 0x4E000008 0xff

    2. 读内容: 读0地址的数据
      使用UBOOT命令:
      nand dump 0
      Page 00000000 dump:
      17 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5

                              S3C2440                 u-boot 
      

    选中 NFCONT的bit1设为0 md.l 0x4E000004 1; mw.l 0x4E000004 1
    发出命令0x00 NFCMMD=0x00 mw.b 0x4E000008 0x00
    发出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
    发出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
    发出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
    发出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
    发出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
    发出命令0x30 NFCMMD=0x30 mw.b 0x4E000008 0x30
    读数据得到0x17 val=NFDATA md.b 0x4E000010 1
    读数据得到0x00 val=NFDATA md.b 0x4E000010 1
    读数据得到0x00 val=NFDATA md.b 0x4E000010 1
    读数据得到0xea val=NFDATA md.b 0x4E000010 1
    退出读状态 NFCMMD=0xff mw.b 0x4E000008 0xff

    第002节_NandFlash时序及初始化

    第003节_NandFlash的芯片id读取

    第004节_NandFlash的数据读取
    a. 地址问题
    CPU大爷: 小nand啊,你的性能比不上小nor啊,听说你有位反转的毛病
    Nand : 是的,大爷,位反转是我天生的毛病,时有时无
    CPU大爷: 靠,你说你价格便宜容量大,这不是害我嘛
    Nand : 没事,我有偏方,用OOB就可以解决这问题
    CPU大爷: 得得得,你那偏方是什么也别告诉我,我只管能读写正确的数据
    Nand : 是的,大爷,我这OOB偏方也就我自个私下使用。
    您就像使用nor一样使唤我就可以了

    b. 实现nand flash的页读取
    c. 实现从nand flash启动

    作业:

    1. 实现NAND测试菜单中的 [r] Read nand flash
      // 下一节视频的程序里的nand_flash.c

    2. 读OOB检测坏块, 改进nand_read实现碰到坏块就跳过 // lib_nand

    第005节_NandFlash的擦除与烧写

    1. 实现 nand_erase
    2. 实现 nand_write
    3. 实现测试菜单

    作业:

    1. 改进nand_write实现碰到坏块就跳过
    2. 百度搜一下NAND ECC,了解一下
  • 相关阅读:
    Python:如何显示进度条
    Python:常用函数封装
    Javascript:常用函数封装
    Javascript:alert(1)可以这样写以绕过filter
    SQL注入备忘单
    Web渗透:PHP字符编码绕过漏洞总结
    SQLi Lab的视频教程和文字教程
    Python:使用基于事件驱动的SAX解析XML
    Python:渗透测试开源项目【源码值得精读】
    Python:SQLMap源码精读—start函数
  • 原文地址:https://www.cnblogs.com/agui125/p/12052412.html
Copyright © 2011-2022 走看看