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、退出寄存器读取模式就可以了,为了方便用户开发,手册中甚至直接给出了程序。

如果你成功的把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驱动读写分析相关推荐

  1. S29GL128P norflash 读写擦除问题

    最近用stm32调试S29GL128P norflash,遇到一些细节问题,和大家分享一下,希望大家能少走弯路. 因为这个项目是半路接手,已经有产品了,我的任务就是在此基础上升级改bug.之前的程序写 ...

  2. 驱动专题:第五章MTD及Flash驱动 4.Norflash驱动

    嵌入式Linux--nor flash (1):硬件介绍 声明:本文章是学完韦东山老师的教学视频后看过一些文章后所写,在看文章时我会将一些可能重要的知识点复制下来,所以可能会抄到您文章中的一些内容,如 ...

  3. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析

    PowerPC + Linux2.6.25平台下的I2C驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

  4. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的SPI驱动架构分析

    PowerPC + Linux2.6.25平台下的SPI驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

  5. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

  6. linux i2c adapter 增加设备_LINUX设备驱动模型分析之四 设备模块相关(DEVICE)接口分析...

    本系列前几篇文章链接如下: <LINUX设备驱动模型分析之一 总体概念说明> <LINUX设备驱动模型分析之二 总线(BUS)接口分析> <LINUX设备驱动模型分析之三 ...

  7. Linux PCI驱动框架分析:(Peripheral Component Interconnect,外部设备互联)

    <DPDK 20.05 | rte_pci_bus思维导图 | 第一版> <linux系统下:IO端口,内存,PCI总线 的 读写(I/O)操作> <Linux指令:ls ...

  8. linux下IIC驱动开发分析

    1.  IIC规范 IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.IIC总线产生于在80年代,最初为音频和 ...

  9. 通过虚拟驱动vivi分析摄像头驱动

    Linux摄像头驱动学习之:(二)通过虚拟驱动vivi分析摄像头驱动 一.通过指令 "strace -o xawtv.log xawtv" 得到以下调用信息: // 1~7都是在v ...

最新文章

  1. 点云格式解读 PCD
  2. (*长期更新)软考网络工程师学习笔记——Section 4 物理层的其它知识
  3. [NOI2009] 变换序列 (匈牙利最大匹配)
  4. Spark 基础——RDD 算子
  5. Camera HW组成(二十六)
  6. 往事如烟,残阳如血......——逝去的背影(五)
  7. 控制台打印vue实例
  8. centos 5.6 x86 安装 文泉驿字体
  9. 小议ARM Cortex-m0/m4系列的总线差异
  10. java中wgs84转高德_2020-06-11关于WGS84 高德坐标 百度坐标的相互转换
  11. 图灵热点之阅读篇——七月图书推荐
  12. 解决Mac电脑连不上wifi的问题
  13. python 学籍管理系统的简单实现
  14. 腾讯云游戏云服务器具有哪些优点
  15. Quectel移远展锐平台5G模组RX500U/RG200U使用指南(四)-工作模式】
  16. 直播写代码,今晚8点见!
  17. 两种常见电商sku的设计
  18. word只粘贴为文本快捷键设置
  19. 数据库事务隔离级别及脏读、不可重复读、幻读的理解
  20. 计算机无法识别读卡器怎么办,usb读卡器读不出来怎么办,详细教您解决的办法...

热门文章

  1. U盘启动盘制作工具哪个好用?你怕是没用过Rufus
  2. 读书笔记(四)--PBFT
  3. LeetCode 912. 排序数组【模板题】
  4. ICMP详解和实例分析
  5. 微信群转播机器人python练习制作
  6. matlab实现TE/TM偏振布拉格反射镜
  7. 每日英语:Report: Chinese Consumers Increasingly Divided
  8. 2018年7月27日每日安全快讯
  9. 模型训练之决策树、随机森林、提升树
  10. 人生的31个忠告(图解)