Nor Flash的烧写方式

Nor Flash的烧写方式
Nor Flash的烧写方式

相对于硬件工程师和嵌进式软件工程师一般在完成设计之后经常需要验证FLASH是否在工作.在应用当中,也有很多时候需要对FLASH进行写操纵.该文章简单先容了基于ARM芯片的NOR FLASH烧写,并提供了2个具体的实例和源代码,希看对有需要的朋友有点帮助.在开始之前,先声明一下,这篇文章只是先容了如何写NOR FLASH 的烧写驱动,和H-JTAG/H-FLASHER没有直接的联系.

在后面的先容里,如无特别说明,处理器指的是ARM 处理器,FLASH 指的都是NOR FLASH.另外,BYTE 指的是8-BIT的数据单元,HALF-WORD代表的是16-BIT的数据单元,而WORD 则代表了32-BIT的数据单元.

1. NOR FLASH 的简单先容

NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute ON Chip,即程序可以直接在FLASH片内执行.这点和NAND FLASH不一样.因此,在嵌进是系统中,NOR FLASH很适合作为启动程序的存储介质.

NOR FLASH的读取和RAM很类似,但不可以直接进行写操纵.对NOR FLASH的写操纵需要遵循特定的命令序列,终极由芯片内部的控制单元完成写操纵.从支持的最小访问单元来看,NOR FLASH一般分为8 位的和16位的(当然,也有很多NOR FLASH芯片同时支持8位模式和是16 位模式,具体的工作模式通过特定的管脚进行选择) . 对8位的NOR FLASH芯片,或是工作在8-BIT模式的芯片来说,一个地址对应一个BYTE(8-BIT)的数据.例如一块8-BIT的NOR FLASH,假设容量为4个BYTE.那芯片应该有8个数据信号D7-D0 和2个地址信号,A1-A0.地址0x0对应第0个BYTE,地址0x1对应于第1BYTE,地址0x2对应于第2个BYTE,而地址0x3则对应于第3 个BYTE对16位的NOR FLASH 芯片,或是工作在16-BIT模式的芯片来说,一个地址对应于一个HALF-WORD(16-BIT)的数据.例如,一块16-BIT的NOR FLASH,假设其容量为4个BYTE.那芯片应该有16 个数据信号线D15-D0 和1个地址信号A0.地址0x0对应于芯片内部的第0个HALF-WORD,地址0x1对应于芯片内部的第1个HALF-WORD. FLASH一般都分为很多个SECTOR,每个SECTOR包括一定数目的存储单元.对有些大容量的FLASH,还分为不同的BANK,每个BANK包括一定数目的SECTOR.FLASH的擦除操纵一般都是以SECTOR,BANK或是整片FLASH为单位的.

在对FLASH进行写操纵的时候,每个BIT可以通过编程由1变为0,但不可以有0修改为1.为了保证写操纵的正确性,在执行写操纵前,都要执行擦除操纵.擦除操纵会把FLASH 的一个SECTOR,一个BANK或是整片FLASH 的值全修改为0xFF.这样,写操纵就可以正确完成了.

2. ARM 处理器的寻址

ARM 可以说是目前最流行的32位嵌进式处理器.在这里只提一下ARM 处理器的寻址,为后面做个展垫.从处理器的角度来看,系统中每个地址对应的是一个BYTE的数据单元.这和很多别的处理器都是一样的.

3. 处理器和NOR FLASH 的硬件连接

从前面的先容,我们知道从处理器的角度来看,每个地址对应的是一个BYTE 的数据单元.而,NOR FLASH 的每个地址有可能对应的是一个BYTE的数据单元,也有可能对应的是一个HALF-WORD的数据单元.所以在硬件设计中,连接ARM处理器和NOR FLASH 时,必须根据实际情况对地址信号做特别的处理.

假如ARM处理器外部扩展的是8-BIT的NOR FLASH, 数据线和地址线的连接应该如图1所示. 从图中我们可以看到,处理器的数据信号D0-D7和FLASH的数据信号D0-D7

是逐一对应连接的,处理器的地址信号A0-An和NOR FLASH的地址信号A0-An 也是逐一对应连接的.

假如ARM处理器外部扩展的是16-BIT的NOR FLASH, 数据线必须要错位连接. 图2给了一个ARM处理器和16-BITNOR FLASH 的连接示意图.如图2所示,ARM处理器的数据信号D0-D15和FLASH 的数据信号D0-D15是逐一对应的.而ARM处理器的地址信号和NOR FLASH 的地址信号是错位连接的,ARM的A0悬空,ARM 的A1 连接FLASH 的A0,ARM 的A2连接FLASH 的A1,依次类推.需要错位连接的原因是:ARM处理器的每个地址对应的是一个BYTE 的数据单元,而16-BIT 的FLASH 的每个地址对应的是一个HALF-WORD(16-BIT)的数据单元.为了保持匹配,所以必须错位连接.这样,从ARM处理器发送出来的地址信号的最低位A0对16-BIT FLASH来说就被屏蔽掉了.

补充说明:

1. 一般来说,ARM处理器内部要设置相应的寄存器,告诉处理器外部扩展的FLASH 的位宽(8-BIT/16-BIT/32-BIT) .这样,处理器才知道在访问的时候如何从FLASH正确的读取数据.

2. 有些ARM处理器内部可以设置地址的错位.对于支持软件选择地址错位的处理器,在连接16-BIT FLASH的时候,硬件上可以不需要把地址线错位.读者设计的时候,请参考MCU的数据手册,以手册为准,以免造成不必要的麻烦.

3. 假如处理器支持内部设置地址错位,在实际访问的时候,送出的地址实际上是在MCU内部做了错位处理,其作用是等效于硬件连接上的错位的.

上面的描述可能比较抽象,下面让我们来看2个ARM处理器访问16-BIT FLASH的例子:

例子1:ARM处理器需要从地址0x0 读取一个BYTE

1 - ARM处理器在地址线An-A0上送出信号0x0;

2 – 16-BIT FLASH在自己的地址信号An-A0上看到的地址是0x0,然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;

3 –ARM处理器知道访问的是16-BIT的FLASH,从D7-D0上读取所需要的一个BYTE的数据;

例子2:ARM处理器需要从地址0x1 读取一个BYTE

1 - ARM处理器在地址线An-A0上送出信号0x1;

2 – 16-BIT FLASH在自己的地址信号An-A0上看到的地址依然是0x0, 然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;

3 –ARM处理器知道访问的是16-BIT的FLASH,从D15-D8 上读取所需要的一个BYTE 的数据;

4. 从软件角度来看ARM 处理器和NOR FLASH 的连接

