Red Point

十年饮冰 , 热血难凉 ; 山高万仞 , 只登一步

  博客园 :: 首页 :: 博问 :: 闪存 :: :: :: :: 管理 ::

https://blog.csdn.net/lizuobin2/article/details/50381791 

 

最近在搞Uboot时才发现自己的裸机实验中没有相关NorFlash的代码,对NorFlash一无所知,查了一些资料,将自己的一点心得总结一下。

       开发板:mini2440

       NorFlash:SST39VF1601

 

       NorFlash简单来说与sdram与Nand的中间品,它能像sdram一样直接读,但是又得像nand一样编程擦写。因此程序可以直接在nor里跑,速度要比sdram慢一些,往nor里写数据必须先擦除,因为nor的每一位只能由1变为0。Nor可读不可直接写的特性可以被用来判断是Nor启动还是nand启动,因为nand启动的话前4K是可写的,我们写入数据再读取出来应该是没有问题的,而nor启动的话,读出的数据必然是错误的。

 

NorFlash的硬件接线:

       首先,如果做过sdram实验的朋友应该知道,NorFlash与sdram很相似,只不过sdram位宽为32,NOR为16。在硬件连接上,Nor的地址线与cpu的地址线错开1位,sdram错开2位。简单分析一下:

       32位的CPU地址线为32位,每一个地址对应1个byte,地址的步长为1byte
               0x0000 0000 对应第1个地址空间 大小为1bytes
               0x0000 0001 对应  2           大小为1bytes
               依次类推...
               可以理解为cpu的地址类型 为 u8 * addraddr+1  移动1个字节
       32位的sdram,每一个地址对应于4个byte,地址步长为4byte
               0x0000 0000 对应第1个地址空间 大小为4bytes
               0x0000 0001 对应  2           大小为4bytes
               依次类推...
               可以理解为sdram的地址类型 为 u32 * addraddr+1  移动4个字节
       16位的nor,每一个地址对应于2个byte,地址步长为2byte
               0x0000 0000 对应第1个地址空间 大小为2bytes
               0x0000 0001 对应  2           大小为2bytes
               依次类推...
               可以理解为nor的地址类型 为 u16 * addraddr+1  移动2个字节
       因此,CPU的地址与它们的地址是错位的。
               CPU的4个连续地址 如 0 1 2 3 均对应于sdram的 0地址
               CPU的2个连续地址 如 0 1     均对应于nor  的 0地址

       假如我想取sdram 0地址的 第二个byte 地址如何写?对于sdram和nor具体的每一个byte是无法寻址的呀,但是arm有一个叫存储管理器的东西,它大概会帮我们实现单字节的读写,至于sdram和nor支不支持单字节读写,我们后边在分析。

 

 

NorFlash的软件设置:

       需要像初始化sdram一样,设置Bank寄存器,主要是一些时序图的时间大小。

位宽在BWSCON寄存器中设置,不过它是由硬件决定的,bank0的位宽,我们拨动开关选择nor启动还是nand启动的时候,它就已经确定了。

NorFlash信息:

        我这款Nor大小为2M,32个Block,每个block分为16个sector,一个sector为4K,具体信息如下图。

 

NorFlash写、擦除、读芯片ID:

       Nor可以像sdram一样直接读取,对于其它的操作,例如写、擦除、读信息等需要写特定的Date到特定的Addr。

这里尤其需要注意的是,Addr指的是nor地址线上看到的地址,相对于cpu也就是我们写程序的时候,需要将addr<<1,这样cpu错位的地址线发出的地址正好对上nor需求的地址。

对于擦除操作,nor支持按block、sector或者整片的擦除,整个擦除需要6个周期,以按sector擦除为例,前五个周期为往XXX里写XXX,最后一个周期将0X30写入要擦除的sector对应的首地址即可。

        对于写操作,需要4个周期,前3个周期往XXX里写XXX,最后一个周期将Data写入addr,这里需要注意的是addr必须是半字对齐,data也要求为16bit。

 

       对于读取信息的操作,主要是读ID的操作,前3个周期往XXX里写XXX,第四个周期去读特定的地址,对于DeviceID来说,A1-A19=0,A0=1,对于CPU来说就是0x1<<1.      

NorFlash的等待:
       NorFlash有三种方式,1中读硬件引脚,另外两种读地址线,主要用读地址线的两种方式。
       1、Toggle
             连续读两次相同地址的数据,看DQ6是否相等,相等则擦除或写完成
       2、polling
             读数据,看DQ7是否正确,正确则擦除完成。如果擦除的话DQ7应该等于1,写操作的话,对比数据的第7位。

还有,很重要的一点:

经过我的测试,sdram的单字节读取没有问题,但是Nor单字节读取的时候,读出的数据并不正确。比如我在0x00地址处写入了0xff11,单字节读取0x0理论上应该得到0x11,而我在实际实验的时候得到的却是0xff。也就是说nor在存储半字数据的时候高8位于低8位互换了

 

 

posted on 2020-02-04 21:59  Red_Point  阅读(1579)  评论(0)    收藏  举报