Nand Flash 是一个存储芯片。
 
那么:这样的操作很理“读地址 A 的数据,把数据 B 写到地址 A”
 
问 1:原理图上的 Nand Flash 和 SC2440 之间只有数据线,怎么传输地址?
 
答:在 Data0-Data7 上既传输数据,又传输地址,当 ALE 为高电平时传输的是地址
 
问 2:从 Nand Flash 芯片手册可知,要操作 Nand Flash 需要先发出命令,怎么传入命令。
 
答:在 Data0-Data7 既传输数据,又传输地址,也传输命令
 
当 ALE 为高电平时传输的是地址
 
当 CLE 为高电平时传输的是命令
 
当 ALE 和 CLE 为低电平时传输的是数据
 
问 3:数据线既接到 Nand Flash,也接到 NOR Flash,还接到 SDRAM 等等,怎么避免干扰?
 
答:这些设备,要访问之前必须选中
 
没有选中的芯片不会工作,相当于没有接一样
 
问 4:假设烧写 Nand Flash,把命令、地址、数据发给它之后,Nand Flash 肯定不可能瞬间完成烧写的,怎么判断烧写完成?
 
答:通过状态引脚 RnB 来判断:它为高电平表示就绪,它为低电平正忙。
 
怎么操作 Nand Flash 呢?
 
答:根据 Nand Flash 的芯片手册,一般的过程是:
 
发出命令
 
发出地址
 
读写数据
 
 
以上操作可以从时序图上得到
 
我们先看下 nandflash 的布线
 
 
有 data0 到 data7 八根数据线
 
nandflash 是个存储芯片,那我提出请求:读地址 a 的数据,把数据 b 写到 a 地址上去
 
那么我们看原理图只看到 data0-data7,没有看到地址引脚,那怎么把地址传给我们的开发板
 
复用,这几个引脚即传数据也传地址
 
怎么分别是数据还是地址呢,有个 ALE 信号,当 ALE 是高电平时,传输的是地址
 
但是它不仅只传输地址和数据,还传输命令,在 nand flash 芯片手册可知,要操作 nandflash 要先发出命令,只有八条数据线,怎么传输命令呢???
 
当 CLE 为高电平的时候传输的就是命令,当 ALE 和 CLE 都为低电平的时候传输的是数据。
 
这个 data0 有的开发板不仅仅只接 nandflash,还有的接 norflash 等等非常多的地方
 
数据线 地址线等即接到 nandflash,也接到 norflash,还接到 sdram,DM9000 等等。怎么避免干扰,比如说我访问 nandflash 的时候,norflash 就不要给我提供数据
 
你就要相当与没接一样,怎么避免干扰呢???
 
就是通过这些设备要访问之前,必须选中,什么叫选中呢,他们都有片选信号,就要我们的片选引脚变为低电平选中,就是 cs 引脚,没有选中的芯片不会工作,相当于没接一样
 
假设烧写 nandflash,把数据、命令、地址发给他之后,nandflash 肯定是不可能瞬间完成的,怎么判断烧写完成,通过状态引脚 RnB 来判断,它为高电平表示完成就绪。为低电平表示正忙
 
we 和 re 就是读写信号 ..
 
怎么操作 nandflash
 
根据 nandflash 的芯片手册,一般过程是:发出命令,发出地址,读写数据。
 
nandflash 的命令表格如下
 
 
我们往下看,拿个例子来看,读 ID 这个例子的时序图
 
每个 nandflash 都会内嵌 ID,比如厂家 ID 啊等等。
 
 
时序图 横轴是时间,时序图怎么看呢 ,从左往右看。纵向方向就是一列一列 来看
 
然后可以看到发出命令 90,怎么知道的 ,在数据线上发出 90 这个值,怎么知道它是命令的,就是 CLE 是高电平。然后给它一个写脉冲。这个写信号的上升沿 nandflash 就会把数据存进来,它就知道了我是一个命令。
 
然后接着发出一个 0 地址,然后就可以读数据了。
 
对于我们芯片来说里面集成了一个 nandflash 控制器,内部接线。它帮我们简化了这些操作,
 
nandflash 芯片(rus5pv210)
 
选中芯片
 
发命令的操作 CLE 变为高电平把命令值写到 NFCMD 寄存器里就可以了
 
在 data0-data7 输出命令值
 
提供一个写脉冲
 
选中芯片
 
发地址 ALE 输出高电平
 
在 data0-data7 输出地址值把地址写入 NFADDR 寄存器里就可以了
 
提供一个写脉冲
 
选中芯片
 
发数据 ALE,CLE 输出低电平
 
在 data0-data7 输出数据的值把地址写入 NFDATA 寄存器里就可以了
 
提供一个写脉冲
 
选中芯片
 
读数据 发出一个读脉冲
 
读 data0-data7 的数据
 
我们可以用 uboot 体验 nandflash 的操作
 
1. 读 ID,时序图在上面
选中
 
发出 0x90 命令
 
发出地址 0x00
 
读第一个数据会得到 0xEC
 
读第二个数据得到 device code
 
选中的话芯片手册的 nand flash 章节 可以知道
 
 
选为 0 为选中
 
发出命令就是把命令写到下面这个寄存器里面去
 
 
同理 地址和数据也是一样寄存器如下
 
 
但是在 uboot 里面怎么操作呢
 
uboot 里面有命令可以读内存的
 
md.w 0xB0E0_0004 1 这命令表示读 0xb0e00004 读一次
 
mw.w 是写命令
 
 
md 内存显示 b 是以字节为单位,w 是以 2 字为单位,l 是以四字节为单位
 
 
读 ID 命令流程如图
 
 
读出 dc
 
我们验证一下 nandflash 里面读 ID 下面就有这张图
 
 

 

结束读 ID 的命令 就是 NFCMD 寄存器等于 0xff 就是命令的 reset
 
2. 读数据
我们可以根据 uboot 的 nand dump 0 命令读取 0 地址的数据
 
 
我们来一下 nandflash 读操作的时序图
 
 
为什么中间有五个地址
 
看容量
 
读 00 数据命令如下
 
 
跟上面的输出是一样的