在上一个小节里,我们简单了解了ARM 处理器和FLASH 的硬件连接.在这个小节里面,我们从软件的角度来理解ARM处理器和FLASH的连接.对于8-BIT的FLASH的连接,很好理解,由于ARM处理器和8-BIT FLASH的每个地址对应的都是一个BYTE 的数据单元.所以地址连接毫无疑问是逐一对应的.假如ARM 处理器连接的是16-BIT 的处理器,由于ARM 处理器的每个地址对应的是一个BYTE 的数据单元,而16-BIT FLASH 的每个地址对应的是一个HALF-WORD 的16-BIT的数据单元.所以,也毫无疑问,ARM处理器访问16-BIT处理器的时候,地址肯定是要错开一位的.在写FLASH驱动的时候,我们不需要知道地址错位是由硬件实现的,还是是通过设置ARM处理器内部的寄存器来实现的,只需要记住2点:

1 – ARM处理器访问8-BIT FLASH的时候,地址是逐一对应的;

2 – ARM处理器访问16-BIT FLASH的时候,地址肯定是错位的.这一点对理解后面的例子会很有帮助.

5. 8-BIT FLASH 烧写驱动实例- HY29F040

HY29F040是现代公司的一款8-BIT的NOR FLASH.在这个小节里,我们以这个芯片为例子,先容如何对8-BIT NOR FLASH进行操纵.

HY29F040的容量为512K-BYTE,总共包括8 个SECTOR,每个SECTOR 的容量是64K-BYTE.该芯片支持SECTOR擦除,整片擦除和以BYTE 为基本单位的写操纵.HY29F040的命令定义如表-1所示.

下面,我们来看看如何实现基本的擦除和编程操纵.在本节后面的描述中,我们使用了下面的2 个定义:

U32 sysbase; //该变量用来表示FLASH 的起始地址

#define SysADDR8(sysbase, offset) ((volatile U8*)(sysbase)+(offset)) //用来方便对指定的FALSH 地址进行操纵

先解释一下SysAddr8 的定义.这个宏定义了一个BYTE(8-BIT)指针,其地址为(sysbase + offset).假设FLASH 的起始地址为0x10000000,假如要将0xAB写到FLASH 的第一个BYTE中往,可以用下面的代码:

*SysAddr8(0x10000000, 0x1) = 0xAB;

留意:

在本节后面的描述中,SYSBASE代表的是FLASH的起始地址,而SysAddr8中的OFFSET则代表了相对于FLASH起始地址的BYTE偏移量.OFFSET也是8-BIT FLASH在自己的地址信号An-A0上看到的地址.

整片擦除操纵

整片擦除操纵共需要6个周期的总线写操纵

1 –将0xAA写到FLASH 地址0x5555

2 –将0x55 写到FLASH 地址0x2AAA

3 –将0x80 写到FLASH 地址0x5555

4 –将0xAA写到FLASH 地址0x5555

5 –将0x55 写到FLASH 地址0x2AAA

6 –将0x10 写到FLASH 地址0x5555

对应的代码:

*SysAddr8(sysbase, 0x5555) = 0xAA; //将值0xAA写到FLASH 地址0x5555

*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值0x55 写到FLASH 地址0x2AAA

*SysAddr8(sysbase, 0x5555) = 0x80; //将值0x80 写到FLASH 地址0x5555 *SysAddr8(sysbase, 0x5555) = 0xAA; //将值0xAA写到FLASH 地址0x5555

*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值0x55 写到FLASH 地址0x2AAA

*SysAddr8(sysbase, 0x5555) = 0x10; //将值0x10 写到FLASH 地址0x5555 SECTOR 擦除操纵

SECTOR的擦除操纵共需要6个周期的总线写操纵

1 –将0xAA写到FLASH 地址0x5555

2 –将0x55 写到FLASH 地址0x2AAA

3 –将0x80 写到FLASH 地址0x5555

4 –将0xAA写到FLASH 地址0x5555

5 –将0x55 写到FLASH 地址0x2AAA

6 –将0x30 写到要擦除的SECTOR 对应的地址

对应的代码:

*SysAddr8(sysbase, 0x5555) = 0xAA; //将值0xAA写到FLASH 地址0x5555

*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值0x55 写到FLASH 地址0x2AAA

*SysAddr8(sysbase, 0x5555) = 0x80; //将值0x80 写到FLASH 地址0x5555

*SysAddr8(sysbase, 0x5555) = 0xAA; //将值0xAA写到FLASH 地址0x5555

*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值0x55 写到FLASH 地址0x2AAA

*SysAddr8(sysbase, addr) = 0x30; //将值0x30 写到要擦除的SECTOR 对应的地址

BYTE 编程操纵

写一个BYTE 的数据到FLASH中往,需要4个周期的总线写操纵

1 –将0xAA写到FLASH 地址0x5555

2 –将0x55 写到FLASH 地址0x2AAA

3 –将0xA0 写到FLASH 地址0x5555

4 –将编程数据(BYTE)写到对应的编程地址上往

对应的代码:

*SysAddr8(sysbase, 0x5555) = 0xAA; //将值0xAA写到FLASH 地址0x5555

*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值0x55 写到FLASH 地址0x2AAA

*SysAddr8(sysbase, 0x5555) = 0xA0; //将值0xA0 写到FLASH 地址0x5555

*SysAddr8(sysbase, addr) = data; //将一个BYTE的数据写到期看的地址

6. 16-BIT FLASH 烧写驱动实例- SST39VF160

SST39VF160是SST公司的一款16-BIT的NOR FLASH. 在这个小节里, 我们以SST39VF160为例子, 先容如何对16-BIT NOR FLASH进行操纵.对8-BIT FLASH的操纵很好理解,但对16-BIT FLASH的操纵理解起来要晦涩很多.我尽力描述得清楚些.

SST39VF160的容量为2M-BYTE , 总共包括512个SECTOR, 每个SECTOR 的容量是4K-BYTE. 该芯片支持SECTOR擦除,整片擦除和以HALF-WORD 为基本单位的写操纵.SST39VF160 的命令定义如表-2 所示.在表2 中,由于所有命令都是从FLASH的角度来定义的. 所以, 所有的地址都是HALF-WORD地址, 指的是16-BIT FLASH在自己的地址信号An-A0上看到的地址.

在本节后面的描述中,我们使用了下面的2个定义:

U32 sysbase; //该变量用来表示FLASH 的起始地址

#define SysAddr16(sysbase, offset) ((volatile U16*)(sysbase)+(offset)) //用来方便对指定的FALSH 地址进行操纵

SysAddr16(sysbase, offset)首先定义了一个16-BIT HALF-WORD的指针,指针的地址为sysbase,然后根据offset做个偏移操纵. 由于HALF-WORD指针的地址是2个BYTE对齐的, 所以每个偏移操纵会使得地址加2. 终极, SysAddr16 (sysbase, offset)相当于定义了一个HALF-WORD的指针,其终极地址为(sysbase + 2offset) .在使用SysAddr16 的时候,将sysbase设置成FLASH 的起始地址,offset 则可以理解为相对于FLASH 起始地址的HALF-WORD 偏移量或是偏移地址.假设FLASH 的起始地址为0x10000000,SysAddr16(0x10000000, 0)指向16-BIT FLASH 的第0 个HALF-WORD,

