1. Nor Flash与Nand Flash

Nor Nand
接口 引脚多,类似于RAM 引脚较少
容量 小(1-32MB) 大(128-512MB)
读操作 简单,和RAM相同 简单,和RAM相同
写操作 发出特定命令才能写入 发出特定命令才能写入
价格 便宜
比较 无坏块 有坏块
XIP 可以 不可以
应用场合 存储关键性代码(比如uboot,kernel) 存储海量数据(允许错误)

2. JZ2440开发板上的Nand Flash

JZ2440开发板上板载了一个Nand Flash,型号为K9F2G08U0C,大小为256MB,连接在S3C2440的nand控制器上,原理图如下:

3. Nand Flash的控制原理

3.1. 控制信号

Nand Flash相较于Nor Flash,引脚比较少,它是如何做到的呢?

Nand Flash将地址数据,读写数据,命令数据全部放在了8条数据线上(上图中的LDATA0-7),然后使用控制信号CLE、ALE、WE、RE来区分数据线上的数据,具体如下:

数据线上的数据含义 ALE(地址/数据) CLE(命令/数据) WE(写使能) RE(读使能)
地址
命令数据
写入数据
读出数据

除此之外,还有三个控制引脚,它们的意义如下:

  • CE:片选引脚(LDATA0-7总线复用,用片选信号防止互相干扰)
  • WP:写保护引脚
  • R/B:Flash当前状态引脚(高 -> 空闲或者就绪,低 -> 忙)

3.2. 操作命令

Nand Flash的本质还是Flash,所以操作流程和Nor Flash基本相同,都是:发命令 -> 发地址 - >发数据的流程。

这款Nand Flash的命令列表如下:

3.3. Nand Flash控制器

S3C2440内部有一个Nand Flash控制器,与板载Nand Flash相连,专门负责接收发出Nand Flash的控制信号脉冲,其结构如下:

Nand Flash大大简化了我们的编程工作,在操作之前首先按照这款Nand Flash的性能配置Nand Flash控制器的时序参数,然后只要操作Nand Flash控制器即可。

本文中利用uboot已经配置好Nand Flash控制器中的时序参数这一条件,直接借助uboot读写内存的能力来操作Nand Flash控制器的寄存器,来测试Nand Flash的读写。

因为数据线是共用的,uboot启动之后不会一直将Nand Flash使能,首先需要设置NFCONT寄存器,将片选信号使能:


要发送给Nand Flash的命令需要写入到Nand 控制器的 NFCMMD 寄存器中:

要发送给Nand Flash的地址需要写入到Nand 控制器的 NFADDR 寄存器中:

要发送给Nand Flash的数据需要写入到Nand 控制器的 NFDATA 寄存器中,从 Nand Flash 中读取出的数据也保存在 NFDATA 寄存器中:

4. 使用uboot命令直接读写内存操作Nand Flash

实验前提:烧录uboot.bin到Nor Flash,并且板子设置为Nor Flash启动方式。

知识准备:uboot | uboot内存操作指令mw和md详解。

4.1. 读取ID值(ManufacturerID和DeviceID)

查看Nand FLash芯片数据手册,可知读ID的时序如下:

图中表示的读取ID流程如下:

  • ① 写命令90h
  • ② 写地址00h
  • ③ 读数据得到manufacturer code为ECH
  • ④ 读数据得到device code为DAh、10h、15h、44h

设置 Nand Flash 寄存器 NFCONT,首先使能Nand Flash片选信号:

md.l 0x4E000004 1        //先将NFCONT中的值读出来
mw.l 0x4E000004 1       //写入0x01,bit2设置为0,开启片选信号
md.l 0x4E000004 1       //再次读出,检查是否设置成功


发出读ID的一系列流程:

mw.b 0x4E000008 0x90     //写命令90h
mw.b 0x4E00000C 0x00        //写地址00hmd.b 0x4E000010 1   //读取数据

复位,退出该模式:

mw.b 0x4E000008 0xff //写入命令ff


