nor flash移植知识点

本文详细介绍了NorFlash的ID读取方法,包括编程器使用的高电压方法和系统内的方法。阐述了如何切换到标准读模式并完成信息获取后的擦除数据步骤。同时,文章还讲解了NorFlash硬件连接注意事项、读ID过程、擦除扇区、编程和写操作状态等关键概念。
摘要由CSDN通过智能技术生成

一般再对Flash进行操作前都要读取芯片信息比如设备ID号。这样做的主要目的是为了判断自己写的程序是否支持该设备。 Nor Flash支持2种方式获取ID号。一种是编程器所用的方法需要高电压(11.5V-12.5V)。另一种方法就是所谓的in-system方法,就是在系统中通过NorFlash的命令寄存器来完成。本文中只对in-system方法进行说明。此时需要切换到标准读模式。通过software id exit/CFI exit 命令完成。在完成信息获取后一般就要擦除数据。

注意:编程前一定要先擦除。因为编程只能将’1’改写为’0’,通过擦写可以将数据全部擦写为‘1’。norflash1

2. nor flash 硬件连接

1

注意: A0和LADDR1相连,所以

#define MEM_FLASH_ADDR1        (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 1)))
#define MEM_FLASH_ADDR2        (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x000002AA << 1)))

一般 NorFlash 放在 Bank0. 所以CONFIG_SYS_BASE =0, 但是开启 mmu baseaddr= 地址 0 映射到的新地址。 0x555<<1 的原因是 LADDR1 A0 连接。也就是 0x555 表示片内第 0x555 word(16bit).

1. ID

 

读id共有4个指令周期,钱3个为写周期,最后一个为读周期;

 

#define flash_base 0x00000000 //flash接到bank0上
#define CMD_ADDR0 *((volatile U16 *)(0x555*2+flash_base))
#define CMD_ADDR1 *((volatile U16 *)(0x2aa*2+flash_base))
#define CMD_ADDR2 *((volatile U16 *)(0xaaa*2+flash_base))
/*** 读取 Am29LV800D 的ID ***/
U32 Get_Am29LV800D_ID(void)
{
U32 i="0";
CMD_ADDR0 = 0xaa; CMD_ADDR1 = 0x55; CMD_ADDR0 = 0x90;
i = (*(U16 *)(0*2+flash_base))<<16;//Manufacturer ID = 01
CMD_ADDR0 = 0xaa; CMD_ADDR1 = 0x55; CMD_ADDR0 = 0x90;
i |= *(U16 *)(1*2+flash_base);//device ID = 2249
return i;
}

2.2 擦除扇区

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

void Am29LV800D_SectorErase(U32 SA)

{

CMD_ADDR0 = 0xAA; CMD_ADDR1 = 0x55; CMD_ADDR0 = 0x80;

CMD_ADDR0 = 0xAA; CMD_ADDR1 = 0x55;//Word 模式命令序列

*((volatile U16 *)(SA)) = 0x30;

Waitfor_endofprg();//状态查询

}

3. 编程(Program)

编程 命令序列的每个周期均为写周期。

int Am29LV800D_WordProg(u32 PA, u16 PD)

{

CMD_ADDR0 = 0xAA; CMD_ADDR1 = 0x55; CMD_ADDR0 = 0xA0;

*((volatile u16 *)(PA)) = PD;

return(Waitfor_endofprg());

}

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

NorFlash 提供几个数据位来确定一个写操作的状态,它们分别是: 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轮转位1Toggle Bit 1)。

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

DQ2轮转位2Toggle 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,是可以添加附加的扇区用于多扇区擦除。

以上讲了这些状态为,实际只需要使用几个就行,比较简单的就是选择DQ5,DQ6/DQ2.如下例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值