SysAddr16(0x10000000, 1指向16-BIT FLASH的第1 个HALF-WORD.依次类推.假如要将0xABCD分别写到FLASH 的第0个和第1个HALF-WORD 中往,可以用下面的代码:

*SysAddr16(0x10000000, 0x0) = 0xABCD;

*SysAddr16(0x10000000, 0x1) = 0xABCD;

接下来,我们分别从ARM处理器的角度和FLASH的角度来具体分析一下.

从ARM 的角度来看:

假设FLASH 的起始地址为0x10000000,由于ARM 处理器知道FLASH 的地址空间为0x10000000 ~ (0x10000000 +FLASH容量–1),所以在对这个地址空间进行访问的时候,会设置好FLASH的片选信号,并将低位的地址输出到地址信号上.以*SysAddr16(0x10000000, 0x1) = 0xABCD 为例.从ARM 处理器的角度来看,该操纵是把0xABCD写到地址0x10000002上往.所以ARM处理器终极会在它的地址信号An-A0输出地址0x2,同时会在D15-D0 上输出0xABCD.

从FLASH 的角度来看:

还是以*SysAddr16(0x10000000, 0x1) = 0xABCD 为例,FLASH看到的地址是多少呢?接着分析.ARM 处理器在执行操纵的时候,会设置好相应的FLASH片选使能信号,并在ARM的地址信号An-A0上输出0x2.由于ARM和16-BIT FLASH的地址信号的连接是错开一位的, 所以, FLASH终极在自己的地址An-A0上看到的信号是0x1, 相当于将ARM 处理器输出的地址往右做了一个移位操纵,恰好对应的是FLASH的第 1 个HALF-WORD.同时,FLASH会在自己的D15-D0上看到数据0xABCD.

通过上面的分析,我们知道SysAddr16 中指定的offset 的值就是16-BIT FLASH 在自己的地址An-A0 上看到的值.所以,我们可以很方便的通过SysAddr16(sysbase, offset) 对FLASH 进行操纵,其中sysbase 代表FLASH 起始地址,offset 则代表了FLASH 的第几个HALF-WORD(HALF-WORD偏移量或偏移地址) .

留意:

1. 在本节后面的描述中,SysAddr16中的SYSBASE代表的是FLASH的起始地址,而SysAddr16中的OFFSET则代表了相对于FLASH起始地址的HALF-WORD 偏移量或偏移地址.OFFSET 的值也是16-BIT FLASH在自己的地址信号An-A0上看到的值.

2.在SST39VF160的命令定义中,所有的地址都是针对FLASH的HALF-WORD地址,指的是在FLASH自己的地址信号An-A0上看到的地址.

整片擦除操纵

整片擦除操纵共需要6个周期的总线写操纵

1 –将0x00AA写到FLASH HALF-WORD 地址0x5555

2 –将0x0055 写到FLASH HALF-WORD地址0x2AAA

3 –将0x0080 写到FLASH HALF-WORD地址0x5555

4 –将0x00AA写到FLASH HALF-WORD 地址0x5555

5 –将0x0055 写到FLASH HALF-WORD地址0x2AAA

6 –将0x0010 写到FLASH HALF-WORD地址0x5555

对应的代码:

*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值0x00AA 写到FLASH HALF-WORD地址0x5555

*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值0x0055 写到FLASH HALF-WORD地址0x2AAA

*SysAddr16(sysbase, 0x5555) = 0x0080; //将值0x0080 写到FLASH HALF-WORD地址0x5555

*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值0x00AA 写到FLASH HALF-WORD地址0x5555

*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值0x0055 写到FLASH HALF-WORD地址0x2AAA

*SysAddr16(sysbase, 0x5555) = 0x0010; //将值0x0010 写到FLASH HALF-WORD地址0x5555

SECTOR 擦除操纵

SECTOR的擦除操纵共需要6个周期的总线写操纵

1 –将0x00AA写到FLASH HALF-WORD 地址0x5555

2 –将0x0055 写到FLASH HALF-WORD地址0x2AAA

3 –将0x0080 写到FLASH HALF-WORD地址0x5555

4 –将0x00AA写到FLASH HALF-WORD 地址0x5555

5 –将0x0055 写到FLASH HALF-WORD地址0x2AAA

6 –将0x0030 写到要擦除的SECTOR 对应的HALF-WORD地址

对应的代码:

*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值0x00AA 写到FLASH HALF-WORD地址0x5555

*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值0x0055 写到FLASH HALF-WORD地址0x2AAA

*SysAddr16(sysbase, 0x5555) = 0x0080; //将值0x0080 写到FLASH HALF-WORD地址0x5555

*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值0x00AA 写到FLASH HALF-WORD地址0x5555

*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值0x0055 写到FLASH HALF-WORD地址0x2AAA

*SysAddr16(sysbase, addr >> 1) = 0x0030; //将值0x0030 写到要擦除的SECTOR 对应的

HALF-WORD地址

留意:

上面的代码中第6个操纵周期中的ADDR 是从ARM处理器的角度来看的BYTE 地址,由于在擦除的时候,用户希看指定的是从ARM 的角度看到的地址,这样更方便和更直

观.而在SysAddr16 的宏定义中,OFFSET 表示的是相对于FLASH起始地址的HALF-WORD 偏移量,或是FLASH在自己的地址信号An-A0上看到的地址.所以需要执行一个右移操纵,把ADDR转换成HALF-WORD 地址.

举例说明,SST39VF160 每个SECTOR 的大小是4K-BYTE.从ARM 处器的角度和用户的角度来看,SECTOR-0 相对于FLASH起始地址的BYTE地址是0x0;从FLASH 来看SECTOR-0 的HALF-WORD地址是0x0.从ARM处理器的角度和用户的角度来看, FLASH SECTOR-1相对于FLASH起始地址的BYTE地址0x1000; 从FLASH来看, SECTOR-1的HALF-WORD地址应该是(0x1000 >> 1) = 0x800.

假如要擦除SECTOR-0,上面代码的第6条指令应该是:

*SysAddr16(sysbase, 0x0 >> 1) = 0x0030;

假如要擦除SECTOR-1,上面代码的第6条指令应该是:

*SysAddr16(sysbase, 0x1000 >> 1) = 0x0030;

HALF-WORD 编程操纵

写一个HALF-WORD的数据到FLASH中往,需要4个周期的总线写操纵

1 –将0x00AA写到FLASH HALF-WORD 地址0x5555

2 –将0x0055 写到FLASH HALF-WORD地址0x2AAA

3 –将0x00A0 写到FLASH HALF-WORD 地址0x5555

4 –将编程数据(HALF-WORD)写到对应的HALF-WORD地址

对应的代码:

*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值0x00AA 写到FLASH 地址0x5555

*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值0x0055 写到FLASH 地址0x2AAA

*SysAddr16(sysbase, 0x5555) = 0x00A0; //将值0x00A0 写到FLASH 地址0x5555

*SysAddr16(sysbase, addr >> 1) = data; //将数据写到对应的HALF-WORD 地址

留意:

上面的代码中第4个操纵周期中的ADDR是从ARM处理器的角度来看的BYTE地址, 由于在执行写操纵的时候,用户希看指定的是从ARM 的角度看到的地址,这样会更方便和更直观.而在SysAddr16 的宏定义中,OFFSET表示的是相对于FLASH起始地址的HALF-WORD偏移量. 所以需要执行一个右移操纵, 把它转换成HALF-WORD 地址.

举例说明,假如要数据0x0123 写到地址0x0 往,对应的是FLASH 的第0 个HAFL-WORD,对应的HALF-WORD 地址应该是0x0,上面代码的第4条指令应该是: *SysAddr16(sysbase, 0x0 >> 1) = 0x0123;

假如要数据0x4567写到地址0x2往, 对应的是FLASH的第1个HALF-WORD, 对应的HALF-WORD地址应该是0x1, 上面代码的第4条指令应该是:

*SysAddr16(sysbase, 0x2 >> 1) = 0x4567;

假如要数据0x89AB写到地址0x4往, 对应的是FLASH的第2个HALF-WORD, 对应的HALF-WORD地址应该是0x2,上面代码的第4条指令应该是:

*SysAddr16(sysbase, 0x4 >> 1) = 0x89AB;

假如要数据0xCDEF 写到地址0x6 往,对应的是FLASH 的第 3 个HALF-WORD,对应的HALF-WORD 地址应该是0x3,上面代码的第4条指令应该是:

*SysAddr16(sysbase, 0x6 >> 1) = 0xCDEF;

7. ADS 版源代码下载

假如用户有需要,可以往下载在前面讨论的 2 个实例的ADS 版的完整源代码和FLASH 数据手册.提供给用户的程序都是在实际使用过程中经过测试的.源代码只供用户参考,并不一定能直接使用在用户的开发板上.用户需要根据自己实际使用的芯片进行相应的修改.

源代码下载链接:https://www.360docs.net/doc/ff13996955.html,/forum/forumdisplay.php?fid=3

8. 结束语

这篇文章简单先容了如何对NOR FLASH进行操纵, 但没有包括状态查询, 保护等其他操纵. 对于更复杂的多片FLASH并联的情况也没有讨论.有需要的朋友可以自己往研究.

NAND Flash中文版资料

NAND Flash 存储器 和 使用ELNEC编程器烧录NAND Flash 技术应用文档 Summer 翻译整理 深圳市浦洛电子科技有限公司 August 2006

目录 一. 简介 ----------------------------------------------------------------------------------- 1 二. NAND Flash与NOR Flash的区别 -------------------------------------------- 1 三. NAND Flash存储器结构描叙 --------------------------------------------------- 4 四. 备用单元结构描叙 ---------------------------------------------------------------- 6 五. Skip Block method(跳过坏块方式) ------------------------------------------ 8 六. Reserved Block Area method(保留块区域方式)----------------------------- 9 七. Error Checking and Correction(错误检测和纠正)-------------------------- 10 八. 文件系统 ------------------------------------------------------------------------------10 九. 使用ELNEC系列编程器烧录NAND Flash -------------------------------- 10 十. Invalid Block Management drop-down menu -------------------------------- 12 十一. User Area Settings3 -------------------------------------------------------- 13 十二. Solid Area Settings --------------------------------------------------------- 15 十三. Quick Program Check-box ---------------------------------------------- 16 十四. Reserved Block Area Options --------------------------------------------17 十五. Spare Area Usage drop-down menu ------------------------------------18

NOR-FLASH驱动文档(SST39VF1601)

NOR-FLASH驱动文档(SST39VF1601)2012-03-30 00:57:33 NOR-FLASH是最早出现的Flash Memory,目前仍是多数供应商支持的技术架 构.NOR-FLASH在擦除和编程操作较少而直接执行代码的场合,尤其是纯代码存储的应用中广泛使用,但是由于NOR-FLASH只支持块擦除,其擦除和编程速度较慢,而块尺寸又较大,导致擦除和编程操作所花费的时间很长,所以在纯数据存储和文件存储的应用中显得力不从心. NOR-FLASH的特点是: 1. 程序和数据可存放在同一芯片上,FLASH芯片拥有独立的数据总线和地址总线,能快速随 机读取,并且允许系统直接从Flash中读取代码执行,而无需先将代码下载至RAM中再执行; 2. 可以单字节或单字读取,但不能单字节擦除,必须以部分或块为单位或对整片执行擦除操 作,在执行写操作之前,必需先根据需要对部分,块或整片进行擦除,然后才能写入数据。 以SST系列NOR-FLASH芯片为例介绍FLASH的使用方法及驱动. 首先,在驱动的头文件中,要根据芯片的具体情况和项目的要求作如下定义: 1. 定义操作的单位,如 typedef unsigned char BYTE; // BYTE is 8-bit in length typedef unsigned short int WORD; // WORD is 16-bit in length typedef unsigned long int Uint32; // Uint32 is 32-bit in length 在这里地址多是32位的,芯片写操作的最小数据单位为WORD,定义为16位,芯片读操作的最小数据单位是BYTE,定义为8位. 2. 因为芯片分为16位和32位的,所以对芯片的命令操作也分为16位操作和32位操作(命令 操作在介绍具体的读写过程中将详细介绍). #ifdef GE01 /*宏NorFlash_32Bit,若定义了为32位NorFlash,否则为16位NorFlash*/ #define NorFlash_32Bit #endif 3. 根据芯片的情况,定义部分(段)和块的大小. #define SECTOR_SIZE 2048 // Must be 2048 words for 39VF160X #define BLOCK_SIZE 32768 // Must be 32K words for 39VF160X

浅谈NorFlash的原理及其应用

浅谈NorFlash的原理及其应用 NOR Flash NOR Flash是现在市场上两种主要的非易失闪存技术之一。Intel 于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于Flash的管理需要特殊的系统接口。性能比较 flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash 器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。执行擦除时块尺寸的不同进一步拉大了NOR和NAND之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。这样,当选择存储解决方案时,设计师必须权衡以下的各项因素。 l 、NOR的读速度比NAND稍快一些。 2、NAND的写入速度比NOR快很多。 3 、NAND的4ms擦除速度远比NOR的5s快。 4 、大多数写入操作需要先进行擦除操作。 5 、NAND的擦除单元更小,相应的擦除电路更少。此外,NAND 的实际应用方式要比NOR复杂的多。NOR可以直接使用,并可在上面直接运行代码;而NAND需要I/O接口,因此使用时需要驱动程序。不过当今流行的操作系统对NAND结构的Flash都有支持。此外,Linux内核也提供了对NAND结构的Flash的支持。详解 NOR

DSP中FLASH烧写方法

FLASH烧写程序方法: 1、将要烧写的程序例如TIMER调通可以在线(用仿真器)下载。注意其source文件 中一定要包含boot.asm程序(见附件) 其cmd文件设置如下:主要修改其L2的长度为8000 *---------timer1.cmd--------- MEMORY { L1 : o = 0h l = 0x400 L2 : o = 00000400h l = 00008000h /* not all SRAM */ } SECTIONS { .boot_load > L1 .cinit > L2 .text > L2 .stack > L2 .bss > L2 .const > L2 .data > L2 .far > L2 .switch > L2 .sysmem > L2 .tables > L2 .cio > L2 } 2、查看TIMER程序的map文件,根据map文件中各段的地址和长度修改FLASH_PRG 程序(见附件)中flash_timer.h文件中的各段地址和长度如下: /* 程序入口点 */ #define ENTRY_POINT 0x000015a0 /* boot段的长度和RAM中地址设定 */ #define BOOT_SECTION_SIZE 0x00000400 #define BOOT_SECTION_ADDRESS 0x00000000 /* cinit段的长度和RAM中地址设定 */ #define CINIT_SECTION_SIZE 0x00001000 #define CINIT_SECTION_ADDRESS 0x00001820 /* text段的长度和RAM中地址设定 */ #define TEXT_SECTION_SIZE 0x00001420 #define TEXT_SECTION_ADDRESS 0x00000400 /* end of table */

总结NAND FLASH控制器的操作

NAND FLASH相对于NOR FLASH而言,其容量大,价格低廉,读写速度都比较快,因而得到广泛应用。NOR FLASH的特点是XIP,可直接执行应用程序, 1~4MB时应用具有很高的成本效益。但是其写入和擦除的速度很低直接影响了其性能。 NAND FLASH不能直接执行程序,用于存储数据。在嵌入式ARM应用中,存储在其中的数据通常是读取到SDROM中执行。因为NAND FLASH主要接口包括 几个I/O口,对其中的数据都是串行访问,无法实现随机访问,故而没有执行程序。 NAND FLASH接口电路是通过NAND FLAH控制器与ARM处理器相接的,许多ARM处理器都提供NAND FLASH控制器,为使用NAND FLASH带来巨大方便。 K9F2G08U0B是三星公司的一款NAND FLASH产品。 K9F2G08U0B包含8个I/O,Vss、Vcc、以及控制端口(CLE、ALE、CE、RE、WE、WP、R/B)。其存储结构分块。 共2K 块 每块大小16 页 每页大小2K + 64BYTE 即容量=块数×页数×每页大小=2K×16×(2K + 64BYTE)=256M BYTE + 8M BYTE NAND FLASH控制器提供了OM[1:0]、NCON、GPG13、GPG14、GPG15共5个信号来选择NAND FLASH启动。 OM[1:0]=0b00时,选择从NAND FLASH启动。 NCON:NAND FLASH类型选择信号。 GPG13:NAND FLASH页容量选择信号。 GPG14:NAND FLASH地址周期选择信号。 GPG15:NAND FLASH接口线宽选择。0:8bit总线宽度;1:16bit总线宽度。 访问NAND FLASH 1)发生命令:读、写、还是擦除 2)发生地址:选择哪一页进行上述操作 3)发生数据:需要检测NAND FLASH内部忙状态 NAND FLASH支持的命令: #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

