s3c2440对nandflash的操作1

发布者:真诚相伴最新更新时间:2024-08-30 来源: cnblogs关键字:s3c2440  nandflash 手机看文章 扫描二维码
随时随地手机看文章

nandflash在对大容量的数据存储中发挥着重要的作用。相对于norflash,它具有一些优势,但它的一个劣势是很容易产生坏块,因此在使用nandflash时,往往要利用校验算法发现坏块并标注出来,以便以后不再使用该坏块。nandflash没有地址或数据总线,如果是8位nandflash,那么它只有8个IO口,这8个IO口用于传输命令、地址和数据。nandflash主要以page(页)为单位进行读写,以block(块)为单位进行擦除。每一页中又分为main区和spare区,main区用于正常数据的存储,spare区用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等。

 

三星公司是最主要的nandflash供应商,因此在它所开发的各类处理器中,实现对nandflash的支持就不足为奇了。s3c2440不仅具有nandflash的接口,而且还可以利用某些机制实现直接从nandflash启动并运行程序。本文只介绍如何对nandflash实现读、写、擦除等基本操作,不涉及nandflash启动程序的问题。

 

在这里,我们使用的nandflash为K9F2G08U0A,它是8位的nandflash。不同型号的nandflash的操作会有所不同,但硬件引脚基本相同,这给产品的开发带来了便利。因为不同型号的PCB板是一样的,只要更新一下软件就可以使用不同容量大小的nandflash。

 

K9F2G08U0A的一页为(2K+64)字节(加号前面的2K表示的是main区容量,加号后面的64表示的是spare区容量),它的一块为64页,而整个设备包括了2048个块。这样算下来一共有2112M位容量,如果只算main区容量则有256M字节(即256M×8位)。要实现用8个IO口来要访问这么大的容量,K9F2G08U0A规定了用5个周期来实现。第一个周期访问的地址为A0~A7;第二个周期访问的地址为A8~A11,它作用在IO0~IO3上,而此时IO4~IO7必须为低电平;第三个周期访问的地址为A12~A19;第四个周期访问的地址为A20~A27;第五个周期访问的地址为A28,它作用在IO0上,而此时IO1~IO7必须为低电平。前两个周期传输的是列地址,后三个周期传输的是行地址。通过分析可知,列地址是用于寻址页内空间,行地址用于寻址页,如果要直接访问块,则需要从地址A18开始。

 

由于所有的命令、地址和数据全部从8位IO口传输,所以nandflash定义了一个命令集来完成各种操作。有的操作只需要一个命令(即一个周期)即可,而有的操作则需要两个命令(即两个周期)来实现。下面的宏定义为K9F2G08U0A的常用命令:

 

#define CMD_READ1                 0x00              //页读命令周期1

#define CMD_READ2                 0x30              //页读命令周期2

#define CMD_READID               0x90              //读ID命令

#define CMD_WRITE1               0x80              //页写命令周期1

#define CMD_WRITE2               0x10              //页写命令周期2

#define CMD_ERASE1               0x60              //块擦除命令周期1

#define CMD_ERASE2               0xd0              //块擦除命令周期2

#define CMD_STATUS                0x70              //读状态命令

#define CMD_RESET                 0xff               //复位

#define CMD_RANDOMREAD1         0x05       //随意读命令周期1

#define CMD_RANDOMREAD2         0xE0       //随意读命令周期2

#define CMD_RANDOMWRITE         0x85       //随意写命令

 

在这里,随意读命令和随意写命令可以实现在一页内任意地址地读写。读状态命令可以实现读取设备内的状态寄存器,通过该命令可以获知写操作或擦除操作是否完成(判断第6位),以及是否成功完成(判断第0位)。

 

       下面介绍s3c2440的nandflash控制器。s3c2440支持8位或16位的每页大小为256字,512字节,1K字和2K字节的nandflash,这些配置是通过系统上电后相应引脚的高低电平来实现的。s3c2440还可以硬件产生ECC校验码,这为准确及时发现nandflash的坏块带来了方便。nandflash控制器的主要寄存器有NFCONF(nandflash配置寄存器),NFCONT(nandflash控制寄存器),NFCMMD(nandflash命令集寄存器),NFADDR(nandflash地址集寄存器),NFDATA(nandflash数据寄存器),NFMECCD0/1(nandflash的main区ECC寄存器),NFSECCD(nandflash的spare区ECC寄存器),NFSTAT(nandflash操作状态寄存器),NFESTAT0/1(nandflash的ECC状态寄存器),NFMECC0/1(nandflash用于数据的ECC寄存器),以及NFSECC(nandflash用于IO的ECC寄存器)。

 

       NFCMMD,NFADDR和NFDATA分别用于传输命令,地址和数据,为了方便起见,我们可以定义一些宏定义用于完成上述操作:

 

#define NF_CMD(data)               {rNFCMD  = (data); }        //传输命令

#define NF_ADDR(addr)             {rNFADDR = (addr); }         //传输地址

#define NF_RDDATA()               (rNFDATA)                         //读32位数据

#define NF_RDDATA8()              (rNFDATA8)                       //读8位数据