这5个ID每个都有含义,如下:

读出的第三个ID是0x10,对应信息如下:

读出的第四个ID是0x95,其含义如下:

读出的第五个ID是0x44,其含义如下:

4.2. 读某个地址处的数据

查看芯片手册,时序图如图:

图中表示的读取某个地址处数据的流程如下:

  • ① 写命令00h
  • ② 写Col地址1
  • ③ 写Col地址2
  • ④ 写Row地址1
  • ⑤ 写Row地址2
  • ⑥ 写Row地址3
  • ⑦ 写命令30h
  • ⑧ 读数据

因为Nand Flash的容量有256MB,但是数据线只有8条,所以地址要分为5次来发送,如图:

(暂定)

首先使用uboot命令将0地址处的数据读出,方便后续检验读取的是否正确:

设置 Nand Flash 寄存器 NFCONT,首先使能Nand Flash片选信号:

md.l 0x4E000004 1        //先将NFCONT中的值读出来
mw.l 0x4E000004 1       //写入0x01,bit2设置为0,开启片选信号
md.l 0x4E000004 1       //再次读出,检查是否设置成功

发出读0地址处数据的一系列流程:

mw.b 0x4E000008 0x00     //写命令00h
mw.b 0x4E00000C 0x00        //写地址00h
mw.b 0x4E00000C 0x00
mw.b 0x4E00000C 0x00
mw.b 0x4E00000C 0x00
mw.b 0x4E00000C 0x00
mw.b 0x4E000008 0x30        //写命令00hmd.b 0x4E000010 1   //读取数据

复位,退出该模式:

mw.b 0x4E000008 0xff //写入命令ff

5. Nand Flash操作代码

上述uboot的操作中,发命令、发地址、发数据、读数据只需要访问Nand Flash控制器的三个寄存器即可,非常简单,在程序中操作nand flash也是访问这三个寄存器即可。

但是在uboot中,nand flash控制器已经被初始化好了,所以在自己编写程序时,需要根据nand flsh的时序参数来初始化nand flash控制器。

5.1. 时序参数初始化

在S3C2440的芯片手册中,首先是CLE(命令/数据)控制信号和ALE控制信号(地址/数据)的时序,如图:

再查找nand flash芯片手册中相对应的时序参数:

所以,从CLE信号发出之后,经过tCLS - tWP时间之后,才能发出WE信号,在芯片手册中查找具体的值:

从时序的具体值中得出,tCLS - tWP = 0,也就是Nand Flash控制器的TACLS参数可以设置为0,设置对应的寄存器,该值可以设置为0

同样的方法,nand flash控制器中的参数TWRPH0对应着nand flash中的tWP参数(min = 12ns),HCLK=100Mhz,周期为10ns,则TWRPH0的寄存器要设置为1(20ns)

同样的方法,nand flash控制器中的参数TWRPH1对应着nand flash中的tCLH参数(min = 5ns),HCLK=100Mhz,周期为10ns,则TWRPH1的寄存器要设置为0(10ns)

5.2. nand flash控制器使能

在nand flash 控制器的控制寄存器中:

nand flash控制器使能设置如下(其中片选信号在操作时再打开):

5.3. 编写nand flash控制器初始化代码

//nand flash控制器初始化
void nand_init(void)
{//时序参数初始化NFCONF = (0<<12)|(1<<8)|(0<<4);//nand flash控制器使能//禁止片选,片选信号在操作时再打开//初始化ECCNFCONT = (1<<4)|(1<<1)|(1<<0);
}

接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』