STM32使用FSMC控制NAND flash 例程概要

本文原创于观海听涛,原作者版权所有,转载请注明出处。 近几天开发项目需要用到STM32驱动NAND FLASH,但由于开发板例程以及固件库是用于小页(512B,我要用到的FLASH为1G bit的大页(2K,多走了两天弯路。以下笔记将说明如何将默认固件库修改为大页模式以驱动大容量NAND,并作驱动。 本文硬件:控制器:STM32F103ZET6,存储器:HY27UF081G2A 首先说一下NOR与NAND存储器的区别,此类区别网上有很多,在此仅大致说明: 1、Nor读取速度比NAND稍快 2、Nand写入速度比Nor快很多 3、NAND擦除速度(4ms远快于Nor(5s 4、Nor 带有SRAM接口,有足够的地址引脚来寻址,可以很轻松的挂接到CPU 地址和数据总线上,对CPU要求低 5、NAND用八个(或十六个引脚串行读取数据,数据总线地址总线复用,通常需要CPU支持驱动,且较为复杂 6、Nor主要占据1-16M容量市场,并且可以片内执行,适合代码存储 7、NAND占据8-128M及以上市场,通常用来作数据存储 8、NAND便宜一些 9、NAND寿命比Nor长 10、NAND会产生坏块,需要做坏块处理和ECC 更详细区别请继续百度,以上内容部分摘自神舟三号开发板手册

下面是NAND的存储结构: 由此图可看出NAND存储结构为立体式 正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。一般而言,block、page之间的关系随着芯片的不同而不同。 需要注意的是,对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash 的擦写,而擦写则是以一个block为单位的。 我们这次使用的HY27UF081G2A其PDF介绍: Memory Cell Array = (2K+64 Bytes x 64 Pages x 1,024 Blocks 由此可见,该NAND每页2K,共64页,1024块。其中:每页中的2K为主容量Data Field, 64bit为额外容量Spare Field。Spare Field用于存贮检验码和其他信息用的,并不能存放实际的数据。由此可算出系统总容量为2K*64*1024=134217728个byte,即1Gbit。NAND闪存颗粒硬件接口: 由此图可见,此颗粒为八位总线,地址数据复用,芯片为SOP48封装。 软件驱动:(此部分写的是伪码,仅用于解释含义,可用代码参见附件 主程序: 1. #define BUFFER_SIZE 0x2000 //此部分定义缓冲区大小,即一次写入的数据 2. #define NAND_HY_MakerID 0xAD //NAND厂商号 3. #define NAND_HY_DeviceID 0xF1 //NAND器件号 4. /*配置与SRAM连接的FSMC BANK2 NAND*/

NAND FLASH在储存测试中的应用

NAND FLASH在储存测试系统中的应用(3) 2009-11-09 22:35:43 来源:王文杰马游春李锦明 关键字:NAND FLASH 储存测试K9K8G08UOM 2 NAND FLASkI Memory的硬件部分 本设计当中,FLASH的数据输入输出口、控制端口通过调理电路与FPGA的端口相连,图4所示是其硬件连接电路。 从图4中可知,FLASH的数据输入输出端口I/00~7、控制端口/CE、是通过芯片SN54LV245与FPGA相连;FLASH的控制端口cLE、ALE、/WE、/RE通过芯片SN54LV245和芯片74HCl4与ITGA相连。其中F-CLE、F-ALE、F—WE、F-RE、F—CE、F- R/Bur是FPGA的I/O口,是FPGA逻辑的输入输出口。CLE、ALE信号是FLASH存储器命令、地址锁存使能信号,/WE是保证命令、地址、数据能否及时正确的写入FLASH 的信号,/RE信号控制着数据的读取,这些信号的精确度关系着FLASH存储、读数功能的实现。所以,这些信号的好坏直接关系着FLASH的正常工作。经实践的电路调试,这些信号在传输过程中受到了其它因素的干扰,信号明显失真,在电路中加入74HCl4(非门)以后,信号会变得光滑,准确。 芯片SN54LV245是八进制三态总线收发器,DIR=1时,总线传输方向从A→B;DIR=0时,总线传输方向从B→A。/OE是片选信号。/0E,DIR信号是由FPGA内部编程逻辑控制的。 FL,ASH接口中,为了保证/wE、/RE、/CE、R/B控制信号初始状态无效,由硬件电路实现端口值拉高。本设计中不使用写保护功能,所以/WP端口也接上了上拉电阻。 3 结束语 基于闪存技术的固态存储器存储密度大,功耗小,可靠性高,体积小重量轻且成本也在不断降f氐,在航空应用中有良好的应用前景。在设计储存测试系统时选用大容量的NAIXD FLASH存储器大大提高了储存、读取速度,并且设计电路结构简单,易于修改。 (本文转自电子工程世界:http://www.eewo

Flash烧写步骤

Flash程序烧写步骤 1、protect off all erase all (如果要同时烧录fpga0、fpga1、vmlinux内核才使用此命令,擦除所有all。如果只需要更换其中的部分,可单独擦除,如下。) 2、printenv(查看网络连接情况) 3、setenv serverip 192.168.11.60(设置电脑地址) 4、setenv ipaddr 192.168.11.201(设置UC IP地址) 5、saveenv(保存设置) 6、setenv ethact octeth1 (erase 18080000 180fffff - 如果单独烧写fpga0则使用该命令擦除flash中原fpga0的内容,如果执行了命令“erase all”,则不用执行该命令) 7、tftp 20000000 fp0_v200c_0802.app (使用tftp将fpga0从电脑传到UC内存的20000000地址) tftp 20000000 fp0_v200d_20101108.app(软交换) 8、cp.b 20000000 0x18080000 0x39998 (【1】将刚传到UC内存地址20000000的fpga0拷贝到UC的flash的18080000地址中;【2】注意文件大小正确,此例的大小是0x39998) (erase 19f40000 19ffffff - 如果单独烧写fpga1则使用该命令擦除flash中原fpga1的内容,如果执行了命令“erase all”,则不用执行该命令) 9、tftp 20000000 fp1_v2005_0802.app (使用tftp将fpga1从电脑传到UC内存的20000000地址) tftp 20000000 fp1_v2007_20101207.app(软交换) 10、cp.b 20000000 0x19f40000 0x39998 (【1】将刚传到UC内存地址20000000的fpga1拷贝到UC的flash的18080000地址中;【2】注意文件大小正确,此例的大小是0x39998) (erase 0x18100000 0x186fffff - 如果单独烧写Linux则使用该命令擦除flash中原Linux的内容,如果执行了命令“erase all”,则不用执行该命令) tftp 20000000 vmlinux.64.2011_01_05.gz tftp 20000000 vmlinux.64.2011_01_18.gz(1-18最新内核) 11、tftp 20000000 vmlinux.64.2011_01_20.gz cp.b 0x20000000 0x18100000 0x598a41 (【1】将刚传到UC内存地址20000000的vmlinux.64.gz拷贝到UC的flash的18080000地址中;【2】注意文件大小正确,此例的大小是0x4fcff0) cp.b 0x20000000 0x18100000 0x598a7e(新版本的大小)在其修改了,还是在终端出现错误 12、cp.b 0x20000000 0x18100000 0x5cd321 13、askenv boot(设置boot参数) Please enter 'boot':gunzip 0x18100000 0x598a41 0x20000000 0xb00000(1-5号的版本) Please enter 'boot':gunzip 0x18100000 0x598a7e 0x20000000 0xb00000(1-18号的版本) 14、Please enter 'boot':gunzip 0x18100000 0x5cd321 0x20000000 0xb00000 (1-20号的版本) 15、askenv bootcmd(设置boot参数) 16、Please enter 'bootcmd':run boot;Init8201;bootoctlinux 17、saveenv(保存设置) 18、run bootcmd 19、在shell终端执行命令: 20、~ # ifconfig eth1 up<激活UC网口eth1> 21、~ # ifconfig eth1 192.168.11.1 <为UC的eth1网口配置IP地址>

nandflash用法

6 NAND FLASH CONTORLLER OVERVIEW In recent times, NOR flash memory gets high in price while an SDRAM and a NAND flash memory is comparatively economical , motivating some users to execute the boot code on a NAND flash and execute the main code on an SDRAM. S3C2440A boot code can be executed on an external NAND flash memory. In order to support NAND flash boot loader, the S3C2440A is equipped with an internal SRAM buffer called ‘Steppingstone’. When booting, the first 4K Bytes of the NAND flash memory will be loaded into Steppingstone and the boot code loaded into Steppingstone will be executed. Generally, the boot code will copy NAND flash content to SDRAM. Using hardware ECC, the NAND flash data validity will be checked. Upon the completion of the copy, the main program will be executed on the SDRAM. comparatively 比较地、相当地 motivating v. 激励;刺激;调动…的积极性(motivate的ing形式) execute vt. 实行;执行;处死 internal n. 内脏;本质adj. 内部的;里面的;体内的;(机构)内部的 Steppingstone n. 踏脚石;进身之阶;达到目的的手段 validity n. [计] 有效性;正确;正确性 content n. 内容,目录;满足;容量adj. 满意的;vt. 使满足 FEATURES 1. Auto boot: The boot code is transferred into 4-kbytes Steppingstone during reset. After the transfer, the boot code will be executed on the Steppingstone. 2. NAND Flash memory I/F: Support 256Words, 512Bytes, 1KWords and 2KBytes Page. 3. Software mode: User can directly access NAND flash memory, for example this feature can be used in read/erase/program NAND flash memory. 4. Interface: 8 / 16-bit NAND flash memory interface bus. 5. Hardware ECC generation, detection and indication (Software correction). 6. SFR I/F: Support Little Endian Mode, Byte/half word/word access to Data and ECC Data register, and Word access to other registers 7. SteppingStone I/F: Support Little/Big Endian, Byte/half word/word access. 8. The Steppingstone 4-KB internal SRAM buffer can be used for another purpose after NAND flash booting. 特性 1。自动引导:在复位时,引导代码写入4-k字节的中转区,在转移后启动 代码将在中转区上执行。 2。NAND闪存接口:支持256字,512字节,1k字和2KB字节页。 3。软件模式:用户可以直接访问NAND闪存,例如这个特性可以用于 读/写/擦除NAND闪存。

DSP串口烧写Flash方法

281x无需仿真器,串口烧写Flash方法 再发一次!希望版主不要再删!! 考虑到众多买不起仿真器的劳苦大众!下面提供利用PC RS232下载flash到281x的方法: 第一步:安装CCS2.2或更高版本 以确保你的源代码能编译为下载源码:xxx.out文件 第二步:安装串口编程算法项目文件:sdf28xx_v3_0_serial (Ti网站上有下载) 详情请阅读包含的:SDFlash_Serial_RefGuide_v3_0.pdf文件 第三步:在算法项目文件中设置好相应的时钟频率,并生成.out文件 (1)在CC中导入F2812SerialFlash.pjt文件 文件目录: C:\CCStudio_v3.1\specdig\sdflash\mydrivers\DSP281x_v3_0\DSP281x_serial\build\F28xxSerialFlas h (2)设置好你的目标板相应的时钟频率 在Flash280x_API_Config.h中相应的PLL时钟,我使用的是20M晶掁则选择: #define CPU_RATE 10.000L // for a 100MHz CPU clock speed (SYSCLKOUT) (3)保存并编译项目文件,生成F2812SerialFlash.out文件存放在: C:\CCStudio_v3.1\specdig\sdflash\mydrivers\DSP281x_v3_0\DSP281x_serial\bin 注:确定你的程序空间定义在flash段,(在CMD文件修改) 第四步:安装SdFlashV1.60或更高版本 第五步:编辑sdopts.cfg文件,此文件存放在你所安装的windows的System32目录下 (1)用记事本的方式打开sdopts.cfg (2)在"# End of sdopts.cfg”前加入如下文本: [EmulatorId=C1] EmuPortAddr=0xC1 EmuPortMode=RS232 EmuProductName=SERIAL_FLASH [EmulatorId=C2] EmuPortAddr=0xC2 EmuPortMode=RS232 EmuProductName=SERIAL_FLASH [EmulatorId=C3] EmuPortAddr=0xC3 EmuPortMode=RS232 EmuProductName=SERIAL_FLASH [EmulatorId=C4] EmuPortAddr=0xC4 EmuPortMode=RS232 EmuProductName=SERIAL_FLASH

NAND Flash原理和使用

目录 1.概述 (2) 2.功能框图 (3) 3.管脚 (3) 4.寻址 (4) 5.总线操作 (5) 6.命令表 (6) 7.PAGE READ,0x00-0x30 (7) 8.RANDOM DATA READ,0x05-0xE0 (7) 9.PAGE READ CACHE MODE START,0x31;PAGE READ CACHE MODE START LAST,0x3F (8) 10.READ ID,0x90 (8) 11.READ STATUS,0x70 (9) 12.编程操作 (9) 13.内部数据搬移 (11) 14.块擦除操作,0x60-0xD0 (12) 15.复位操作,0xFF (13) 16.写保护操作 (13) 17.错误管理 (14)

以Micron公司的MT29F2G08为例介绍NAND Flash原理和使用。 1.概述 MT29F2G08使用一个高度复用的8-bit总线(I/O[7:0])来传输数据、地址、指令。5个命令脚(CLE、ALE、CE#、WE#)实现NAND命令总线接口规程。3个附加的脚用作: 控制硬件写保护(WP#)、监视芯片状态(R/B#),和发起上电自动读特征(PRE-仅3V芯片支持)。注意, PRE功能不支持宽温芯片。 MT29F2G08内部有2048个可擦除的块,每个块分为64个可编程的页,每个页包含2112字节(2048个字节作为数据存储区,64个备用字节一般作为错误管理使用)。 每个2112个字节的页可以在300us内编程,每个块(64x2112=132K)可以在2ms内被擦除。片上控制逻辑自动进行PROGRAM和ERASE操作。 NAND的内部存储阵列是以页为基本单位进行存取的。读的时候,一页数据从内部存储阵列copy到数据寄存器,之后从数据寄存器按字节依次输出。写(编程)的时候,也是以页为基本单位的:起始地址装载到内部地址寄存器之后,数据被依次写入到内部数据寄存器,在页数据写入之后,阵列编程过程启动。 为了增加编程的速度,芯片有一个CACHE寄存器。在CACHE编程模式,数据先写入到CACHE寄存器,然后再写入到数据寄存器,一旦数据copy进数据寄存器后,编程就开始。在数据寄存器被装载及编程开始之后,CACHE寄存器变为空,可以继续装载下一个数据,这样内部的编程和数据的装载并行进行,提高了编程速度。 内部数据搬移命令(INTERNAL DATA MOVE)也使用内部CAHCE寄存器,通常搬移数据需要很长时间,通过使用内部CACHE寄存器和数据寄存器,数据的搬移速度大大增加,且不需要使用外部内存。

STM32使用FSMC控制NAND flash 例程

本文原创于观海听涛,原作者版权所有,转载请注明出处。 近几天开发项目需要用到STM32驱动NAND FLASH,但由于开发板例程以及固件库是用于小页(512B),我要用到的FLASH为1G bit的大页(2K),多走了两天弯路。以下笔记将说明如何将默认固件库修改为大页模式以驱动大容量NAND,并作驱动。 本文硬件:控制器:STM32F103ZET6,存储器:HY27UF081G2A 首先说一下NOR与NAND存储器的区别,此类区别网上有很多,在此仅大致说明: 1、Nor读取速度比NAND稍快 2、Nand写入速度比Nor快很多 3、NAND擦除速度(4ms)远快于Nor(5s) 4、Nor 带有SRAM接口,有足够的地址引脚来寻址,可以很轻松的挂接到CPU地址和数据总线上,对CPU要求低 5、NAND用八个(或十六个)引脚串行读取数据,数据总线地址总线复用,通常需要CPU支持驱动,且较为复杂 6、Nor主要占据1-16M容量市场,并且可以片内执行,适合代码存储 7、NAND占据8-128M及以上市场,通常用来作数据存储 8、NAND便宜一些 9、NAND寿命比Nor长 10、NAND会产生坏块,需要做坏块处理和ECC 更详细区别请继续百度,以上内容部分摘自神舟三号开发板手册 下面是NAND的存储结构: 由此图可看出NAND存储结构为立体式 正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。一般而言,block、page之间的关系随着芯片的不同而不同。 需要注意的是,对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash 的擦写,而擦写则是以一个block为单位的。 我们这次使用的HY27UF081G2A其PDF介绍: Memory Cell Array = (2K+64) Bytes x 64 Pages x 1,024 Blocks 由此可见,该NAND每页2K,共64页,1024块。其中:每页中的2K为主容量Data Field,64bit为额外容量Spare Field。Spare Field用于存贮检验码和其他信息用的,并不能存放实际的数据。由此可算出系统总容量为2K*64*1024=134217728个byte,即1Gbit。NAND闪存颗粒硬件接口: 由此图可见,此颗粒为八位总线,地址数据复用,芯片为SOP48封装。 软件驱动:(此部分写的是伪码,仅用于解释含义,可用代码参见附件) 主程序: 1. #define BUFFER_SIZE 0x2000 //此部分定义缓冲区大小,即一次写入的数据 2. #define NAND_HY_MakerID 0xAD //NAND厂商号 3. #define NAND_HY_DeviceID 0xF1 //NAND器件号

Flash烧写文档

Flash烧写 一般程序开始编译测试时,连接仿真器在RAM中运行,以2808为例,CMD文件包括如下: 当需要烧写进Flash运行测试时,将F2808_EzDSP_RAM_lnk.cmd这个文件替换为F2808.cmd。、 这时分为两种情况: 一,烧写进Flash中,仅仅在Flash中运行,将F2808.cmd文件中的如下屏蔽即可: 屏蔽ramfuncs功能为引导Flash中程序到RAM中运行。 二,当第一种做法,在烧写Flash时,最后出现如下报错,或者类似地址错误: 说明,你的程序在烧写Flash之后,需要也在RAM中运行,那么你需要这样做: 1,F2808中的ramfuncs部分不要屏蔽,如下

2,在主程序变量申明部分加入: 3,主函数初始化部分加入: 再编译烧写即可。 4,如编译出现“symbol referencing error”,检查工程文件有无DSP280x_MemCopy.c。如果没有DSP280x_MemCopy.c,将DSP280x_MemCopy.c添加到工程文件后再编译即可。 烧写操作: 一,开始烧写,Tools——F28xx On-chip Flash programmer或者点击按钮; 二,出现始终设置窗,如下设置:(以2808为例) 三,点击OK出现如下: 在Select DSP Dersion of Flash API 中,切记选择FlashAPIInterface2808V3_02.out 四,点击OK出现如下:

不用改动,点击Execute Operation即可。 其中Erase——擦除,Program——写入,Verify——校验,可以根据需要选择。 在Please specify the COFF file to 窗口选择烧写的文件,一般为你编译之后的.out文件。

大容量NAND Flash在多媒体手机中的应用

大容量NAND Flash 在多媒体手机中的应用 1 引言随着手机市场竞争的日趋激烈,多媒体手机逐渐成为市场的宠儿。 因为有大量的多媒体数据,因此大容量存储是多媒体手机所要解决的首要问题。NOR 和NAND 是现在市场上两种主要的非易失闪存技术。NOR 的特点是芯片 内执行(XIP,eXecuteInPlace),这样应用程序可以直接在flash 闪存内运行, 不必再把代码读到系统RAM 中。NOR 的传输效率很高,在1~4MB 的小容量 时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。NAND 结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的 速度也很快,是大数据量存储的最佳选择。在选择存储方案的时候,设计师必 须综合考虑以下因素:(1)NOR 的读速度比NAND 稍快一些。(2)NAND 的 写入速度比NOR 快很多(3)NAND 的4ms 擦除速度远比NOR 的5s 快。(4)大多数写入操作需要先进行擦除操作。(5)NAND 的擦除单元更小,相应的擦 除电路更少。(6)NAND 闪存中每个块的最大擦写次数是一百万次,而NOR 的擦写次数是十万次。此外,NAND 的使用比NOR 的使用复杂的多。在NOR 器件上运行代码不需要任何的软件支持,在NAND 器件上进行同样操作时,通 常需要驱动程序,也就是内存技术驱动程序(MTD),NAND 和NOR 器件在 进行写入和擦除操作时都需要MTD.使用NOR 器件时所需要的MTD 要相对少 一些,许多厂商都提供用于NOR 器件的更高级软件,这其中包括M-System 的TrueFFS 驱动,该驱动被 WindRiverSystem、Microsoft、QNXSoftwareSystem、Symbian 和Intel 等厂商所采用。2 TC58DDM82A1XBJ5 在多媒体手机中的应用在多媒体手机中,TC58DDM82A1XBJ5 主要用来存储图片、声音文件等数据量较大的文件。 TC58DDM82A1XBJ5 是Toshiba 公司生产的256MbitsNANDEEPROM.工作电压

STM32_FLASH的3种烧写方式

ST ARM 芯片的FLASH 烧写方法 一、 RVMDK+ULink2(ST ‐Link2、JLink) 注:适用于所有的ARM 芯片,但硬件上必须有JTAG 接口。 使用仿真器+ARM 开发环境,是最常用的一种方法。该方法适用于硬件上留有JTAG/SWD 接口,如有源程序代码,可以直接编译下载;另外使用RVMDK+ULink2也可直接下载.hex 文件,操作如下。 a) 打开或新建一个与芯片型号对应的工程,在工程设置中配置output 选项, 将需要下载的.hex 文件拷贝到output 目录下(output 文件夹中存放编译时输 ),如下图所示。 ©2008 MXCHIP Corporation. All rights reserved. b) 在Name of Executable:中输入.hex

名,如上图所示。 c) 配置Utilities 选项,选中Use Target Driver for Flash Programming 项(默认情 所示。 ©2008 MXCHIP Corporation. All rights reserved. d) c)添加Flash Programming Algorithm ,即添加与目标芯片对应的Flash 编程算法,如下图所示。

e)以上步骤完成后,连接仿真器和目标板,即可把目标程序烧写到芯片的Flash 中。 二、 串口+ISP软件 注:适用于带有ISP功能的ARM芯片,需要硬件上留有COM接口,且芯片的启 动模式可设置。 用户的ARM系列芯片带有ISP(在系统中编程)功能,则可使用其ISP功能, 通过串口和ISP软件来下载.bin文件。下面以STM32系列芯片为例(STM32全系 列芯片都带有ISP功能),演示该烧写方法。 a)将USART1口连接到PC的COM口(通常ISP使用的UART口都是芯片的第一 个UART口),设置芯片的启动模式为System Memary模式(BOOT1为0, ©2008 MXCHIP Corporation. All rights reserved.

如何用SmartPRO 6000纠正NAND Flash烧录过程位反转

如何用SmartPRO 6000纠正NAND Flash烧录过程位反转 近日某电子科技有限公司的客户邮件反馈:使用我们的SmartPRO 6000F-Plus烧录MICRON厂家的TSOP48封装的Nand Flash MT29F2G08ABAEA,不良率比较高,甚至达到了10%的烧录不良率,而烧录SAMSUNG厂家的TSOP48封装的K9F1G08U0E这颗芯片就不会有这种状况,由此可以确定烧录器与烧录座本身固件是没有问题的,所以客户怀疑应该是芯片算法有问题,需要我们重新优化下。 烧录器的功能很简单、很专一,那就是把数据完完整整、重复地复制到每一颗芯片上,复制成功了就提示Pass,复制失败了就提示Fail;SmartPRO 6000F-Plus是一台全心专注于高品质、高效率的Flash专用烧录编程器;目前为止,有广泛的、优秀的烧录客户群,软件、硬件和算法都是客户批量生产验证过的,非常成熟。 那问题究竟出在哪里呢,让我们继续看吧! 先友情提醒一下,我们的烧录软件做有一个监控“电子眼”(操作日记),时刻记录着客户对每颗芯片的烧录情况;客户有任何违规操作或者烧录异常现象,我们都可以迅速重返到“案发现场”,找到问题的根源;

我们第一时间让客户把操作日记发过来,从操作日记上看,客户反馈的现象确实存在,日志也帮助我们很快找到了这种异常: 但是这种现象并不是因为烧录器造成,而是芯片本身存在的工艺差异原因导致的;可能有人就会马上反驳,明显地出现如此高的烧录不良率,编程器原厂就没有任何责任,而是一句话就把问题推到芯片原厂?不要着急,继续往下看。 首先,我们普及一下Nand Flash的一个特性:位反转;Nand Flash由于本身硬件的内在特性,会导致(极其)偶尔的出现位反转的现象。所谓的位反转(bit flip),指的是原先Nand Flash中的某个位变化了,即要么从1变成0了,要么从0变成1了。而出现这种怪异的现

相关文档
最新文档