S29GL128P Norflash驱动读写分析

S29GL128P Norflash驱动读写分析

2014-2-25

         S29GL128P是在嵌入式系统中经常可以见到的一款Norflash芯片,存储结构为128(sectors)X128(Kbytes)=16Mbytes,支持CFI接口,有幸在项目中用到,就简单讨论下其操作原理。

         一、硬件连接

         S29GL128P与STM32F407之间采用FSMC总线连接,具有独立的16M寻址空间,0x64000000-0x64FFFFFF,16bit访问。由于FSMC总线采用的是AHB3通过SYSCLK 1分频得到的,高达168MHz,做硬件的时候还担心数据总线和地址总线布线等长的问题,现在看来完全不用,时序可以通过调整地址建立时间、保持时间等参数进行调节,但出于调试方便,数据线和时钟线要尽量分别做等长处理。另外,STM32F407FSMC总线可以挂载4bank的norflash,本设计中将NorFlash挂载到Bank2上,将网卡芯片挂载到Bank3上,4个Bank具有独立的控制以及时间设置寄存器,不用担心总线冲突。

         二、初始化

         首先要把FSMC总线初始化到复用状态,设置该Bank在总线上的建立保持以及数据访问模式等参数,这些时间参数可以参考S29GL128P手册中相应参数进行设置。

         三、NorFlash 芯片ID读取,其实芯片手册是最好的参考,只是通过简单的解锁进入ID读取模式、读取ID、退出寄存器读取模式就可以了,为了方便用户开发,手册中甚至直接给出了程序。

S29GL128P Norflash驱动读写分析_第1张图片

         如果你成功的把Flash ID读出来,那么就说明Norflash已经调通了。

         四、NorFlash状态检测

         S29GL128P在编程过程中,不仅可以输出Read信号,还可以使DQ某些信号线状态输出变化,例如DQ6在编程时翻转,DQ2在擦除状态一直翻转,DQ5和DQ1可以输出编程时是否发生错误和超时等。

         五、块擦除、片擦除

         NorFlash的机制是经过解锁可以进入寄存器区,由其命令集可以看出,对于片擦除,需要的操作如下,解锁写入0x80,然后解锁写入0x10,就开始执行片擦除算法,块擦除也是类似的,就是在写0x30命令的同时要写入要擦除的地址。

NOR_WRITE(ADDR_SHIFT(0x0555),0x00AA);

NOR_WRITE(ADDR_SHIFT(0x02AA),0x0055);

NOR_WRITE(ADDR_SHIFT(0x0555),0x0080);

NOR_WRITE(ADDR_SHIFT(0x0555),0x00AA);

NOR_WRITE(ADDR_SHIFT(0x02AA),0x0055);

NOR_WRITE(ADDR_SHIFT(0x0555),0x0010);

         这里注意到在读写数据时候都对地址进行了处理:

         #define ADDR_SHIFT(A)          (NOR_FLASH_ADDR + (2 * (A)))

看到写入的地址乘以一个2,是什么原因呢?以0x0555地址为例,其实指向的是一个字节数据,而不是一个半字的数据,而该flash是按16bit读写的,本意是想把0x0555这个半字的地址写入到正确的位置上,就必须对地址移位,分别写入高位和低位。而在写数据时,如果定义的就是一个uint16_t *型的地址指针,那么就可以直接对Flash进行读写了。(具体可参考http://blog.csdn.net/daniellee_ustb/article/details/7453273)

         六、Flash读写

         NorFlash是随机读命令写的器件,但必须每次读写都是两个字节,方法也很简单,这里测试了连续读写,没有测试页内编程方式。

         附访问命令表

S29GL128P Norflash驱动读写分析_第2张图片

你可能感兴趣的:(STM32)