“第016课 Nand Flash”的版本间的差异

来自百问网嵌入式Linux wiki
(保护“第016课 Nand Flash”([编辑=仅允许管理员](无限期)[移动=仅允许管理员](无限期)))
第1行: 第1行:
<categorytree mode=all style="float:right; clear:right; margin-left:1ex; border:1px solid gray; padding:0.7ex; background-color:white;">ARM裸机加强版</categorytree>
+
= 第001节_NAND_FLASH操作原理 =
[[Category:ARM裸机加强版 ]]
+
[[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操作原理

Chapter16 lesson1 001.png

NAND FLASH原理图

NAND FLASH是一个存储芯片

那么: 这样的操作很合理"读地址A的数据,把数据B写到地址A"


问1. 原理图上NAND FLASH和S3C2440之间只有数据线,怎么传输地址?

答1.在DATA0~DATA7上既传输数据,又传输地址当ALE为高电平时传输的是地址,


那么在数据线上是不是只传输数据和只传输地址呢?

我们参考NAND FLASH的芯片手册可以知道,对NAND FLASH的操作还需要发出命令,下面有个NAND FLASH的命令表格 Chapter16 lesson1 002.png 问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的时序图, Chapter16 lesson1 003.png

每个NAND FLASH都内嵌一些ID(譬如:厂家ID,设备ID),时序图从左往右看,纵向放是一列一列的看。

对于我们s3c2440来说,内部集成了一个NAND FLASH控制器,2440和外设连接的简易图,如下图所示 Chapter16 lesson1 004.png

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

下图是读操作时序图 Chapter16 lesson1 005.png

对于存储为256M的NAND FLASH,需要28条地址线,来表示这个地址值,根据原理图可以,只用8根地址线,所以需要4个周期的地址,为了兼容更大容量的NAND FLASH,要发出5个周期的地址:(如下图所示) Chapter16 lesson1 006.png

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