匿名
未登录
登录
百问网嵌入式Linux wiki
搜索
查看“第016课 Nand Flash”的源代码
来自百问网嵌入式Linux wiki
名字空间
页面
讨论
更多
更多
页面选项
Read
查看源代码
历史
←
第016课 Nand Flash
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
该页面已被保护以防止编辑和其他操作。
您可以查看与复制此页面的源代码。
= 第001节_NAND_FLASH操作原理 = [[File:chapter16_lesson1_001.png|800px]] NAND FLASH原理图 NAND FLASH是一个存储芯片 那么: 这样的操作很合理"读地址A的数据,把数据B写到地址A" 问1. 原理图上NAND FLASH和S3C2440之间只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址当ALE为高电平时传输的是地址, 那么在数据线上是不是只传输数据和只传输地址呢? 我们参考NAND FLASH的芯片手册可以知道,对NAND FLASH的操作还需要发出命令,下面有个NAND FLASH的命令表格 [[File:chapter16_lesson1_002.png|800px]] 问2. 从NAND FLASH芯片手册可知,要操作NAND FLASH需要先发出命令怎么传入命令? 答2.在DATA0~DATA7上既传输数据,又传输地址,也传输命令: 1. 当ALE为高电平时传输的是地址。 2. 当CLE为高电平时传输的是命令。 3. 当ALE和CLE都为低电平时传输的是数据。 问3. 数据线既接到NAND FLASH,也接到NOR FLASH,还接到SDRAM、DM9000等等 那么怎么避免干扰? 答3. 这些设备,要访问之必须"选中",没有选中的芯片不会工作,相当于没接一样。 问4. 假设烧写NAND FLASH,把命令、地址、数据发给它之后,NAND FLASH肯定不可能瞬间完成烧写的,怎么判断烧写完成? 答4. 通过状态引脚RnB来判断:它为高电平表示就绪,它为低电平表示正忙 问5. 怎么操作NAND FLASH呢? 答5. 根据NAND FLASH的芯片手册,一般的过程是: 发出命令 发出地址 发出数据/读数据 看上面的命令表格,不容易看,我们看一下读ID的时序图, [[File:chapter16_lesson1_003.png|800px]] 每个NAND FLASH都内嵌一些ID(譬如:厂家ID,设备ID),时序图从左往右看,纵向放是一列一列的看。 对于我们s3c2440来说,内部集成了一个NAND FLASH控制器,2440和外设连接的简易图,如下图所示 [[File:chapter16_lesson1_004.png|800px]] NAND FLASH控制器,帮我们简化了对NAND FLASH的操作,下面来分析一下不使用NAND FLASH控制器和使用NAND FLASH控制器对外设NAND FLASH的操作。 '''发命令:''' {| class="wikitable" |- ! NAND FLASH !! S3C2440 |- | 选中芯片 || NFCMMD=命令值 |- | CLE设为高电平 || |- | 在DATA0~DATA7上输出命令值 || |- | 发出一个写脉冲 || |} '''发地址:''' {| class="wikitable" |- ! NAND FLASH !! S3C2440 |- | 选中芯片 || NFADDR=地址值 |- | ALE设为高电平 || |- | 在DATA0~DATA7上输出地址值 || |- | 发出一个写脉冲 || |} '''发数据:''' {| class="wikitable" |- ! NAND FLASH !! S3C2440 |- | 选中芯片 || NFDATA=数据值 |- | ALE,CLE设为低电平 || |- | 在DATA0~DATA7上输出数据值 || |- | 发出一个写脉冲 || |} '''读数据 :''' {| class="wikitable" |- ! NAND FLASH !! S3C2440 |- | 选中芯片 || val=NFDATA |- | 发出读脉冲 || |- | 读DATA0~DATA7的数据 || |} '''用UBOOT来体验NAND FLASH的操作:''' 1. 读ID {| class="wikitable" |- ! !! 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 |- | 退出读ID的状态 || NFCMMD=0xff || mw.b 0x4E000008 0xff |} 下图是读操作时序图 [[File:chapter16_lesson1_005.png|800px]] 对于存储为256M的NAND FLASH,需要28条地址线,来表示这个地址值,根据原理图可以,只用8根地址线,所以需要4个周期的地址,为了兼容更大容量的NAND FLASH,要发出5个周期的地址:(如下图所示) [[File:chapter16_lesson1_006.png|800px]] 2,读数据 {| class="wikitable" |- ! !! 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时序及初始化 = {| class="wikitable" |- ! 存储芯片的编程 !! NAND FLASH存储芯片编程 |- | 初始化 || 主控芯片的NAND FLASH控制器的初始化 |- | 识别 || 读取ID |- | 读操作 || 一次读一个页(page) |- | 写操作 || 一次写一个页(page) |- | 擦除 || 一次擦除一个块(block) |} NAND FLASH控制器的时序,是为了让NAND FLASH外设工作起来,假如外接不同的 NAND FLASH外设,那么它的操作时序可能就会不同,所以NAND FLASH控制器发出 的时序图,就是不一样的,所以我们根据NAND FLASH外设来设置NAND FLASH控制器, [[File:chapter16_lesson2_001.png|800px]] NAND FLASH时序图,如下所示: [[File:chapter16_lesson2_002.png|800px]] [[File:chapter16_lesson2_003.png|800px]] [[File:chapter16_lesson2_004.png|800px]] 我们在汇编语言中已经设置HCLK为100MHZ,一个周期T = 1000/100 = 10s,通过上面三个图可以知道:TACLS的值可以为0;TWRPH0的值可以为1;TWRPH1的值可以为0。 [[File:chapter16_lesson2_005.png|800px]] 所以NFCONF寄存器设置如下: <syntaxhighlight lang="c" > #define TACLS 0 #define TWRPH0 1 #define TWRPH1 0 /*设置NAND FLASH的时序*/ NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4); </syntaxhighlight> 到此设置NAND FLASH的时序已经设置完了,我们接着来使能,使能实在NFCONT。 [[File:chapter16_lesson2_006.png|800px]] MODE [0]: 设置为1,使能NAND FLASH。 Reg_nCE [1]: 设置为1,禁止片选。因为我们现在还没有使用。为例错误的操作。 InitECC [4]: 初始化ECC的编码器,后边要使用,我们设置为1,来初始化。 所以NFCONF寄存器设置如下: <syntaxhighlight lang="c" > /*使能NAND FLASH控制器,初始化ECC,禁止片选*/ NFCONT = (1<<4) | (1<<1) | (1<<0); </syntaxhighlight>
返回至
第016课 Nand Flash
。
导航
导航
WIKI首页
官方店铺
资料下载
交流社区
所有页面
所有产品
MPU-Linux开发板
MCU-单片机开发板
Linux开发系列视频
单片机开发系列视频
所有模块配件
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志