S3C2440-裸机篇-10 | 使用S3C2440操作Nand Flash相关推荐

  1. NAND FLASH的读写操作(硬件原理图分析)

    转载:NAND FLASH的读操作及原理 硬件原理 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面直接引用韦东山老师的课程中的提问: NAND FLASH是 ...

  2. NAND FLASH的读操作及原理

    硬件原理 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面直接引用韦东山老师的课程中的提问: NAND FLASH是一个存储芯片 那么: 这样的操作很合理&q ...

  3. NAND FLASH 读写操作 简介

    NAND FLASH 内存详解与读写寻址方式 一.内存详解 NAND闪存阵列分为一系列128kB的区块(block),这些区块是 NAND器件中最小的可擦除实体.擦除一个区块就是把所有的位(bit)设 ...

  4. linux系统下操作nandflash指令,Linux驱动之Nand Flash原理及硬件操作

    Nand Flash 是一个存储芯片 那么:这样的操作很理" 读地址A的数据,把数据B写到地址A" 问1:原理图上的Nand Flash和SC2440之间只有数据线,怎么传输地址? ...

  5. uboot研读笔记 | 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)

    项目开源地址:https://github.com/Mculover666/uboot-jz2440 0. 教程完整目录 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理 01 ...

  6. 15.NAND FLASH驱动

    NAND FLASH 原理以及操作详见:https://blog.csdn.net/qq_16933601/article/details/100001443 一.基本的问题 NAND FLASH是一 ...

  7. Linux NAND Flash调试

    很久没接触过 nandflash 驱动,最近工作又摸了,于是顺便整理总结一下.nandflash 在我看来算是比较落后的存储设备,所以文章里没有太多细节的东西,更多的是一些开发思路和经验,希望能帮助到 ...

  8. 嵌入式Linux驱动学习【8】—— Nand Flash

    1 Nand Flash   原理图.   引脚: 引脚 功能 IO0~IO7 数据输入输出 CLE 命令锁存 ALE 地址锁存 nCE 芯片使能 nRE 读使能 nWE 写使能 R/nB 就绪/忙 ...

  9. Nand Flash源码分析(s5pv210)

    关于NAND Flash S5PV210的NAND Flash控制器有如下特点: 1) 支持512byte,2k,4k,8k的页大小 2) 通过各种软件模式来进行NAND Flash的读写擦除等 3) ...

最新文章

  1. 为什么你问问题,别人都已读不回?
  2. Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源
  3. 一次诡异的数据库死锁问题排查过程
  4. 纯Python模块发布setup脚本编写示例
  5. kusto使用_Python查找具有数据重复问题的Kusto表
  6. TortoiseSVN客户端重新设置用户名和密码[转]
  7. 系统搭建遇到问题3:Ubuntu问题造成网卡名称异常导致Vivado绑定网卡地址的Lic无法正常工作(JESD)...
  8. 1 ~ express ~ 初始化。安装第三方模块express。中间件
  9. 华为机试——数字颠倒
  10. PYTHON——多线程:同步条件(Event)
  11. centos LAMP菜鸟搭建过程
  12. 命令前加./ ,在后台运行程序 linux批处理 linux自动运行程序
  13. 第四期coding_group笔记_用CRF实现分词-词性标注
  14. MyBatis源码阅读(十) --- 一级缓存、二级缓存工作原理
  15. AspUpload组件的方法中文说明
  16. Linux命令注销电脑,Linux基本命令-注销、关机、重启
  17. ipa文件上架app store的方法,很简单
  18. codeforces.1253 B
  19. 搜索引擎使用技巧汇总,一篇就够了
  20. html5废弃html4什么,HTML5废弃的标签及属性

热门文章

  1. 【零基础】入门C语言这一篇就够了
  2. C/C++内存管理详解以及内存泄露的检测
  3. 【JAVA百炼成仙】金丹篇——JAVA流程控制
  4. 谷歌浏览器的快捷键一览(图片)
  5. 元宇宙的应用价值体现在哪些方面
  6. API hook原理和实例快速入门(inline hook),以dll线程注入方式使用(win7-64bit)
  7. java的Random类生成随机的double范围【0,1)Math.random()生成0到100之间的数【0-100)【1-100】
  8. linux 跳板机 外网,linux 基于ssh创建跳板机
  9. Linux下如何查看版本信息, 包括位数、版本信息以及CPU内核信息、CPU具体型号
  10. 工业全数字直流调速系统