#define NF_WRDATA(data)         {rNFDATA = (data); }          //写32位数据

#define NF_WRDATA8(data)       {rNFDATA8 = (data); }        //写8位数据

 

其中rNFDATA8的定义为(*(volatile unsigned char *)0x4E000010)。

 

       NFCONF主要用到了TACLS、TWRPH0、TWRPH1,这三个变量用于配置nandflash的时序。s3c2440的数据手册没有详细说明这三个变量的具体含义,但通过它所给出的时序图,我们可以看出,TACLS为CLE/ALE有效到nWE有效之间的持续时间,TWRPH0为nWE的有效持续时间,TWRPH1为nWE无效到CLE/ALE无效之间的持续时间,这些时间都是以HCLK为单位的(本文程序中的HCLK=100MHz)。通过查阅K9F2G08U0A的数据手册,我们可以找到并计算该nandflash与s3c2440相对应的时序:K9F2G08U0A中的tWP与TWRPH0相对应,tCLH与TWRPH1相对应,(tCLS-tWP)与TACLS相对应。K9F2G08U0A给出的都是最小时间,s3c2440只要满足它的最小时间即可,因此TACLS、TWRPH0、TWRPH1这三个变量取值大一些会更保险。在这里,这三个值分别取1,2和0。NFCONF的第0位表示的是外接的nandflash是8位IO还是16位IO,这里当然要选择8位的IO。NFCONT寄存器是另一个需要事先初始化的寄存器。它的第13位和第12位用于锁定配置,第8位到第10位用于nandflash的中断,第4位到第6位用于ECC的配置,第1位用于nandflash芯片的选取,第0位用于nandflash控制器的使能。另外,为了初始化nandflash,还需要配置GPACON寄存器,使它的第17位到第22位与nandflash芯片的控制引脚相对应。下面的程序实现了初始化nandflash控制器:

 

void NF_Init ( void )

{

rGPACON = (rGPACON &~(0x3f<<17)) | (0x3f<<17);            //配置芯片引脚

//TACLS=1、TWRPH0=2、TWRPH1=0,8位IO

rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);

//非锁定,屏蔽nandflash中断,初始化ECC及锁定main区和spare区ECC,使能nandflash片选及控制器

       rNFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);

}

 

       为了更好地应用ECC和使能nandflash片选,我们还需要一些宏定义:

 

#define NF_nFCE_L()                        {rNFCONT &= ~(1<<1); }

#define NF_CE_L()                            NF_nFCE_L()                                   //打开nandflash片选

#define NF_nFCE_H()                       {rNFCONT |= (1<<1); }

#define NF_CE_H()                           NF_nFCE_H()                            //关闭nandflash片选

#define NF_RSTECC()                       {rNFCONT |= (1<<4); }                     //复位ECC

#define NF_MECC_UnLock()             {rNFCONT &= ~(1<<5); }          //解锁main区ECC

#define NF_MECC_Lock()                 {rNFCONT |= (1<<5); }                     //锁定main区ECC

#define NF_SECC_UnLock()                     {rNFCONT &= ~(1<<6); }          //解锁spare区ECC

#define NF_SECC_Lock()                  {rNFCONT |= (1<<6); }                     //锁定spare区ECC

 

       NFSTAT是另一个比较重要的寄存器,它的第0位可以用于判断nandflash是否在忙,第2位用于检测RnB引脚信号:

 

#define NF_WAITRB()                {while(!(rNFSTAT&(1<<0)));}           //等待nandflash不忙

#define NF_CLEAR_RB()           {rNFSTAT |= (1<<2); }                      //清除RnB信号

#define NF_DETECT_RB()         {while(!(rNFSTAT&(1<<2)));}           //等待RnB信号变高,即不忙

 

       下面就详细介绍K9F2G08U0A的基本操作,包括复位,读ID,页读、写数据,随意读、写数据,块擦除等。

 

       复位操作最简单,只需写入复位命令即可:

 

static void rNF_Reset()

