Nor Flash数据存储规则与数据读写方法(2)

2018-12-19 21:15

对应的代码:

*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 的角度看到的地址,这样会更方便


Nor Flash数据存储规则与数据读写方法(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:新标准大学英语(第二版)综合教程 精读2 课后参考翻译

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: