9.NandFlash的驱动_读操作2440

发布者:真诚的友谊最新更新时间:2024-11-04 来源: cnblogs关键字:NandFlash  驱动  读操作 手机看文章 扫描二维码
随时随地手机看文章

在Makefile里添加nand.o,然后新建一个nand.c来实现NandFlash的读操作。

对NandFlash的读方式有两种:

  1. 按页读(需要提供页地址,也就是行地址)。

  2. 随机读(就是读取页里的某一列,需要提供页地址,也就是行地址和列地址)。

实现页读需要两个操作,一个是页地址,另一个是存放读出的数据的变量。所以定义的函数的原型:

void NF_PageRead(unsigned long addr,unsigned char* buff)

该函数根据NandFlash的手册:K9F2G08U0A.pdf中读的操作流程:

上面是TQ2440NandFlash读的操作流程,最下面的I/Ox是I/O pin角的输入输出信号。首先是发送命令:00h。接着是发送5个周期的地址Address(5Cycle):三个周期的行地址和两个周期的列地址。

发送完地址后,紧接着就是发送命令30h。接着就是等待R/B信号变为高电平。从上图可以看到,当我们发送完30h命令后,信号从高电平变成低电平,进入忙的状态。这是CPU开始处理前面发送的命令和地址。等待完后就可以读取数据了。

    上面是页读的流程,但是这里需要补充一些公共的步骤:

    首先你要操作NandFlash,必须要先选中。接着是清除R/B信号。接着才是上面的操作。操作完,最后还得加上:取消选中NandFlash芯片。操作步骤如下:

从上面的步骤可以看到,首先是要选中NandFlash芯片,是通过NFCONT这个寄存器的[1]位来操作的:

从上面的说明看到,如果要Enable chip select,就是把[1]位置为0即可。然后习惯在操作NandFlash前要使能片选,操作完会禁止片选。一般写入0是采用与操作,写入1是采用或操作。所以代码实现:

选中NandFlash芯片:

上面,我们把[1]位先置为1,再取反变为0,最后与NFCONT相与,是NFCONT的[1]位为0.实现片选NandFlash。

上面是取消片选,情况跟使能片选相反。

 

 

接着是R/B信号的处理,它是在NFSTAT寄存器里的:

 

之所以需要先清除R/B信号,这是因为在进行一次NandFlash的操作前要确保上一次的操作已经被清除了,不会影响到这一次的操作。就是要先把这一位变为0,即是清除。然后后面我们只要检查这一位如果是1即可认为NandFlash处于可读写状态。然后注意到跟前面的中断一样,要把某一位变为0,就是往对应的位写入1.

实现代码:

清除完后就是发送命令00h了。

命令00h作为参数,通过send_cmd传递给NFCMD寄存器。

发送完命令就是发送地址了。

首先是发送列地址,但是这里采用按页读的,所以列地址都是0,由于每一次发送0位,所以是0x00,由下面的时序图知道,需要发送两次列地址。

实现代码:

发送完列地址,接着就是发送行地址。行地址是按照从低位到高位的顺序来发送,每次发送8位。三个周期的行地址的方式如下:

 

按照时序图,接下来是发送0x30命令,

发送完命令后进入等待,等待前面的操作完成。完成的标识是R/B信号变为高电平:

等待完R/B信号后,根据时序图,我们就可以实现信号的读取了。

读取是从NFDATA寄存器里面读取的。

每个页的大小在2440里是2K,根据型号不同,值可能不同。最后按页读的操作:

这里实现了NandFlash读的基本操作,但是在前面的学习知道,在操作一个硬件之前必须对该硬件进行初始化操作。

NandFlash初始化的操作流程:

NandFlash初始化要配置NandFlash的配置寄存器NFCONF和寄存器NFCONT

三个时序图的关系:

上面三个参数的取值运算:

我们的nandflash使用的HCLK,频率是100MHz的。那么他每震动一次对应的时间是10ns(1/100MHz).

上面有算TACLS>0ns

TWFPH0>12ns

TWFPH1>5ns的公式。

要实现duration=HCLK*TACLS=10ns*TACLS>0,只需要取TACLS=1,即可。

要实现duration=HCLK*(TWRPH0+1)=10ns*(TWRPH0+1)>12ns,只需要TWRPH0=2即可

