nand flash 读写(基本操作)
怎么看时序图--nand flash的读操作详解
这篇文章不是介绍nand flash的物理结构和关于nand flash的一些基本知识的。
你需要至少了解你手上的nand flash的物理结构和一些诸如读写命令操作的大概印象,你至少也需要看过s3c2440中关于nand flash控制寄存器的说明。
由于本人也没有专门学过这方面的知识,下面的介绍也是经验之谈。
这里我用的K9F2G08-SCB0 这款nand flash 来介绍时序图的阅读。
不同的芯片操作时序可能不同,读的命令也会有一些差别。
当然其实有时候像nand flash这种s3c2440内部集成了他的控制器的外设。
具体到读写操作的细节时序(比如CLE/ALE的建立时间,写脉冲的宽度。
数据的建立和保持时间等),不明白前期也没有多大的问题。
因为s3c2440内部的nand flash控制器做了大部分的工作,你需要做的基本就是设置几个时间参数而已。
然后nand flash会自动进行这些细节操作。
当然如果处理器上没有集成nand flash的控制器那么久必须要自己来写时序操作了。
所以了解最底层的时序操作总是好的但是上层一点的,比如读写操作的步骤时序(比如读操作,你要片选使能,然后发命令,然后发地址,需要的话还需发一个命令,然后需要等待操作完成,然后再读书数据)。
是必须要明白的。
这都不明白的话,怎么进行器件的操作呢也就是说s3c2440 可以说在你设置很少的几个时间参数后,将每一个步骤中细微的操作都替你做好了。
(比如写命令,你只要写个命令到相应寄存器中,cpu内部就会协各个引脚发出适应的信号来实现写命令的操作)。
而我们所需要做的就是把这些写命令,写地址,等待操作完成。
等步骤组合起来。
从而完成一个读操作就像上面说的,虽然我们不会需要去编写每个步骤中的最细微的时序。
但是了解下。
会让你对每个操作步骤的底层细节更加明了先来看一个命令锁存的时序。
也就是上面说的读nand flash操作中不是有一个写命令步骤吗。
Nand Flash的读写操作
NandFlash的读写操作正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。
一般而言,block、page之间的关系随着芯片的不同而不同,典型的分配是这样的:1block = 32page1 page = 512bytes(datafield) + 16bytes(oob)需要注意的是,对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash 的擦写,而擦写则是以一个block为单位的。
同时必须提醒的是,512bytes理论上被分为1st half 和2sd half,每个half各占256个字节。
我们讨论的K9F1208U0B总共有4096 个Blocks,故我们可以知道这块flash的容量为4096 *(32 *528)= 69206016 Bytes = 66 MB但事实上每个Page上的最后16Bytes是用于存贮检验码和其他信息用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为4096 *(32 *512) = 67108864 Bytes = 64 MB 由上图所示,1个Page总共由528 Bytes组成,这528个字节按顺序由上而下以列为单位进行排列(1列代表一个Byte。
第0行为第0 Byte ,第1行为第1 Byte,以此类推,每个行又由8个位组成,每个位表示1个Byte里面的1bit)。
这528Bytes按功能分为两大部分,分别是Data Field和Spare Field,其中Spare Field占528Bytes里的16Bytes,这16Bytes是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,除去这16Bytes,剩下的512Bytes便是我们用于存放数据用的Data Field,所以一个Page上虽然有528个Bytes,但我们只按512Bytes进行容量的计算。
[转载]FLASH的读写
[转载]FLASH的读写(这是一篇来自网上的文章,仅供参考。
)所谓Flash,是内存(Memory)的一种,但兼有RAM和ROM 的优点,是一种可在系统(In-System)进行电擦写,掉电后信息不丢失的存储器,同时它的高集成度和低成本使它成为市场主流。
芯片是由内部成千上万个存储单元组成的,每个单元存储一个bit。
具有低功耗、大容量、擦写速度快、可整片或分扇区在系统编程(烧写)、擦除等特点,并且可由内部嵌入的算法完成对芯片的操作,因而在各种嵌入式系统中得到了广泛的应用。
作为一种非易失性存储器,Flash在系统中通常用于存放程序代码、常量表以及一些在系统掉电后需要保存的用户数据等。
常用的Flash为8位或16位的数据宽度,编程电压为单3.3V。
主要的生产厂商为INTEL、ATMEL、AMD、HYUNDAI等。
Flash 技术根据不同的应用场合也分为不同的发展方向,有擅长存储代码的NOR Flash和擅长存储数据的NAND Flash。
一下对NOR Flash和NAND Flash的技术分别作了相应的介绍。
随着技术的发展,愈来愈多的电子产品需要更多的智能化,这也对这些产品的程序存储提出了更高的要求。
Flash 作为一种低成本、高集成度的存储技术在电子产品领域的应用非常广泛。
今天90%的PC、超过90%的手机、超过50%的Modem,都是用了Flash,如今Flash 市场规模已经超过了100亿美元。
如此巨大的市场规模,也导致市场上的Flash 品牌层出不穷。
在NOR Flash市场中,Intel公司是非常重要的一家生产厂商。
Intel公司生产的Flash芯片多年来占据着市场的很大份额,而它的芯片封装形式和接口也成为业界标准,从而为不同品牌的Flash带来了兼容的方便。
首先,Flash 要通过系统总线接在处理器上,即保持一个高速的数据交换的通道。
那么就必须了解一下Flash在系统总线上的基本操作。
1)先了解一下处理器存储空间BANK的概念。
NANDFlash读写技术
NAND Flash控制器S3C2410板的Nand Flash支持由两部分组成:Nand Flash控制器(集成在S3C2410 CPU)和Nand Flash存储芯片(K9F1208U0B)两部分组成。
当要访问Nand Flash中的数据时,必须通过Nand Flash控制器发送命令才能完成。
所以Nand Flash相当于S3C2410的一个外设,而不位于它的内存地址区.为了支持NAND Flash的启动装载,S3C2410A配置了一个叫Steppingstone的内部SRAM缓冲器。
当系统启动时,NAND Flash存储器的前4KB将被自动加载到Steppingstone中,然后系统自动执行这些载入的启动代码。
一般情况下,这4KB的启动代码需要将NAND Flash中的内容复制到SDRAM中。
使用S3C2410A内部硬件ECC功能可以对NAND Flash的数据进行有效性的检查。
复制完成后,将在SDRAM中执行主程序。
NAND Flash控制其具有以下特性:* NAND Flash模式:支持读/擦除/编程NAND Flash存储器。
* 自动启动模式:复位后,启动代码被传送到Steppingstone中。
传送完毕后,启动代码在Steppingstone 中执行。
* 具备硬件ECC(校验码:Error Correction Code)生成模块(硬件生成校验码,通过软件校验)* NAND Flash启动以后,4KB的内部SRAM缓冲器Steppingstone可以作为其他用途使用。
* NAND Flash控制器不能通过DMA访问,可以使用LDM/STM指令来代替DMA操作。
自启动模式的执行步骤如下:(1)完成复位(2)如果自动启动模式使能,NAND Flash存储器的前4KB自动复制到Steppingstone内部缓冲器;(3)Steppingstone映射到nGCS0;(4)CPU在Steppingstone的4KB内部缓冲器中开始执行启动代码。
NANDFlash硬件读写原理
NAND Flash硬件读写原理导读:Nand Flash 控制器通过将Nand Flash 芯片的内设命令写到其特殊功能寄存器中,从而实现对Nand flash 芯片读、检验和编程控制的。
特殊功能寄存器有:NFCONF 、NFCMD 、NFADDR 、NFDATA 、NFSTAT 、NFECC 。
1.nand接口s3c2440板的Nand Flash模块由两部分组成:Nand Flash控制器(集成在s3c2440)和Nand Flash存储芯片(K9F1208U0B)两大部分组成。
当要访问Nand Flash中的数据时,必须通过Nand Flash控制器发送命令序列才能完成。
所以, Nand Flash相当于s3c2440的一个外设,而不位于它的内存地址区.。
Samsung的K9F1208U0B,数据存储容量为64MB ,采用块页式存储管理。
8 个I/O引脚充当数据、地址、命令的复用端口。
2. 重要芯片引脚功能I/O0-7:复用引脚。
可以通过它向nand flash 芯片输入数据、地址、nand flash 命令以及输出数据和操作状态信息。
CLE(Command Latch Enable): 命令锁存允许ALE(Address Lactch Enable): 地址锁存允许-CE: 芯片选择-RE: 读允许-WE: 写允许-WP: 在写或擦除期间,提供写保护R/-B: 读/忙输出3.芯片内部存储布局一片Nand flash 为一个设备(device), 其数据存储分层为:1设备(Device) = 4096 块(Blocks)1块(Block) = 32 页/ (Pages/rows) ;页与行是相同的意思,叫法不一样1页(Page) = 528 字节(Bytes) = 数据块大小(512Bytes) + OOB 块大小(16Bytes)在每一页中,最后16 个字节(又称OOB)用于Nand Flash 命令执行完后设置状态用,剩余512 个字节又分为前半部分和后半部分。
NAND_FLASH_内存详解与读写寻址方式
NAND FLASH内存详解与读写寻址方式一、内存详解NAND闪存阵列分为一系列128kB的区块(block),这些区块是NAND器件中最小的可擦除实体。
擦除一个区块就是把所有的位(bit)设置为"1"(而所有字节(byte)设置为FFh)。
有必要通过编程,将已擦除的位从"1"变为"0"。
最小的编程实体是字节(byte)。
一些NOR闪存能同时执行读写操作(见下图1)。
虽然NAND不能同时执行读写操作,它可以采用称为"映射(shadowing)"的方法,在系统级实现这一点。
这种方法在个人电脑上已经沿用多年,即将BIOS从速率较低的ROM加载到速率较高的RAM上。
NAND的效率较高,是因为NAND串中没有金属触点。
NAND闪存单元的大小比NOR要小(4F2:10F2)的原因,是NOR的每一个单元都需要独立的金属触点。
NAND与硬盘驱动器类似,基于扇区(页),适合于存储连续的数据,如图片、音频或个人电脑数据。
虽然通过把数据映射到RAM上,能在系统级实现随机存取,但是,这样做需要额外的RAM存储空间。
此外,跟硬盘一样,NAND 器件存在坏的扇区,需要纠错码(ECC)来维持数据的完整性。
存储单元面积越小,裸片的面积也就越小。
在这种情况下,NAND就能够为当今的低成本消费市场提供存储容量更大的闪存产品。
NAND闪存用于几乎所有可擦除的存储卡。
NAND的复用接口为所有最新的器件和密度都提供了一种相似的引脚输出。
这种引脚输出使得设计工程师无须改变电路板的硬件设计,就能从更小的密度移植到更大密度的设计上。
NAND与NOR闪存比较NAND闪存的优点在于写(编程)和擦除操作的速率快,而NOR的优点是具有随机存取和对字节执行写(编程)操作的能力(见下图图2)。
NOR的随机存取能力支持直接代码执行(XiP),而这是嵌入式应用经常需要的一个功能。
nand_flash读写工作原理_概述说明
nand flash读写工作原理概述说明1. 引言1.1 概述NAND Flash是一种非常常见和重要的存储设备,被广泛应用于各种电子产品中。
它的独特设计使得它成为一种高性能、低功耗、擦写可靠且具有较大容量的存储器解决方案。
由于其许多优点,NAND Flash在移动设备、个人电脑、服务器以及其他许多领域都有着广泛的应用。
1.2 文章结构本文将详细介绍NAND Flash的读写工作原理,并探讨其在存储领域中的优势与应用场景。
首先,我们将简要介绍NAND Flash的基本概念和特点,包括其结构和组成部分。
然后,我们将重点讲解NAND Flash进行读操作和写操作时所涉及的工作原理和步骤。
通过对这些原理的详细阐述,读者将能够全面了解NAND Flash如何实现数据的读取和写入。
除此之外,我们还将探讨NAND Flash相对于其他存储设备的优势,并介绍几个典型应用场景。
这些优势包括快速读写速度、低功耗、体积小且轻便、强大的耐久性以及较大的存储容量。
在应用场景方面,我们将重点介绍NAND Flash 在移动设备领域、物联网和服务器等各个行业中的广泛应用。
最后,我们将进行本文的小结,并对NAND Flash未来的发展进行展望。
通过全面了解NAND Flash的工作原理和优势,读者将能够更好地理解其在现代科技领域中的重要性,并对其未来发展趋势有一个清晰的认识。
1.3 目的本文的目的是通过对NAND Flash读写工作原理进行详细说明,使读者能够全面了解NAND Flash是如何实现数据读写操作的。
此外,我们还旨在向读者展示NAND Flash在存储领域中所具有的优势和广泛应用场景,使其意识到这一存储设备在现代科技产业中所扮演的重要角色。
希望通过本文,读者能够加深对NAND Flash技术的理解,并为相关领域或产品的研发与设计提供参考依据。
2. NAND Flash读写工作原理:2.1 NAND Flash简介:NAND Flash是一种非易失性存储器,采用了电子闪存技术。
nand flash 读写流程
nand flash 读写流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!NAND Flash 读写流程。
1. 擦除块(Erase Block)。
NANDFLASH读写
NANDFLASH读写NAND FLASH读写HY27UF081G2A:1Gbit (128Mx8bit / 64Mx16bit) NAND Flash Memory设备操作:3.1 Page Read.打开电源之后,芯片默认处于读状态。
也可以在写入4字节地址之后,写入命令00h和30h到命令寄存器,使能读操作。
In two consecutive(连续) read operations, the second one does need 00h command, which four address cycles and 30h command initiates that operation. Second read operation always requires setup command if first read operation was executed(执行) using also random data(随机读取) out command.Two types of operations are available: random read. The random read mode is enabled when the page address is changed. The 2112 bytes (X8 device) or 1056 words (X16 device) of data within the selected page are transferred to the data registers in less than 25us(tR). The system controller(控制器) may detect(检测) the completion of this data transfer (tR) by analyzing(分析) the output of R/B pin. Once the data in a page is loaded into the dataregisters(一旦一页的数据被加载到数据寄存器中), they may be read out in 30ns cycle time (3.3V device) by sequentially pulsing RE. The repetitive(重复) high to low transitions of the RE clock make the device output the data starting from the selected column address up to the last column address.The device may output random data in a page instead of the consecutive sequential data by writing random data output command. The column address of next data, which is going to be out, may be changed to the address which follows random data output command.1.命令输入 Command Input (CLE=1,ALE=0)ALE(0),CE(0) -> CLE(1) -> WE(0)->Command(输入并保持),在Command 保持时拉高WE(1)WE上升沿锁存Command->CE(1)->CLE(0)->ALE(1)根据时序图所得示意程序伪码void write_com(uint8 com){ALE=0;CE=0; delay 20ns;CLE=1;delay 15ns;WE=0;delay 15ns;IO7-0=com;delay 5ns;WE=1;delay 15ns;CE=1;CLE=0;ALE=1;}2.地址输入 Address Input(CLE=0,ALE=1)3.数据输入 Data Input (CLE=0,ALE=0)4.数据读出 Data Output (CLE=0,ALE=0)5.读状态寄存器(Read Status Register)6.页读取(Page Read)7.任意地址数据读取 (Random DATA Output)command 0x00->address 4字节(该页首地址)-> command 0x30->判别忙信号delay15ns->顺序读取或者command0x05->address 2字节(所要读的数据所在地址)->开始读出数据注意:注意图中的Column Address 对应Dout N的地址,0x50后是2字节在该页中的地址页写入(Page Program)command 0x80 -> address 4字节(该页首地址)->顺序写入最多2112字节->command 0x10结束写->判别忙信号->command 0x70读状态寄存器->IO0为0写成功任意地址数据写入(Random DATA Input)command 0x80 -> address 4字节(该页首地址)->顺序写入或者command0x85->写入数据->command0x10结束写入->判别忙信号->command0x70读状态->IO0为0写成功复制写入(Copy-Back Program)这个模式下,可以不用外部存储介质,直接在芯片内部快速准确地完成数据的复制重写入。
NandFlash驱动(实现初始化以及读操作)
NandFlash驱动(实现初始化以及读操作)本节来学习裸机下的Nand Flash驱动,本节学完后,再来学习Linux下如何使⽤Nand Flash驱动Linux中的Nand Flash驱动,链接如下:(只需要初始化Flash以及读Flash)打开2440芯⽚⼿册,K9F2G08U0M芯⽚⼿册(因为2440中Nand Flash是⽤的256MB(2Gb)内存,8个数据引脚)在芯⽚⼿册中得到K9F2G08U0M=2048块Block=128K页Pages=256MB=2Gb1个设备=2048块Block1块Block=64页Pages1页=(2K+64)B (因为每个地址⾥都存放了⼀个字节,所以⽤B表⽰)其中64B是存放ECC的OOB地址,(ECC:存放判断位反转的校验码)Nand Flash 缺点:读数据容易位反转可以通过ECC编码器值来判断读数据是否位反转,若位反转则重新读数据写过程:1)写页数据2)然后⽣成ECC3)将ECC写⼊到OBB页地址⾥(写数据是不会出现位反转)读过程:1)读出页数据,然后⽣成临时ECC(此时ECC可能有错)2)然后读出OOB页地址⾥的ECC3)⽐较两个ECC,判断是否出现位反转读OOB⽅法:读整个Nand Flash时,是读不出页⾥⾯的OBB地址,⽐如读2049这个地址数据时,是读的第⼆页上的第2个地址:只有读某⼀页时,才能读出这个页⾥⾯的OOB地址, ⽐如读第0页的2049这个地址数据时,才是读的第0页OOB的第2个地址:Nand Flash芯⽚硬件引脚图:RnB:就绪(ready)/忙(busy)输出信号,需要采⽤上拉电阻(1:表⽰写⼊数据成功,0:表⽰正在写⼊)CLE:命令(command)锁存(latch)使能,(1:表⽰当前传的是命令值)ALE:地址锁存使能,(1:表⽰当前传的是地址值,当CLE=0和ALE=0,表⽰传的是数据)nCE:芯⽚使能(低电平使能) (n:表⽰低电平有效)nWE:写使能 ,⽐如写命令时,当CLE=1,ALE=0时,当nWE来个上升沿,则会将IO数据写⼊flash中nRE:读使能,和we类似nWP:写保护(protect) (1:不保护,0:只能读不能写),默认接⾼电平.1.编写nand_init()函数1.1设置通信时序图1(nandflash时序表):图2(nandflash时序图):通过图2和图1可以看出:tCS是等待芯⽚使能CE的时间, tCS=20nStCLS和tALS是等待WE(写信号)结束的时间, tCLS=tALS=15nStWP是WE(写信号)维持时间, tWP=15nStALH是等待命令写⼊成功的时间, tALH=5nStCLH是等待地址写⼊成功的时间, tCLH=5nS图3(2440-nandflash时序图):⾸先查看2440芯⽚⼿册⾥nandflash时序图,如上图,可以看出需要设置TACLS,TWRPH0和TWRPH1,这三个参数TACLS:属于等待WE(写信号)就绪的时间,对⽐图2得出TACLS= tCLS- tWP=0nSTWRPH0:属于WE(写信号)的时间, 对⽐图2得出TWRPH0= tWP=15nSTWRPH1:属于等待命令写⼊成功的时间,对⽐图2得出TWRPH1=tALH=tCLH=5nS最后,在NFCONF寄存器中设置这三个参数TACLS[13:12]表⽰Duration(持续时间)=HCLK*TACLS,由于Duration=0nS,所以TACLS=0TWRPH0 [10:8]表⽰Duration(持续时间)=HCLK*( TWRPH0+1),由于Duration=15nS,HCLK=10nS(100Mhz),所以TWRPH0 =1. TWRPH1 [6:4]表⽰Duration(持续时间)= HCLK*( TWRPH1 +1),由于Duration=5nS,HCLK=10nS(100Mhz),所以TWRPH1 =0 1.2然后定义全局变量,并实现nand_init()初始化:/* nand flash 时序 */#define TACLS 0#define TWRPH0 1#define TWRPH1 0/* nand flash 寄存器 */#define NFCONF *((unsigend int *)0X4E000000); //配置寄存器(⽤来设置时序)#define NFCONT *((unsigend int *)0X4E000000); //控制寄存器(⽤来使能nandflash控制器以及ECC编码器,还有控制芯⽚使能CE脚)#define NFCMMD *((unsigend char *)0X4E000000);//发送命令寄存器(命令只有8位)#define NFADDR *((unsigend char *)0X4E000000);//发送地址寄存器(地址只有8位)#define NFDATA *((unsigend int *)0X4E000000);//读/写数据寄存器(数据只有8位)#define NFSTAT *((unsigend int *)0X4E000000);//运⾏状态寄存器(⽤于判断RnB脚)/*因为Nand Flash只有8位I/O脚,所以NFCMMD/ NFADDR/ NFDATA三个寄存器值都是unsigend char型 */1.3 nand_init()函数初始化void nand_init(void){/* 设置时序 */NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);/* bit4=1:初始化ECC, bit1=1:禁⽌⽚选 bit0=1:启动nandflash控制器*/NFCONT = (1<<4)|(1<<1)|(1<<0);}2编写nand_read()函数2.1编写nand_read()函数需要以下⼏个⼦函数:2.1.1⽚选使能函数(在读写FLASH之前都要选中⽚选)nand_select() //使能⽚选{int i;NFCONT&=~(1<<1); // NFCONT控制器位1置0for(i=0;i<10;i++); //等待芯⽚使能成功}2.1.2取消⽚选函数(退出读写FLASH时需要取消⽚选)nand_deselect() //取消⽚选{int i;NFCONT&=~(1<<1); // NFCONT控制器位1置0for(i=0;i<10;i++); //等待芯⽚使能成功}2.1.3读命令函数nand_cmd(unsigned char cmd){int i;NFCMMD= cmd; // 向NFCMMD寄存器写⼊命令for(i=0;i<10;i++); //等待写⼊命令成功}2.1.4判断RnB状态函数(在写⼊所有命令后都要判断RnB脚是否为⾼电平就绪)nand_waite_idle(){int i;while(!(NFSTAT&0X01)) // 等待NFSTAT寄存器位0置1for(i=0;i<10;i++);}2.1.5读数据函数nand_read_data(){unsigend char p=NFDATA; //读取NFDATA寄存器return p; //返回}2.1.6 编写写⼊地址函数(分5个周期)⾸先Nand Flash引脚只有8位,然⽽地址共有2048(块)*64(页)*2KB,为了读出多个地址,如下图,所以需要分5个周期来实现发送地址如上图,其中 A10~A0对应页⼤⼩(列),由于nandflash每页2048B,所以只⽤到A10~A0 A28~A11对应页⽬录(⾏),表⽰共有2048块*64(每块有64页)个⽬录例如,4097 地址就是:A10~A0=4097%2048= 1(A0=1,其余为0)A28~A11=4097/2048=2(A13=1,其余为0)所以nand_write_nand()函数如下:void nand_read_addr(unsigned int addr){unsigned int col = addr % 2048;unsigned int page = addr / 2048;volatile int i;NFADDR=(col>>0)&0xff; //A7~A0,第1周期for(i=0;i<10;i++);NFADDR=(col>>8)&0x0f; //A10~A8,第2周期for(i=0;i<10;i++);NFADDR=(page>>0)&0xff; //A18~A11,第3周期for(i=0;i<10;i++);NFADDR=(page>>8)&0xff; //A26~A19,第4周期for(i=0;i<10;i++);NFADDR=(page>>16)&0xff; //A27~A28,第5周期for(i=0;i<10;i++);}2.2Nand Flash命令图:如上图,例如:当要reset复位nand flash时1) 使能⽚选nand_select();2) 发送0XFF复位命令nand_cmd(0xFF);3) 等待RnB状态是否就绪 nand_wait_idle();4) 取消⽚选 nand_deselect();2.3Nand Flash读数据时序图:从上图可以看出nand flash 读数据分为了以下⼏个步骤:(1) 使能⽚选CE,将CLE置1,等待发送命令(2) 将WE置低,将IO置为0X00,然后拉⾼WE,触发⼀次上升沿,则将把0x00写⼊flash中(3) 将CLE置0,表⽰发送地址(分为5个周期)(4) 发送读命令0X30(5) 等待RnB信号为⾼电平(6) 读数据(在同⼀页⾥,数据可以连续读,读下⼀页时,需要重新发送新的地址才⾏例如:读1000地址到2050地址时,1.发出1000地址,到达页0的1000地址上,然后再连续读(2048-1000)次,直到读到页0的2047处.2.再发出2048地址,到达页1的0地址上,然后连续读(2051-2048)次,直到读到2050为⽌)(7) 取消⽚选nCE2.4 所以nand_read()函数如下:void nand_read(unsigned int src,unsigned char *dest,unsigned int len)/* src:源地址,为32位地址,所以⽤unsigend int表⽰*dest:⽬的地址内容,由于这⾥是将数据读出到⽬的地址内容中,所以需要⽤到*指针,因为每个地址⾥存的是⼀个字节,所以⽤unsigend char 型 */ {int col=src%2048; //第⼀次读,可能不是读的页⾸地址,所以需要记录当前页的位置int i=0; //当前读了0次nand_select(); //1使能⽚选nCEwhile(i<len){ nand_cmd(0X00); //2发送读命令0X00nand_write_addr(src); // 3发送yuan地址(分为5个周期)nand_cmd(0X30); //4发送读命令0X30nand_wait_idle(); //5等待RnB信号为⾼电平for(;(col<2048)&&(i<len);col++) //连续读页内数据{dest[i]=nand_read_data(); //6.读数据i++;src++;}col=0;}nand_deselect(); // 取消⽚选nCE }。
NAND flash读写擦除操作
NAND flash读写擦除操作本文主要介绍SAMSUNG公司的S3C2410处理器和K9F1208NAND flash的读写擦除操作。
一、K9F1208NAND flash芯片介绍S3C2410处理器集成了8位NAND flash控制器。
因NAND flash K9F1208、K9F1G08的数据页大小分别为512B、2KB,在寻址方式上有一定的差异,所以程序代码并不通用。
K9F1208的器件存储容量为64M字节和2048K字节的spare存储区,8位I/O 端口采用地址、数据和命令复用的方法。
该器件的引脚图如下所示该器件的引脚功能描述如下表所示引脚名称英文描述描述I/O0~I/O7Data input/outputs数据输入输出CLE Command latch enable命令锁存使能ALE Address latch enable地址锁存使能CE#Chip enable片选RE#Read enable读使能WE#Write enable写使能WP#Write protect写保护R/B#Ready/Busy output准备好/忙碌输出VCC Power(+2.7V~3.6V)电源(+2.7V~3.6V)VSS Ground地N.C No connection空引脚NAND flash的数据是以bit的方式保存在memory cell。
一般一个cell中只能存储一个bit。
这些cell以8个或者16个为单位,连成bit line,形成所谓的byte(X8)/word(X16),这就是NAND device的位宽。
这些line组成page,page再组织形成一个block。
K9F1208的相关数据如下:1block=32page;1page=528byte=512byte(main area)+16byte(spare area)总容量为=4096(block)*32(page/block)*512(byte/page)=64MBNAND flash以页为单位读写数据,而以块为单位擦除数据。
ARM9(S3C2440)之九nand flash的读写操作
九 ARM9(2440)对nand flash的读写操作转载自:骨Zi里德骄傲这篇文章转自别处,写的非常详细,让我们熟悉2440对nand flash 的整个操作过程:s3c2440对nandflash的操作(K9F2G08)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位)。
NAND Flash 读写操作
NAND Flash 读写操作(三)2009-03-26 13:02Fisrt part :NAND flash和NOR flash的不同NOR flash采用位读写,因为它具有sram的接口,有足够的引脚来寻址,可以很容易的存取其内部的每一个字节。
NAND flash使用复杂的I/O口来穿行地存取数据。
8个引脚用来传送控制、地址和数据信息。
NAND的读和写单位为512Byte 的页,擦写单位为32页的块。
● NOR的读速度比NAND稍快一些。
● NAND的写入速度比NOR快很多。
● NAND的4ms擦除速度远比NOR的5s快。
● 大多数写入操作需要先进行擦除操作。
● NAND的擦除单元更小,相应的擦除电路更少。
在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。
---------摘抄自网上流传很广的《NAND 和 NOR flash的区别》Second part:NAND Flash结构与驱动分析一、NAND flash的物理组成NAND Flash 的数据是以bit的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。
这些cell 以8个或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的位宽。
这些Line会再组成Page,(NAND Flash 有多种结构,我使用的NAND Flash 是K9F1208,下面内容针对三星的K9F1208U0M),每页528Bytes(512byte(MainArea)+16byte(Spare Area)),每32个page形成一个Block(32*528B)。
具体一片flash上有多少个Block视需要所定。
我所使用的三星k9f1208U0M具有4096个block,故总容量为4096*(32*528B)=66MB,但是其中的2MB是用来保存ECC校验码等额外数据的,故实际中可使用的为64MB。
怎么看时序图--nand flash的读操作详解
这篇文章不是介绍nand flash的物理结构和关于nand flash的一些基本知识的。
你需要至少了解你手上的nand flash的物理结构和一些诸如读写命令操作的大概印象,你至少也需要看过s3c2440中关于nand flash控制寄存器的说明。
由于本人也没有专门学过这方面的知识,下面的介绍也是经验之谈。
这里我用的K9F2G08-SCB0 这款nand flash 来介绍时序图的阅读。
不同的芯片操作时序可能不同,读的命令也会有一些差别。
当然其实有时候像nand flash这种s3c2440内部集成了他的控制器的外设。
具体到读写操作的细节时序(比如CLE/ALE的建立时间,写脉冲的宽度。
数据的建立和保持时间等),不明白前期也没有多大的问题。
因为s3c2440内部的nand flash控制器做了大部分的工作,你需要做的基本就是设置几个时间参数而已。
然后nand flash会自动进行这些细节操作。
当然如果处理器上没有集成nand flash的控制器那么久必须要自己来写时序操作了。
所以了解最底层的时序操作总是好的但是上层一点的,比如读写操作的步骤时序(比如读操作,你要片选使能,然后发命令,然后发地址,需要的话还需发一个命令,然后需要等待操作完成,然后再读书数据)。
是必须要明白的。
这都不明白的话,怎么进行器件的操作呢也就是说s3c2440 可以说在你设置很少的几个时间参数后,将每一个步骤中细微的操作都替你做好了。
(比如写命令,你只要写个命令到相应寄存器中,cpu内部就会协各个引脚发出适应的信号来实现写命令的操作)。
而我们所需要做的就是把这些写命令,写地址,等待操作完成。
等步骤组合起来。
从而完成一个读操作就像上面说的,虽然我们不会需要去编写每个步骤中的最细微的时序。
但是了解下。
会让你对每个操作步骤的底层细节更加明了先来看一个命令锁存的时序。
也就是上面说的读nand flash操作中不是有一个写命令步骤吗。
nand flash 读写(基本操作)
开场白:希望通过这篇文章记录一下自己在调试NAND flash的经验。
希望对大家有用。
上个月搞了一块开发板QT210。
说实话没有找到很多的datasheet就开始搞了。
最早还是从boot说起,说到这这里不得不提到boot中打印的错误信息****CRC Error*****。
最后还是决定静心调试看看怎么回事。
结果发现资料还是确少,怎么办?找了以前的omap开发板。
(个人觉得omap的板子BSP还是做的比较好的)。
在omap上调试了一下并测试了一些基本的NAND的读写操作。
210的板子准备在linux中使用MTD去管理者块flash。
并且留下了疑问:s5pc110的片子memory map给nand 和onenand留下了256MB的空间,但是210的板子使用的是三星的1GMB的flash。
多余的7百多兆的flash的空间如何管理?nand bsp分析:型号:MT29F2G16xxxx硬件平台:omap3530在分析之前,确定硬件平台和device的型号还是很有必要的。
应为在3530的板子上是使用的LPDDR(micron)。
在以前的工作中和供应商打过交道。
其实flash的型号以及位宽和一些其他的参数可以从芯片的命名的法则上了解。
在查阅了相关文档后确定NAND的型号。
基本的read函数。
下来了解一下nand的操作时序:io是复用的。
即是data又是cmd。
但是注意16bits位宽的device在cmd和寻址时候是8bits位宽,数据读出时候是16bits位宽。
简单通过一个函数:read,但是在read之前先要把上图中现实的cmd 以及addr作用到总线上。
这就是软件的作用了。
在这里不得不提一下omap的GPMC。
其实这就是一个包含NAND Controller的硬件模块。
具体的初始化和寄存器设置工作状态在别的文章中解释。
(GPMC的设置也是要花时间去调试和跟踪的,不想影响了NAND的分析)只要记住软件正确的操作了GPMC相关的NAND控制器,就是对NAND devide进行相关操作了。
nandflash基础——基本操作
nandflash基础——基本操作
nand flash最基本的操作就是读写擦。
读
对于处于被擦除状态的cell, Vth都在0V(Vread)以下;而被写之后的cell,Vth则处于0V(Vread)和Vpassr之间。
Vpassr在4V以下。
根据这样的特性,则可以通过设置偏置电压来使cell处于导通状态。
当需要读取一个cell时,在栅极(gate)上需要提供一个Vread 电压(0V),在其他的cell上加上一个Vpass,r电压,通常在4-5V,这个电压是大于Vpassr的,足以使cell导通,无论是在被擦除状态和被写的状态。
这样的话,string上的导通情况就由被读取的cell状态决定。
如果这个cell是被擦除的,0V的电压就足以导通;如果这个cell是被写过的,则0V不足以使其导通。
于是存在两种状态,可以代表一个bit 的信息。
导通状态下,string上就存在电流,通过sense amplifier可以转换为电压信号。
写。
NAND flash读写擦除操作
NAND flash读写擦除操作本文主要介绍SAMSUNG公司的S3C2410处理器和K9F1208NAND flash的读写擦除操作。
一、K9F1208NAND flash芯片介绍S3C2410处理器集成了8位NAND flash控制器。
因NAND flash K9F1208、K9F1G08的数据页大小分别为512B、2KB,在寻址方式上有一定的差异,所以程序代码并不通用。
K9F1208的器件存储容量为64M字节和2048K字节的spare存储区,8位I/O 端口采用地址、数据和命令复用的方法。
该器件的引脚图如下所示该器件的引脚功能描述如下表所示引脚名称英文描述描述I/O0~I/O7Data input/outputs数据输入输出CLE Command latch enable命令锁存使能ALE Address latch enable地址锁存使能CE#Chip enable片选RE#Read enable读使能WE#Write enable写使能WP#Write protect写保护R/B#Ready/Busy output准备好/忙碌输出VCC Power(+2.7V~3.6V)电源(+2.7V~3.6V)VSS Ground地N.C No connection空引脚NAND flash的数据是以bit的方式保存在memory cell。
一般一个cell中只能存储一个bit。
这些cell以8个或者16个为单位,连成bit line,形成所谓的byte(X8)/word(X16),这就是NAND device的位宽。
这些line组成page,page再组织形成一个block。
K9F1208的相关数据如下:1block=32page;1page=528byte=512byte(main area)+16byte(spare area)总容量为=4096(block)*32(page/block)*512(byte/page)=64MBNAND flash以页为单位读写数据,而以块为单位擦除数据。
Nand Flash的读写操作
NandFlash的读写操作正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。
一般而言,block、page之间的关系随着芯片的不同而不同,典型的分配是这样的:1block = 32page1 page = 512bytes(datafield) + 16bytes(oob)需要注意的是,对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash 的擦写,而擦写则是以一个block为单位的。
同时必须提醒的是,512bytes理论上被分为1st half 和2sd half,每个half各占256个字节。
我们讨论的K9F1208U0B总共有4096 个Blocks,故我们可以知道这块flash的容量为4096 *(32 *528)= 69206016 Bytes = 66 MB但事实上每个Page上的最后16Bytes是用于存贮检验码和其他信息用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为4096 *(32 *512) = 67108864 Bytes = 64 MB 由上图所示,1个Page总共由528 Bytes组成,这528个字节按顺序由上而下以列为单位进行排列(1列代表一个Byte。
第0行为第0 Byte ,第1行为第1 Byte,以此类推,每个行又由8个位组成,每个位表示1个Byte里面的1bit)。
这528Bytes按功能分为两大部分,分别是Data Field和Spare Field,其中Spare Field占528Bytes里的16Bytes,这16Bytes是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,除去这16Bytes,剩下的512Bytes便是我们用于存放数据用的Data Field,所以一个Page上虽然有528个Bytes,但我们只按512Bytes进行容量的计算。
nor_flash_读写过程
nor_flash_读写过程一、结构分析S3C2410处理器集成了8位NandFlash控制器。
目前市场上常见的8位NandFlash有三星公司的k9f1208、k9f1g08、k9f2g08等。
k9f1208、k9f1g08、k9f2g08的数据页大小分别为512Byte、2kByte、2kByte。
它们在寻址方式上有一定差异,所以程序代码并不通用。
本文以S3C2410处理器和k9f1208系统为例,讲述Nan dFlash的读写方法。
NandFlash的数据是以bit 的方式保存在memory cell里的,一般来说,一个cell 中只能存储一个bit,这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的位宽。
这些Line 组成Page,page 再组织形成一个Block。
k9f1208的相关数据如下:1block=32page;1page=528byte=512byte(Main Area)+16byte(Spare Area)。
总容量为=4096(block数量)*32(page/block)*512(byte/page)=64MbyteNandFlash以页为单位读写数据,而以块为单位擦除数据。
按照k9f1208的组织方式可以分四类地址:Col umn Address、halfpage pointer、Page Address 、Block Address。
A[0:25]表示数据在64M 空间中的地址。
Column Address表示数据在半页中的地址,大小范围0~255,用A[0:7]表示;halfpage pointer表示半页在整页中的位置,即在0~255空间还是在256~511空间,用A[8]表示;Page Address表示页在块中的地址,大小范围0~31,用A[13:9]表示;Block Address表示块在flash中的位置,大小范围0~4095,A[25:14] 表示;二、读操作过程K9f1208的寻址分为4个cycle。
nadn的读写过程
nadn的读写过程
NAND Flash是一种非易失性存储器,用于存储数据。
它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节。
下面是NAND Flash的读写过程:- 写入数据:在写入数据之前,需要先进行擦除操作。
擦除操作会将整个芯片上的数据全部清除,然后才能写入新的数据。
- 读取数据:NAND Flash的读取是以块为单位进行的,一次读取512个字节。
这种读取方式比NOR Flash慢,但是比其他类型的存储设备更快。
NAND Flash的读写过程受到许多因素的影响,如芯片的质量、工作温度、读取速度等。
在使用NAND Flash时,需要注意这些因素,以确保数据的安全性和可靠性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开场白:希望通过这篇文章记录一下自己在调试NAND flash的经验。
希望对大家有用。
上个月搞了一块开发板QT210。
说实话没有找到很多的datasheet就开始搞了。
最早还是从boot说起,说到这这里不得不提到boot中打印的错误信息****CRC Error*****。
最后还是决定静心调试看看怎么回事。
结果发现资料还是确少,怎么办?找了以前的omap开发板。
(个人觉得omap的板子BSP还是做的比较好的)。
在omap上调试了一下并测试了一些基本的NAND的读写操作。
210的板子准备在linux中使用MTD去管理者块flash。
并且留下了疑问:s5pc110的片子memory map给nand 和onenand留下了256MB的空间,但是210的板子使用的是三星的1GMB的flash。
多余的7百多兆的flash的空间如何管理?nand bsp分析:型号:MT29F2G16xxxx硬件平台:omap3530在分析之前,确定硬件平台和device的型号还是很有必要的。
应为在3530的板子上是使用的LPDDR(micron)。
在以前的工作中和供应商打过交道。
其实flash的型号以及位宽和一些其他的参数可以从芯片的命名的法则上了解。
在查阅了相关文档后确定NAND的型号。
基本的read函数。
下来了解一下nand的操作时序:io是复用的。
即是data又是cmd。
但是注意16bits位宽的device在cmd和寻址时候是8bits位宽,数据读出时候是16bits位宽。
简单通过一个函数:read,但是在read之前先要把上图中现实的cmd 以及addr作用到总线上。
这就是软件的作用了。
在这里不得不提一下omap的GPMC。
其实这就是一个包含NAND Controller的硬件模块。
具体的初始化和寄存器设置工作状态在别的文章中解释。
(GPMC的设置也是要花时间去调试和跟踪的,不想影响了NAND的分析)只要记住软件正确的操作了GPMC相关的NAND控制器,就是对NAND devide进行相关操作了。
1,static int NanD_Command(unsigned char command)2,static int NanD_Address(unsigned int numbytes, unsigned long ofs)一个是写指令,一个是写地址。
为了方便,没有把代码全部贴上来,逻辑应该是:(1)NanD_Command(00)(2)NanD_Address(address)(3)NanD_Command(30)(4)read ioregister这里遇到了两个问题:第一:read后的数据和nand dump的数据不符合。
第二:如何确定address在device中的具体位置。
先来看看第一个问题。
在read函数后发现buf中的内容不是确定block中page的内容,很是怀疑。
后来把buf的具体位置print一下,发现:buf++,但是地址是由小到大的。
buf_start -> 0x8000 0000........buf_end -> 0x8030 0000所以要打印block中的内容必须buf_end - offset。
再来看看第二个问题。
看到这张图其实很熟悉了,只要是看了结构。
但是光有这张图还是不够的。
这下知道了为什么分为5个步长的address。
其实这和NAND的内部寻址逻辑有关系。
A0 - A10 代表了一个page中的偏移。
应为加上32B的oob已经是大于1024words了那么就要使用11个bits来索引。
其实在这里面11bit不会全部使用。
因为只要1024+32 = 1056words就够了。
A11 - A16 代表了page offset。
一共有64page。
具体在block中哪一个page使用这6bits来定位。
A17 - A27 代表了block的个数。
一共有2048block。
这10bit来索引。
下面关键的来了,看看使用的物理地址如何转化到NAND的具体的block的page的col上面。
在linux机器上抄写了一个应用的函数分析一下这些地址。
函数如下:/* NanD_Address: Set the current address for the flash chip */static int NanD_Address(unsigned int numbytes, unsigned long ofs){uchar u;NAND_CTL_SETALE(NAND_ADDR) //设置地址锁存if (numbytes == ADDR_COLUMN || numbytes == ADDR_COLUMN_PAGE || numbytes == ADDR_OOB){ushort col = ofs;u = col & 0xff;printf("1st addr %X\n",u);WRITE_NAND_ADDRESS(u, NAND_ADDR); //第一个address的偏移因为io 地址线的低8位有效。
u = (col >> 8) & 0x07;if (numbytes == ADDR_OOB)u = u | ((bus_width == 16) ? (1 << 2) : (1 << 3));printf("2st addr %X\n",u);WRITE_NAND_ADDRESS(u, NAND_ADDR);}if (numbytes == ADDR_PAGE || numbytes == ADDR_COLUMN_PAGE || numbytes == ADDR_OOB) {u = (ofs >> 11) & 0xff;printf("3st addr %X\n",u);WRITE_NAND_ADDRESS(u, NAND_ADDR);u = (ofs >> 19) & 0xff;printf("4st addr %X\n",u);WRITE_NAND_ADDRESS(u, NAND_ADDR);/* One more address cycle for devices > 128MiB */if (chipsize > (128 << 20)) {u = (ofs >> 27) & 0xff;printf("5st addr %X\n",u);WRITE_NAND_ADDRESS(u, NAND_ADDR);}}NAND_CTL_CLRALE(NAND_ADDR); //地址锁存NAND_WAIT_READY();return 0;}以上函数一些大写的函数做一下说明,就是往NAND Controller (寄存器)中写入指令或是地址。
这些源码可以在我的资源中下载。
(希望不会有什么麻烦)还是回到函数本身,看看到底是如何确定地址的。
在函数中,写寄存器的代码之前添加了打印,其实可以ubuntu上调试,就是把相关的寄存器操作代码去掉。
第一栏第二栏第三栏假设想要读取0block0page0offset的地址:00000000000 000000 00000000000假设想要读取0block1page0offset的地址:00000000000 000001 00000000000假设想要读取0block2page0offset的地址:00000000000 000010 00000000000假设想要读取1block0page0offset的地址:00000000001 000000 00000000000假设想要读取1block1page0offset的地址:00000000001 000001 00000000000假设想要读取1block2page0offset的地址:00000000001 000010 00000000000注释:1,第一栏为block offset第二栏为page offset第三栏为col offset (可以查阅相关的文章,为什么在page中的偏移叫做或者称为col,是由于flash的发展而来)2,以上转换过程中BLOCK OFFSET为:0x20000 (一个block的大小是64k words)128kB3,以上转换过程中PAGE OFFSET为:0x800 (一个page的大小是1024 words)2048kB4,顾第二个block的block偏移为:000000000015,由此归纳出一般的线性地址到NAND device的地址转换格式为:8bit IO 访问1st cccc cccc2st XXXX Xccc3st bbpp pppp4st bbbb bbbb5st XXXX XXXb上述表达式中:c代表col b代表block p代表pageoffset基本的write函数。
6,在这里再提一个经验,在page offset中read的buf指针是有记忆的,当你预读取在data cache中的时候。
其实已经把page offset作用到了NAND片内。
顾在read周期性的拉低ALE的同事会从指定的地址读出数据。
NAND的write操作硬件时序图如下:查看函数要区分:write在nand的操作中叫做program。
(估计是应为在写nand的时候要erase,所以这里叫这种写入方式为program 个人理解,可能不科学)。
在这里很可惜x-load的代码没有write操作。
起原因最小化的代码初始化真个芯片。
在这里不得不提一下,在ARM s5pc110的TRM中写的很清楚,片内的rom code初始化了PLL,bus等模块,但是omap3530的片子没有找到相关文档。
看了x-load。
其中有代码是初始化ARM core的PLL。
在omap中的PLL时钟初始化,如果不是有硬件来完成基本的初始化(锁相),不知道这样的设计是否合理。
我总觉的上电后第一条指令,指的是PC取值后的action。
在这之前还有很多是硬件模块自己的逻辑完成。
不知道这样的理解是否正确。
希望高手大侠看了这篇文章后,特别是这段内容,不要吝惜文笔,给予指点。