norflash移植基础知识

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

norflash移植基础知识
一般再对Flash进行操作前都要读取芯片信息比如设备ID号。

这样做的主要目的是为了判断自己写的程序是否支持该设备。

Nor Flash支持2种方式获取ID
号。

一种是编程器所用的方法需要高电压(11.5V-12.5V )。

另一种方法就是所一般再对Flash进行操作前都要读取芯片信息比如设备ID号。

这样做的主要目的是为了判断自己写的程序是否支持该设备。

Nor Flash支持2种方式获取ID
号。

一种是编程器所用的方法需要高电压(11.5V-12.5V )。

另一种方法就是所谓的in-system 方法,就是在系统中通过NorFlash的命令寄存器来完成。

本文中只对in-system方法进行说明。

此时需要切换到标准读模式。

通过software id exit/CFI exit 命令完成。

在完成信息获取后一般就要擦除数据。

注意:编程前一定要先擦除。

因为编程只能将’1'改写为’0',通过擦写可以将数据全部擦写为‘ 1'。

2. nor flash 硬件连接
AXt29LX l 60DB SST19VF
NOR Flash 最大可兼容8M
注意:AO 和LADDR 相连,所以
#defi ne MEM_FLASH_ADDR1 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 1)))
#defi ne MEM_FLASH_ADDR2 (*(volatile u16
*)(CONFIG_SYS_FLASH_BASE + (0x000002AA << 1)))
一般 NorFlash 放在 Bank0.所以 CONFIG_SYS_BASE 但0是开启 mm 后
baseaddr= 地址0映射到的新地址。

0x555<<1的原因是LADDR 与 A0连接。

也就是 0x555 表示片内第0x555个word(16bit). 1.读 ID
读id 共有4个指令周期,钱3个为写周期,最后一个为读周期; #defi ne flash_base 0x00000000 //flash #defi ne CMD_ADDR0 *((volatile U16 *)(0x555*2+flash_base))
U1C
LADDR2 24
LADDR3 23 LADDR4 "22" L ADD RS 2! LAODRB 20 LADDRT 7 LADDRB IS LADDR9
R
LAOQftll 6
LADDA12 0
LADDR13 4 LADDA14 3 L ADD IMS 2
UADDR16
LADDR1T 4M LADDR1B LADDRfB 16 LADDR20 9
LADDRJ-t ⑷
LADDR22
Ij
D3J V
Y
£# XE1 H 1
27
----------------------------
\s
A9 \J0 \U
M2 413
\14
AIS
Xift
AIR A19
■\2lr SC
A21 XC
DO
D 】D2 D3 D4 D5 D6

1)9 DIO DH D32 □ 13 D14 D35
of
WE

CE
RSTXC
VSS Wp
\ss
29
LDATAO 3]
LDATA1 33 LDATA2 35
LDATA3 势
LDATA4 40 LDATA5 42 LDATA6 44 LDATA7 30 LDATA8 32 LDATA4 34 LDATA-IO 36 LDATA11
39
LDATA1 2 LDATA1 3 4j LDATA14
4:
LPATA1 S
9
2S LnOE II Ln WE 26
nGCSO
i 「幵" J J.
* * fitted u
i
vm )s3\
接到bank0上
#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;//Wor模式命令序列
*((volatile U16 *)(SA)) = 0x30;
Waitfor_endofprg();// 状态查询
}
3. 编程(Program)
编程命令序列的每个周期均为写周期view plaincopy to clipboardprint? int Am29LV800D_WordProg (U32 PA,U16 PD)
{
CMD_ADDR0 = 0xAA; CMD_ADDR1 = 0x55; CMD_ADDR0 = 0xA0;
*((volatile U16 *)(PA)) = PD;// word 模式,以上为4 个命令周期
return(Waitfor_endofprg());// 状态查询
}
int Am29LV800D_WordProg (U32 PA,U16 PD)
{
CMD_ADDR0 = 0xAA; CMD_ADDR1 = 0x55; CMD_ADDR0 = 0xA0;
*((volatile U16 *)(PA)) = PD;// word 模式,以上为4 个命令周期
return(Waitfor_endofprg());// 状态查询
}
4. 写操作状态(WRITE OPERATION STATUS)
NorFlash 提供几个数据位来确定一个写操作的状态,它们分别是: DQ2, DQ3,
DQ5, DQ6,DQ7, and RY/BY#.如上图所示。

其中DQ7, RY/BY#引脚,和DQ6 中的每一个都提供了一种方法来判断一个编程或者擦除操作是否已经完成或正在进行中。

实际编程中只需要使用其中的一种。

一般再对Flash 进行操作前都要读取芯片信息比如设备ID 号。

这样做的主要目的是为了判断自己写的程序是否支持该设备。

Nor Flash 支持 2 种方式获取ID 号。

一种是编程器所用的方法需要高电压( 11.5V-12.5V )。

另一种方法就是所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是可以添加附加的扇区用于多扇区擦除。

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

从内存复制到内存中,字节顺序没有发生变化,但从内存中复制到Flash 中,字节顺序就反
过来了,比如正确的数据是12 00 00 ea ,但是复制到Flash 中,却变成了ea 00 00 12(u-boot 映像文件开头的 4 个字节)。

我百思不得其解。

难道是大端小端的问题?但又觉得不可能。

这次修改的地方有两处:
1、再次认真学习datasheet ,将操作命令序列对照一次,主要是地址及对应的数据,比如第一个Bus 写周期的地址是555H ,数据为AAH 等等。

结果还真找到错误来,原来将Block 擦除和Sector 擦除的地址反过来了。

2、将这个文件中所有CONFIG_B2 改成自己的配置宏定义。

这样总算解决了。

以前还有一个疑问,宏CONFIG_SYS_FLASH_ADDR0 的定义为0x5555 ,这个第一个写周期(1st Bus Write Cycle) 的地址,但是手册里的却是555H ,我想了很久也没想通。

今天再研究了一下,原来,手册里对这个地址的解释是:
Address format A10-A0(Hex).
Addresses A11-A21 can be VIL or VIH, but no other value, for Command seqence for SST39VF640xB. 原来,地址格式是A10-A0 而已,其它可以为高、低电平。

这样,0x5555 与555H 在低11 位来看是完全一样的。

这样写可能是凑够一个字(32bit) ,利于代码而已。

相关文档
最新文档