要实现duration=HCLK*(TWRPH1+1)=10ns*(TWRPH1+1)>5ns,只需要TWRPH1=1,即可。

上面就是配置NandFlash配置寄存器的参数。

下面是NandFlash的控制寄存器

接下来是初始化我们的NFCONT。

先使能控制器,然后让取消片选:

操作完成还需要第三步是复位操作:

可以看到复位的操作很简单,就是发送FFh命令,然后等待R/B信号,等待从低变高表示完成了。

上面的学习知道,要操作NandFlash,首先要选中NandFlash,然后清除R/B信号。接着才是发送ffh命令来复位NandFlash,等待R/B信号复位完成。最后要取消选中NandFlash。

实现:

最后的NandFlash的初始化流程代码:

到这里我们才完成了NandFlash读的全部操作。

前面的学习知道:

从上面知道,当系统上电后,会拷贝NandFlash里的4KB代码到Stepping Stone去运行。而实际运行stepping stone里代码的是拷贝到内存里去运行的,最大是4KB。所以如果当我们的uboot的代码大于4KB的时候,就会拷贝不全,导致运行出错。

前面之所以要这样做是因为当初没有学习NandFlash的知识,不会直接从NandFlash拷贝代码到内存去运行,而是通过垫脚石。所以下面就直接从NandFlash拷贝代码到内存去运行,这样的程序就完整了。

要实现按页拷贝NandFlash里的内容,首先需要知道页的首地址。

这里地址的0-11位是列地址,即是页内偏移量。我们要的是页地址,所以需要把低12位去掉。按页拷贝的代码:

最后是修改start.S文件:

在内存初始化:

完成之后,由于我们的NandFlash的初始化是用C实现的,所以在调用NandFlash初始化的函数前需要对堆栈进行初始化。所以跳转如下:

最后是跳转到copy_to_ram,即是从iRam拷贝到内存运行的,此时我们是直接把NandFlash的代码拷贝到内存去运行了,所以此处的代码也需要修改。

上面就完成了所有的操作,make编译。

上面是2440和6410的操作步骤,但是210的还需要修改一个寄存器MPLLCON.


关键字:NandFlash  驱动  读操作 引用地址:9.NandFlash的驱动_读操作2440

上一篇:11.串口基本知识
下一篇:10.NandFlash的驱动_写操作

推荐阅读最新更新时间:2026-03-14 00:58

