0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何自动识别是NOR flash 浅谈NOR flash工作原理

ss 作者:工程师谭军 2018-09-19 10:15 次阅读

本文主要是关于NOR flash的相关介绍,并着重对NOR flash的识别及其工作原理进行了详尽的阐述。

NOR flash工作原理

Nor Flash 具有像内存一样的接口,它可以像内存一样读,却不可以像内存一样写,Nor Flash 的写、擦除都需要发出特定的命令。谈到 Nor Flash 通常就会涉及到 CFI ([Common Flash Interface) 接口,一般 Nor Flash 都支持发命令来读取厂家 ID 和 设备 ID 等基本信息,但并不是所有的 Nor

Flash 都支持发命令来获取和芯片本身容量大小、扇区数、擦除块大小等信息。为了让将来的 Nor Flash 兼容性更好,引进了 CFI 接口,将芯片有关的信息都写入芯片内部,通过 CFI 命令就可以获取这些信息。

Linux 内核中对各种型号的 Nor Flash 都有很好的支持 ,但是其组织复杂,不利于分析。这里选用 u-boot 里面的 Nor Flash 代码来分析。代码位于:u-boot-2010.06/board/samsung/smdk2410/flash.c 。

通常内核里面要识别一个 Nor Flash 有两种方法:一种是 jedec 探测,就是在内核里面事先定义一个数组,该数组里面放有不同厂家各个芯片的一些参数,探测的时候将 flash 的 ID 和数组里面的 ID 一一比较,如果发现相同的,就使用该数组的参数。另一种是 cfi 探测,就是直接发各种命令来读取芯片的信息,比如 ID、容量等。jedec 探测的优点就是简单,缺点是如果内核要支持的 flash 种类很多,这个数组就会很庞大。。。/samsung/smdk2410/flash.c 文件采用的是第一种方法,但是还是有些区别的,内核里面用

jedec 探测一个芯片时,是先通过发命令来获取 flash 的 ID,然后和数组比较,但是 flash.c 中连 ID 都是自己通过宏配置的。

unsigned long flash_init (void)

{

for (i = 0; i 《 CONFIG_SYS_MAX_FLASH_BANKS; i++)

{

ulong flashbase = 0;

//设置 flash_id ,这个标志保存厂家 ID 和 设备 ID

flash_info[i].flash_id =

#if defined(CONFIG_AMD_LV400)

(AMD_MANUFACT & FLASH_VENDMASK) | (AMD_ID_LV400B & FLASH_TYPEMASK);

#elif defined(CONFIG_AMD_LV800)

(AMD_MANUFACT & FLASH_VENDMASK) | (AMD_ID_LV800B & FLASH_TYPEMASK);

#else

#error “Unknown flash configured”

#endif

//设置 flash 大小和扇区数

flash_info[i].size = FLASH_BANK_SIZE;

flash_info[i].sector_count = CONFIG_SYS_MAX_FLASH_SECT;

//对于 flash 的每个扇区,都需要保存扇区的首地址

for (j = 0; j 《 flash_info[i].sector_count; j++)

{

。。.。。.

flash_info[i].start[j] = flashbase + (j - 3) * MAIN_SECT_SIZE;

}

size += flash_info[i].size; //片外所有flash 的总大小

}

//对代码区的扇区设置写保护,这里只是软件的一种设定

flash_protect (FLAG_PROTECT_SET, CONFIG_SYS_FLASH_BASE,

CONFIG_SYS_FLASH_BASE + monitor_flash_len - 1,

&flash_info[0]);

//如果环境变量保存在 nor 里面,还需对这些扇区设置写保护

flash_protect (FLAG_PROTECT_SET, CONFIG_ENV_ADDR,

CONFIG_ENV_ADDR + CONFIG_ENV_SIZE - 1, &flash_info[0]);

return size; //返回 flash 大小

}

flash_init() 函数主要是做一些 flash 的初始化,比如设置 flash 的 ID、大小、扇区数等来构造flash_info_t 结构体,但是从上面的代码可以看出,在该初始化函数中并没有做任何与硬件有关的初始化,所有的值都是通过外部赋值,也就是说我们可以给这些成员变量赋任何我们想要的值,哪怕这些值并不是

flash 真正的参数,虽然这些值并不影响本函数的调用,但是和下面这些函数就有密切关系。

int flash_erase (flash_info_t * info, int s_first, int s_last)

{

//参看是否有写保护扇区,有直接返回错误

prot = 0;

for (sect = s_first; sect 《= s_last; ++sect)

{

if (info-》protect[sect])

prot++;

}

if (prot)

return ERR_PROTECTED;

//关闭中断等,防止擦除过程被中断

cflag = icache_status ();

icache_disable ();

iflag = disable_interrupts ();

/* Start erase on unprotected sectors */

for (sect = s_first; sect 《= s_last && !ctrlc (); sect++)

{

printf (“Erasing sector %2d 。。. ”, sect);

/* arm simple, non interrupt dependent timer */

reset_timer_masked ();

if (info-》protect[sect] == 0) //此处的判断有点多余

{ /* not protected */

//取扇区的首地址

vu_short *addr = (vu_short *) (info-》start[sect]);

//发解锁和擦除扇区命令

MEM_FLASH_ADDR1 = CMD_UNLOCK1; //往地址 0x555《《1 写入 0xAA

MEM_FLASH_ADDR2 = CMD_UNLOCK2; //往地址 0x2AA《《1 写入 0x55

MEM_FLASH_ADDR1 = CMD_ERASE_SETUP;//往地址 0x555《《1 写入 0x80

MEM_FLASH_ADDR1 = CMD_UNLOCK1;

MEM_FLASH_ADDR2 = CMD_UNLOCK2;

*addr = CMD_ERASE_CONFIRM; //往地址 0x555《《1 写入 0x30

/* wait until flash is ready */

chip = 0;

do

{

result = *addr; //读取该扇区首地址里面的值

/* check timeout */

if (get_timer_masked () 》 CONFIG_SYS_FLASH_ERASE_TOUT)

{

MEM_FLASH_ADDR1 = CMD_READ_ARRAY;

chip = TMO;

break;

}

//BIT_ERASE_DONE = 0x80,即判断 DQ7 是否为 1

if (!chip && (result & 0xFFFF) & BIT_ERASE_DONE)

chip = READY;

//BIT_PROGRAM_ERROR = 0x20,即判断 DQ5 是否为 1

if (!chip && (result & 0xFFFF) & BIT_PROGRAM_ERROR)

chip = ERR;

} while (!chip);

MEM_FLASH_ADDR1 = CMD_READ_ARRAY; //往地址 0x555《《1 写入 0xF0

。。.。。.

printf (“ok.n”);

}

else

{ /* it was protected */

printf (“protected!n”);

}

}

。。.。。.

/* allow flash to settle - wait 10 ms */

udelay_masked (10000);

return rc;

}

如何自动识别是NOR flash

Norflash启动时:

4K的内部SRAM都被映射到了0x40000000-0x40001000

Nandflash启动时:

4K的内部SRAM都被映射到了0x40000000,同时还被映射到了0x00000000-0x00001000

所有,我们可以通过判断0x0000003c处的数据是否和0x4000003c处的数据相等来判断是哪种启动方式。选择这个地址是因为这个地址处的值固定是0xdeadbeef

3c = 60 = 4*15

.globl _start_start: b start_code ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq _undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq .balignl 16,0xdeadbeef

在start.S里的代码如下

/***************** CHECK_BOOT_FLASH ******************************************/ ldr r1, =( (4《《28)|(3《《4)|(3《《2) ) /* address of Internal SRAM 0x4000003C*/ mov r0, #0 /* r0 = 0 */ str r0, [r1] mov r1, #0x3c /* address of men 0x0000003C*/ ldr r0, [r1] cmp r0, #0 bne relocate /* recovery */ ldr r0, =(0xdeadbeef) ldr r1, =( (4《《28)|(3《《4)|(3《《2) ) str r0, [r1]/***************** CHECK_BOOT_FLASH ******************************************/

Uboot里的流程:启动时先将0x4000003C处的数据清零,再读出0x0000003C处地址的数据,如果为0就意味着,这个地址是同时映射在0x4000003C处和0x0000003C处即为nandflash启动,不相等则为norflash启动。

但是最后有一点很重要:如果是Nand flash启动,必须要复原清零的数据。原因是:在nand boot过后,会核对内部SRAM中的4K程序,和从Nand中拷贝到SDRAM的前4K程序是否一致,如果不一致会进入死循环。

nor flash是如何读写数据的

(1) Nor Flash工作模式

Nor Flash上电后处于数据读取状态(Reading Array Data)。此状态可以进行正常的读。这和读取SDRAM/SRAM/ROM一样。(要是不一样的话,芯片上电后如何从Nor Flash中读取启动代码。~)

一般再对Flash进行操作前都要读取芯片信息比如设备ID号。这样做的主要目的是为了判断自己写的程序是否支持该设备。 Nor Flash支持2种方式获取ID号。一种是编程器所用的方法需要高电压(11.5V-12.5V)。另一种方法就是所谓的in-system方法,就是在系统中通过Nor Flash的命令寄存器来完成。本文中只对in-system方法进行说明。此时需要切换到自动选择(Autoselect Command),这要通过发送命令来完成。命令类型见下图。注意:

进入自动选择(Autoselect Command)模式后需要发送复位命令才能回到数据读取状态(Reading Array Data)。

在完成信息获取后一般就要擦除数据。 Nor Flash支持扇区擦(Sector Erase)除和整片擦除(Chip Erase)。这2种模式都有对应的命令序列。在完成擦除命令后会自动返回到数据读取(Reading Array Data)状态。在返回前可查询编程的状态。

完成擦除后就需要对芯片进行写入操作也就是编程。这就需要进入编程(Program)状态。在完成编程命令后会自动返回到数据读取(Reading Array Data)状态。在返回前可查询编程的状态。注意:编程前一定要先擦除。因为编程只能将’1’改写为’0’,通过擦写可以将数据全部擦写为‘1’。

(2)Nor Flash 硬件连接

1. 引脚47 为BYTE# :当其为高电平时数据输出为16bit模式(此时地址线为A19:A0)。低电平为8bit模式。 (此时地址线为A19:A1)上图中Pin47加VCC选用的是16bit模式有效地址线为A19:A0.

2. 对于16bit模式要16bit对齐因此S3C2440A的LADDR1要与A0连接。此时要注意的是NorFlash片内地址0x555对应S3C2440A的地址为baseaddr+0x555*2;其中baseaddr与NorFlash映射的地址有关。一般NorFlash放在Bank0.所以baseaddr=0,但是开启mmu后baseaddr=地址0映射到的新地址。0x555*2的原因是LADDR1与A0连接。也就是0x555表示片内第0x555个word(16bit)。

3. 引脚15为RYBY#输出引脚。用于输出Ready与Busy信号。实际用时可以不接。可用命令查询NorFlash状态代替。

( 3) Nor Flash 模式编程

1. 读ID

2. 扇区擦除(Sector Erase)

扇区擦除命令序列的每个周期均为写周期。

3. 编程(Program)

4. 写操作状态(WRITE OPERATION STATUS)

Nor Flash 提供几个数据位来确定一个写操作的状态,它们分别是: DQ2, DQ3, DQ5, DQ6,DQ7, and RY/BY#. 如上图所示。其中DQ7, RY/BY#引脚, 和 DQ6 中的每一个都提供了一种方法来判断一个编程或者擦除操作是否已经完成或正在进行中。实际编程中只需要使用其中的一种。

DQ7:Data# Polling bit,DQ7在编程时的状态变化。

在编程过程中从正在编程的地址中读出的数据的DQ7为要写入数据的补码。比如写入的数据为0x0000,及输入的DQ7为‘0’,则在编程中读出的数据为‘1’;当编程完成时读出的数据又变回输入的数据即’0’。在擦除过程中DQ7输出为’0’;擦除完成后输出为’1’;注意读取的地址必须是擦除范围内的地RY/BY#:高电平表示‘就绪’,低电平表示‘忙’。

DQ6:轮转位1(Toggle Bit 1)。

编程和擦除期间,读任意地址都会导致DQ6的轮转(0,1间相互变换)。。当操作完成后,DQ6停止转换。

DQ2:轮转位2(Toggle Bit 2)。当某个扇区被选中擦除时,读有效地址(地址都在擦除的扇区范围内)会导致DQ2的轮转。

注意:DQ2只能判断一个特定的扇区是否被选中擦除。但不能区分这个快是否正在擦除中或者正处于擦除暂停状态。相比之下,DQ6可以区分NorFlash是否处于擦除中或者擦除状态,但不能区分哪个快被选中擦除。因此需要这2个位来确定扇区和模式状态信息。

DQ5: 超时位(Exceeded Timing Limits),当编程或擦除操作超过了一个特定内部脉冲计数是DQ5=1;这表明操作失败。当编程时把’0’改为’1’就会导致DQ5=1,因为只有擦除擦做才能把’0’改为’1’。当错误发生后需要执行复位命令(见图1-1)才能返回到读数据状态。

DQ3: (扇区擦除计时位)Sector Erase Timer,只在扇区擦除指令时起作用。当擦除指令真正开始工作是DQ3=1,此时输入的命令(除擦除暂停命令外)都被忽略。DQ3=0,是可以添加附加的扇区用于多扇区擦除

结语

关于NOR flash的相关介绍就到这了,如有不足之处欢迎指正。

相关阅读推荐:NAND flash和NOR flash的区别详解

相关阅读推荐:详细剖析NorFlash和NandFlash的区别

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储器
    +关注

    关注

    38

    文章

    7231

    浏览量

    162550
  • NOR flash
    +关注

    关注

    2

    文章

    87

    浏览量

    22900
收藏 人收藏

    评论

    相关推荐

    什么是串行Nor Flash?串行Nor Flash的结构和参数特性

    引言:串行Nor Flash是一类使用比较多的存储器件,在特殊应用场景中具有不可替代的地位,本节是数字存储器件系列第一节,介绍串行Nor Flash的结构和参数特性。
    的头像 发表于 09-05 10:09 2236次阅读
    什么是串行<b class='flag-5'>Nor</b> <b class='flag-5'>Flash</b>?串行<b class='flag-5'>Nor</b> <b class='flag-5'>Flash</b>的结构和参数特性

    NAND FlashNOR Flash的差别

    NAND FlashNOR Flash 的差别在哪儿呢?从字面意思上看, NAND = not AND(与非),NOR = not OR(或非),也有可能是NMOS AND/OR
    发表于 09-11 16:59 3696次阅读
    NAND <b class='flag-5'>Flash</b>和<b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b>的差别

    NAND FLASHNOR FLASH的技术对比

    目前,NOR FLASH和NAND FLASH是市场上主要的非易失性闪存技术,但是据我了解,还是有很多工程师分不清NAND FLASHNOR
    发表于 10-01 14:05 706次阅读
    NAND <b class='flag-5'>FLASH</b>与<b class='flag-5'>NOR</b> <b class='flag-5'>FLASH</b>的技术对比

    旺宏并行串行NOR Flash对比参考指南

    并行NOR Flash每次传输多个bit位的数据,而串行NOR Flash每次传输一个bit位的数据。并行NOR
    发表于 03-09 16:06 54次下载

    旺宏串行NOR Flash简介

    串行NOR Flash介绍,串行NOR Flash分类、串行NOR Flash选型以及串行
    发表于 03-10 14:52 30次下载

    nand nor flash区别

    nand nor flash区别    NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR
    发表于 06-30 16:29 1210次阅读

    NOR FLASH的原理及应用

    VDRF256M16是珠海欧比特公司自主研发的一种高速、大容量的NOR FLASH,可利用其对大容量数据进行高速缓存。文中介绍了该芯片的结构和原理,并同时给出了一个系统中大容量、高速数据传输要求
    发表于 10-15 12:20 23次下载
    <b class='flag-5'>NOR</b> <b class='flag-5'>FLASH</b>的原理及应用

    NOR flashflash有什么不一样?

    Nor Flash的接口和RAM完全相同,可以随机访问任意地址的数据,在其上进行读操作的效率非常高,但是擦除和写操作的效率很低,另外,Nor Flash的容量一般比较小,通常,
    的头像 发表于 10-07 15:39 1.1w次阅读

    NAND FlashNOR Flash的区别

    1.1接口差别NOR Flash带有SRAM接口,有足够的地址引脚来寻址,可以直接和CPU相连,CPU可以直接通过地址总线对NOR Flash进行访问,可以很容...
    的头像 发表于 12-14 22:48 2397次阅读

    NOR falsh、NAND flash、SDEMMC、QSPI flash、SPI flash

    1、NOR flashNOR flash数据线和地址线分开,可以实现ram一样的随机寻址功能,可以读取任何一个字节。但是擦除仍要按块来擦。2、NAND flashNAND flash数据线和地址
    发表于 12-02 12:21 30次下载
    <b class='flag-5'>NOR</b> falsh、NAND <b class='flag-5'>flash</b>、SDEMMC、QSPI <b class='flag-5'>flash</b>、SPI <b class='flag-5'>flash</b>

    NOR Flash和NAND FLASH的区别是什么

    使用FlashMemory作为存储介质。 根据硬件上存储原理的不同,Flash Memory主要可以分为NOR Flash和NAND FLASH两类。主要的差异如下所示: NAND
    发表于 01-25 17:25 6w次阅读
    <b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b>和NAND <b class='flag-5'>FLASH</b>的区<b class='flag-5'>别是</b>什么

    NAND FlashNOR Flash的区别

    1.1接口差别NOR Flash带有SRAM接口,有足够的地址引脚来寻址,可以直接和CPU相连,CPU可以直接通过地址总线对NOR Flash进行访问,可以很容...
    发表于 01-26 17:12 15次下载
    NAND <b class='flag-5'>Flash</b>和<b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b>的区别

    TWS蓝牙耳机SPI NOR Flash

    近年来,在物联网和消费电子产品的需求下,特别是在各种新兴应用的推动下,NOR Flash迎来了低谷翻转的机遇。不仅中高容量价格稳定,而且低容量NOR 
    的头像 发表于 07-31 14:33 593次阅读

    为什么Nor Flash可以实现XIP,而Nand flash就不行呢?

    为什么Nor Flash可以实现XIP,而Nand flash就不行呢? Flash存储器是一种常用的非易失性存储器,广泛应用于各种电子设备中。它们的价值在于它们可以快速读取和写入数据
    的头像 发表于 10-29 16:32 889次阅读

    NAND FlashNOR Flash的区别

    NAND FlashNOR Flash是两种常见的闪存类型。
    的头像 发表于 11-30 13:53 1414次阅读
    NAND <b class='flag-5'>Flash</b>和<b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b>的区别