“第016课 Nand Flash”的版本间的差异
Baiwen root(讨论 | 贡献) 小 (保护“第016课 Nand Flash”([编辑=仅允许管理员](无限期)[移动=仅允许管理员](无限期))) |
|||
第1行: | 第1行: | ||
− | + | = 第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 | ||
+ | |} |
2018年2月2日 (五) 17:29的版本
第001节_NAND_FLASH操作原理
NAND FLASH原理图
NAND FLASH是一个存储芯片
那么: 这样的操作很合理"读地址A的数据,把数据B写到地址A"
问1. 原理图上NAND FLASH和S3C2440之间只有数据线,怎么传输地址?
答1.在DATA0~DATA7上既传输数据,又传输地址当ALE为高电平时传输的是地址,
那么在数据线上是不是只传输数据和只传输地址呢?
我们参考NAND FLASH的芯片手册可以知道,对NAND FLASH的操作还需要发出命令,下面有个NAND FLASH的命令表格 问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的芯片手册,一般的过程是:
发出命令
发出地址
发出数据/读数据
每个NAND FLASH都内嵌一些ID(譬如:厂家ID,设备ID),时序图从左往右看,纵向放是一列一列的看。
对于我们s3c2440来说,内部集成了一个NAND FLASH控制器,2440和外设连接的简易图,如下图所示
NAND FLASH控制器,帮我们简化了对NAND FLASH的操作,下面来分析一下不使用NAND FLASH控制器和使用NAND FLASH控制器对外设NAND FLASH的操作。
发命令:
NAND FLASH | S3C2440 |
---|---|
选中芯片 | NFCMMD=命令值 |
CLE设为高电平 | |
在DATA0~DATA7上输出命令值 | |
发出一个写脉冲 |
发地址:
NAND FLASH | S3C2440 |
---|---|
选中芯片 | NFADDR=地址值 |
ALE设为高电平 | |
在DATA0~DATA7上输出地址值 | |
发出一个写脉冲 |
发数据:
NAND FLASH | S3C2440 |
---|---|
选中芯片 | NFDATA=数据值 |
ALE,CLE设为低电平 | |
在DATA0~DATA7上输出数据值 | |
发出一个写脉冲 |
读数据 :
NAND FLASH | S3C2440 |
---|---|
选中芯片 | 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 |
退出读ID的状态 | NFCMMD=0xff | mw.b 0x4E000008 0xff |
对于存储为256M的NAND FLASH,需要28条地址线,来表示这个地址值,根据原理图可以,只用8根地址线,所以需要4个周期的地址,为了兼容更大容量的NAND FLASH,要发出5个周期的地址:(如下图所示)
2,读数据
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 |