9.NandFlash驱动_操作2440
在Makefile里添加nand.o,然后新建一个nand.c来实现NandFlash的读操作。 对NandFlash的读方式有两种: 按页读(需要提供页地址,也就是行地址)。 随机读(就是读取页里的某一列,需要提供页地址,也就是行地址和列地址)。 实现页读需要两个操作,一个是页地址,另一个是存放读出的数据的变量。所以定义的函数的原型: void NF_PageRead(unsigned long addr,unsigned char* buff) 该函数根据NandFlash的手册:K9F2G08U0A.pdf中读的操作流程: 上面是TQ2440NandFlash读的操作流程,最下面的I/Ox是I/O pin角的输入输
[单片机]
9.<font color='red'>NandFlash</font>的<font color='red'>驱动</font>_<font color='red'>读</font><font color='red'>操作</font><font color='red'>2440</font>
s3c2440 nandflash 初始化
1.什么是 nandflash ? FLASH闪存 闪存的英文名称是 Flash Memory ,一般简称为 Flash ,它属于内存器件的一种,是一种非易失性( Non-Volatile )内存。   NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且像磁盘一样可以通过接口轻松升级。 flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操作只能在空或已擦除的
[单片机]
s3c<font color='red'>2440</font> <font color='red'>nandflash</font> 初始化
s3c2440裸机-nandflash编程-3-初始化及识别
nandFlash命令表 对NAND FLASH的操作需要发出命令,下面有个NAND FLASH的命令表格,那么我们可以此表格上的命令来访问我们的nandflash. 1)时序分析 上面命令表中的读id还不太直观,下图是从nand芯片手册中截取出的读id时序图: ①第一条竖线位置,发送了nCE,CLE,nWE信号,所以90命令被锁存(readID命令); ②第二条竖线位置,发送了nCE,ALE,nWE信号,所以地址00被锁存; 继续往后,命令、地址都发完了,要read数据了,所以释放nWE,ALE,这里tAR表示ALE释放多久后才可以发送nRE信号,tREA表示nRE信号的建立时间; ③第三条竖线位置,发送了nCE,n
[单片机]
s3c2440——Nandflash
简介:   Nandflash与计算机的硬盘类似,用于保存系统运行所必须的操作系统、用户数据、运行过程等各类数据。并且在Nandflash中的数据在掉电后仍可永久保存。 一、目标芯片(K9F1208U0M)   1、此芯片为三星公司生产的容量为64MB。(下图为网上图片、非本人原创)。由下图可以看出,1page = 528byte(其中Data feild = 512bytes、spare = 16bytes)。 1 block = 32 pages = 32 * 528byte。其中可以存储数据的是 (32 * 512byte) = 16KB。然而此芯片有4096个block。所以此芯片的容量可以计算得出:(4096 * 3
[单片机]
s3c<font color='red'>2440</font>——<font color='red'>Nandflash</font>
s3c2440裸机-nandflash编程(二. nand控制器和nand访问时序)
一.Steppingstone 我们知道nand没有独立地址线,cpu无法直接访问nand上的指令,所以nand不能片上执行。那么为何程序还能支持nand启动的呢? 为了支持NAND启动,S3C2440A配备了一个称为“ Steppingstone”的内部SRAM缓冲区,容量为4K。 开机时,Nandflash中的前4K数据将被加载到Steppingstone中,而引导代码将被加载到SRAM中将被执行,如下图所示: 我们知道s3c2440支持2种boot方式,nand或者nor,那么需要配置OM引脚来设置引导方式,如下图: 内存控制器的地址映射表如下: 我们得知OM1接地,OM0接了一个开关SW2,那么我们的OM
[单片机]
s3c<font color='red'>2440</font>裸机-<font color='red'>nandflash</font>编程(二. nand控制器和nand访问时序)
【JZ2440笔记】裸机实验使用NandFlash
一、前言 S3C2440芯片内部没有ROM可以放用户代码,所以用户代码需要被保存在外部的存储器当中,如果是NorFlash的话可以直接在NorFlash中运行程序,但是NorFlash比较贵,一般都用NandFlash作为存储介质,以SDRAM为代码的运行空间。JZ2440开发板上有一颗256MB容量的NandFlash芯片,记录下学习过程,代码是开发板自带的例程。 二、实验目标 在SRAM运行程序关闭看门狗,初始化SDRAM,初始化NandFlash控制器,随后将NandFlash块1中的main.c部分代码拷贝到SDRAM中运行,看到开发板上3个LED显示流水灯效果。 三、资源分析 NandFlash型号K9F2G
[单片机]
【JZ<font color='red'>2440</font>笔记】裸机实验使用<font color='red'>NandFlash</font>
s3c2440 K9F2G08 nandflash支持硬件ECC校验
S3c2440的nandflash K9F2G08是支持硬件ECC的,NandFlash的每一页分为main区和spare区,S3C2440的NandFlash控制器支持这两个区的硬件ECC,这里我们实现main区的硬件ECC。在include/configs/fl2440.h文件中,如果我们定义了nandflash的硬件ECC校验,那么我们就可以控制相应的nandflash寄存器,实现硬件ECC。 nandflash的每一页有两区:main区和spare区,main区用于存储正常的数据,spare区用于存储其他附加信息,其中就包括ECC校验码。 当我们在写入数据的时候,我们就计算这一页数据的ECC校验码,然后把校验码
[单片机]
u-boot-2016.03 在mini2440移植之nandflash读写
在“NorFlash启动”一文中,我们把drivers/mtd/nand/s3c2410_nand.c文件复制为s3c2440_nand.c文件,并把该文件内的所有有关“2410”的地方一律改为“2440”。这么修改仅仅是能够让系统编译成功,并没有真正实现NandFlash的读写。在这里,我们就来介绍如何让u-boot支持NandFlash的读写。 由于s3c2410与s3c2440的NandFlash控制器不一样,因此s3c2440_nand.c文件并不能直接应用,需要进行适当的修改,而主要修改的内容就是s3c2440的相关寄存器。 首先重新定义要用到的寄存器,把原文中第27行至第37行之间的宏定义去掉,改为下面的形式:
[单片机]
u-boot-2016.03 在mini<font color='red'>2440</font>移植之<font color='red'>nandflash</font>读写
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved