S3C2440-裸机篇-10 | 使用S3C2440操作Nand Flash
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相关推荐
- NAND FLASH的读写操作(硬件原理图分析)
转载:NAND FLASH的读操作及原理 硬件原理 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面直接引用韦东山老师的课程中的提问: NAND FLASH是 ...
- NAND FLASH的读操作及原理
硬件原理 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面直接引用韦东山老师的课程中的提问: NAND FLASH是一个存储芯片 那么: 这样的操作很合理&q ...
- NAND FLASH 读写操作 简介
NAND FLASH 内存详解与读写寻址方式 一.内存详解 NAND闪存阵列分为一系列128kB的区块(block),这些区块是 NAND器件中最小的可擦除实体.擦除一个区块就是把所有的位(bit)设 ...
- linux系统下操作nandflash指令,Linux驱动之Nand Flash原理及硬件操作
Nand Flash 是一个存储芯片 那么:这样的操作很理" 读地址A的数据,把数据B写到地址A" 问1:原理图上的Nand Flash和SC2440之间只有数据线,怎么传输地址? ...
- uboot研读笔记 | 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)
项目开源地址:https://github.com/Mculover666/uboot-jz2440 0. 教程完整目录 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理 01 ...
- 15.NAND FLASH驱动
NAND FLASH 原理以及操作详见:https://blog.csdn.net/qq_16933601/article/details/100001443 一.基本的问题 NAND FLASH是一 ...
- Linux NAND Flash调试
很久没接触过 nandflash 驱动,最近工作又摸了,于是顺便整理总结一下.nandflash 在我看来算是比较落后的存储设备,所以文章里没有太多细节的东西,更多的是一些开发思路和经验,希望能帮助到 ...
- 嵌入式Linux驱动学习【8】—— Nand Flash
1 Nand Flash 原理图. 引脚: 引脚 功能 IO0~IO7 数据输入输出 CLE 命令锁存 ALE 地址锁存 nCE 芯片使能 nRE 读使能 nWE 写使能 R/nB 就绪/忙 ...
- Nand Flash源码分析(s5pv210)
关于NAND Flash S5PV210的NAND Flash控制器有如下特点: 1) 支持512byte,2k,4k,8k的页大小 2) 通过各种软件模式来进行NAND Flash的读写擦除等 3) ...
最新文章
- 为什么你问问题,别人都已读不回?
- Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源
- 一次诡异的数据库死锁问题排查过程
- 纯Python模块发布setup脚本编写示例
- kusto使用_Python查找具有数据重复问题的Kusto表
- TortoiseSVN客户端重新设置用户名和密码[转]
- 系统搭建遇到问题3:Ubuntu问题造成网卡名称异常导致Vivado绑定网卡地址的Lic无法正常工作(JESD)...
- 1 ~ express ~ 初始化。安装第三方模块express。中间件
- 华为机试——数字颠倒
- PYTHON——多线程:同步条件(Event)
- centos LAMP菜鸟搭建过程
- 命令前加./ ,在后台运行程序 linux批处理 linux自动运行程序
- 第四期coding_group笔记_用CRF实现分词-词性标注
- MyBatis源码阅读(十) --- 一级缓存、二级缓存工作原理
- AspUpload组件的方法中文说明
- Linux命令注销电脑,Linux基本命令-注销、关机、重启
- ipa文件上架app store的方法,很简单
- codeforces.1253 B
- 搜索引擎使用技巧汇总,一篇就够了
- html5废弃html4什么,HTML5废弃的标签及属性
热门文章
- 【零基础】入门C语言这一篇就够了
- C/C++内存管理详解以及内存泄露的检测
- 【JAVA百炼成仙】金丹篇——JAVA流程控制
- 谷歌浏览器的快捷键一览(图片)
- 元宇宙的应用价值体现在哪些方面
- API hook原理和实例快速入门(inline hook),以dll线程注入方式使用(win7-64bit)
- java的Random类生成随机的double范围【0,1)Math.random()生成0到100之间的数【0-100)【1-100】
- linux 跳板机 外网,linux 基于ssh创建跳板机
- Linux下如何查看版本信息, 包括位数、版本信息以及CPU内核信息、CPU具体型号
- 工业全数字直流调速系统