{

       NF_CE_L();                               //打开nandflash片选

[1] [2] [3] [4]
关键字:s3c2440  nandflash 引用地址:s3c2440对nandflash的操作1

上一篇:嵌入式学习之Nand Flash
下一篇:uboot环境变量与内核MTD分区关系

推荐阅读最新更新时间:2024-11-16 21:57

S3C2440声卡驱动移植、测试以及madplay播放mp3文件(三十一)
本节学习: 分析linux中的OOS声卡系统 修改s3c2410-uda1341.c的控制部分,移植wm8976声卡 使用madplay应用程序播放mp3 本节常用英语单词: volume:音量,dsp:数字信号处理(Digital Signal Processing),mixer:混音器,unit:单位,个体 1、声音三要素 采样频率 音频采样率是指录音设备在一秒钟内对声音信号的采样次数,常用的采样率有: 8KHz ---电话所用采样率,对于人的说话已经足够清楚 22.05KHz ---无线电广播所用采样率 32KHz ---miniDV数码视频、DAT所用采样率 44.1KHz ---音频CD,也常用于
[单片机]
<font color='red'>S3C2440</font>声卡驱动移植、测试以及madplay播放mp3文件(三十一)
s3c2440串口接收中断(OK2440III)
#include uart2440.h #include def.h #include 2440addr.h #include led2440.h // 引入led #define UART_CLK 50000000 // UART0的时钟源设为PCLK #define UART_BRUD(baud) { rUBRDIV0 = ((UART_CLK / (baud * 16)) - 1) } void __irq uart_irq_recv(void) { uint8 buf_recv; uint8 buf = 接收中断发生...rn ; uart_send(buf); buf_recv
[单片机]
s3c2440学习之路-007uart的简单配置
1.基本知识 串口算是各种芯片最基本的功能之一,串口配置好后程序就可以通过串口来打印各种信息,方便代码的调试。 串口最主要的参数有4个:波特率,数据宽度, 校验位,停止位 常用的串口配置为:波特率115200,8bit数据宽度,无校验位,1bit停止位,通常缩写为115200 8N1 2440有3组UART, 每组UART都有2个64Bytes 的FIFO jz2240使用的串口0与电脑通信,之间通过PL2303来转换电脑和开发板之间的逻辑电平。 2.主要寄存器 2.1 GPHCON & GPHUP 串口需要用的Pin脚就3个:Tx,RX,GND, 因此首先需要把对应的Pin设置为TX,RD模式,除此外,还需
[单片机]
<font color='red'>s3c2440</font>学习之路-007uart的简单配置
S3C2440串口(1)
1.S3C2440串口概述 串口通讯一般要增加电平转换电路,原因是TTL/CMOS电平与RS232电平不一致: TTL/CMOS电平: CMOS电平: 常用的电平转换芯片是MAX3232。 S3C2440有3个独立的异步串口,可以选择工作在中断或DMA方式下。每个UART包括一个波特率发生器、发送器、接收器和一个控制单元。 UART有FIFO模式和非FIFO模式。FIFO模式下可以利用64字节的发送/接收缓冲寄存器,非FIFO模式下只使用了发送/接收缓冲寄存器中的1个字节。本篇入门级以非FIFO为例。 2.串口设置及相关寄存器 串口引脚是GPIO复用的。本篇UART只用3根引脚:TXD、RXD、GND。 TXD0 –
[单片机]
s3c2440环境搭建与通过JTAG调试
JTAG JTAG作用 芯片检测 实现ISP-在线调试 对Flash等器件进行编程,即在线烧录Flash,目前JTAG发展成广泛采用的IC调试接口 安装Keil 我个人觉得可以安装keil4.72,之前装了keil5有一些MCU找不到。MDK4.72自行百度。 安装好后,要先进行破解,不然编译会出错哦,具体破解教程自行查找。
[单片机]
<font color='red'>s3c2440</font>环境搭建与通过JTAG调试
S3C2440中断寄存器有关
1.中断分两大类:内部中断和外部中断。 2.外部中断。24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体参考datesheet数据手册。 寄存器: EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23的触发方式。 EINTFLT0-EINTFLT3:控制滤波时钟和滤波宽度。 EINTPEND:这个是中断挂起寄存器,清除时要写1,后面还有几个是写1清除。当一个外部中断(EINT4-EINT23)发生后,那么相应的位会被置1。为什么没有EINT0-EINT3,呵呵,看看SRCPND就知道
[单片机]
<font color='red'>S3C2440</font>中断寄存器有关
东芝产能出现大幅损失纯属谣言,对第四季供货影响有限
  集邦咨询半导体研究中心(DRAMeXchange)指出,针对近期市场传出 东芝 产能出现问题,并致使产出晶圆损失高达10万片一事,经调查与确认后, 东芝 产线确实遭遇到一些问题,并致使整体产出量较原先预期少,但影响程度绝对远低于外界所谣传接近10万片的规模,且工厂产线亦未出现停摆。对于 东芝 客户而言,在第四季议价时所承诺的交货数量也没有受到直接冲击。下面就随网络通信小编一起来了解一下相关内容吧。   DRAMeXchange资深研究经理陈玠玮指出,此一事件后,不论对于第四季或是明年第一季的供需市况皆不会产生任何剧烈影响。对于现货市场而言,在此消息传出后并没有导致任何模组厂停止报价及出货,预估东芝在解决产线问题后,能立即降低
[网络通信]
基于LabVIEW的手持数字波形表的界面设计
  将LabVIEW设计的虚拟仪器程序移植到运行WindowsCE的便携式手持设备上。可以极大地提高嵌入式系统软件开发效率。具体提出一种有效解决数据波形交替显示的界面设计,阐述了如何使用LabVIEW的触摸屏toueh panel模块开发的数字波形表用于Windows CE 5.0设备的测试项目的案例。    1 开发平台简介   1.1 基础平台   本文设计的数字波形表采用高性能、低功耗、高集成度的S3C2440A微处理器。触摸屏配合采用S3C2440A的高速处理器驱动,具有更好的视频显示效果。   1.2 软件平台   LabVIEW是美国国家仪器公司推出的一种虚拟仪器开发平台。LabVIEW包含有很多的模块,to
[测试测量]
基于LabVIEW的手持数字波形表的界面设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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