NOR Flash擦写和原理分析 (二)
Nor Flash上电后处于数据读取状态(Reading Array Data)。此状态可以进行正常的读。这和读取SDRAM/SRAM/ROM一样。(要是不一样的话,芯片上电后如何从NorFlash中读取启动代码。~)
一般再对Flash进行操作前都要读取芯片信息比如设备ID号。这样做的主要目的是为了判断自己写的程序是否支持该设备。 Nor Flash支持2种方式获取ID号。一种是编程器所用的方法需要高电压(11.5V-12.5V)。另一种方法就是所谓的in-system方法,就是在系统中通过NorFlash的命令寄存器来完成。本文中只对in-system方法进行说明。此时需要切换到自动选择(Autoselect Command),这要通过发送命令来完成。命令类型见下图。注意:
进入自动选择(Autoselect Command)模式后需要发送复位命令才能回到数据读取状态(Reading Array Data)。
在完成信息获取后一般就要擦除数据。 NorFlash支持扇区擦(Sector Erase)除和整片擦除(Chip Erase)。这2种模式都有对应的命令序列。在完成擦除命令后会自动返回到数据读取(Reading Array Data)状态。在返回前可查询编程的状态。
完成擦除后就需要对芯片进行写入操作也就是编程。这就需要进入编程(Program)状态。在完成编程命令后会自动返回到数据读取(Reading Array Data)状态。在返回前可查询编程的状态。注意:编程前一定要先擦除。因为编程只能将’1’改写为’0’,通过擦写可以将数据全部擦写为‘1’。
以上是主要的操作其他操作还有写保护等,请参考芯片数据手册。
图1-1 命令与模式
(2) Nor Flash 硬件连接
图2-1 Nor Flash 引脚
图2-2 TQ2440中实际连接
上图中要注意的几个地方:
1. 引脚47 为BYTE# :当其为高电平时数据输出为16bit模式(此时地址线为A19:A0).低电平为8bit模式. (此时地址线为A19:A1)上图中Pin47加VCC选用的是16bit模式有效地址线为A19:A0.
2. 对于16bit模式要16bit对齐因此S3C2440A的LADDR1要与A0连接.此时要注意的是NorFlash片内地址0x555对应S3C2440A的地址为baseaddr+0x555*2;其中baseaddr与NorFlash映射的地址有关。一般NorFlash放在Bank0.所以baseaddr=0,但是开启mmu后baseaddr=地址0映射到的新地址。0x555*2的原因是LADDR1与A0连接。也就是0x555表示片内第0x555个word(16bit).
3. 引脚15为RYBY#输出引脚。用于输出Ready与Busy信号。实际用时可以不接。可用命令查询NorFlash状态代替.
(3) Nor Flash 模式编程
1. 读ID
上图中表明 读id共有4个指令周期,钱3个为写周期,最后一个为读周期;
#define flash_base 0x00000000 //flash接到bank0上
#define CMD_ADDR0 *((volatile U16 *)(0x555*2+flash_base))
#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. 扇区擦除(Sector Erase)
扇区擦除命令序列的每个周期均为写周期。
void Am29LV800D_SectorErase(U32 SA)
{
CMD_ADDR0 = 0xAA; CMD_ADDR1 = 0x55; CMD_ADDR0 = 0x80;
CMD_ADDR0 = 0xAA; CMD_ADDR1 = 0x55;//Word 模式命令序列
*((volatile U16 *)(SA)) = 0x30;
Waitfor_endofprg();//状态查询
}
3. 编程(Program)
编程 命令序列的每个周期均为写周期。
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 中的每一个都提供了一种方法来判断一个编程或者擦除操作是否已经完成或正在进行中。实际编程中只需要使用其中的一种。
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,是可以添加附加的扇区用于多扇区擦除。
以上讲了这些状态为,实际只需要使用几个就行,比较简单的就是选择DQ5,DQ6/DQ2.如下例。
/****** Am29LV800D 的检测 ******/
int Waitfor_endofprg(void)
{
volatile U16 flashStatus,old;
old=*((volatile U16 *)0x0);//先读一次状态
while(1)
{
flashStatus=*((volatile U16 *)0x0);//再读一次状态
if( (old&0x40) == (flashStatus&0x40) ) break;//比较DQ6.相同说明设备已经就绪
if( flashStatus&0x20 ) //判断DQ5,为‘1’则超时
{
old=*((volatile U16 *)0x0);
flashStatus=*((volatile U16 *)0x0);//在读取比较一次。因为可能在超时前刚好玩
//成操作。
if( (old&0x40) == (flashStatus&0x40) )
return 1;
else return 0;
}
old=flashStatus;
}
return 1;
}
NorFlash的擦除&编程问题
最近在试验norFlash的编程:
每次在擦除sector时,若采用延时的方法,操作都可以成功.但用toggle位检测的方法每次都失败.百思不得其解,其间我还参考了《32位嵌入式系统硬件设计与调试》(张仑著)一书,在网上也搜索了不少参考代码,却总是不行。。。 ^_^
在此方面有经验的朋友,请给点意见,若能提供经过实战检验的toggle或polling检测程序,将不甚感激!!!
NOR Flash擦写和原理分析 (二)相关推荐
- NOR Flash擦写和原理分析
http://www.cnblogs.com/jason-lu/archive/2013/03/13/2957399.html NOR Flash擦写和原理分析 NOR Flash擦写和原理分析 一. ...
- flash写保护原理_NOR Flash擦写和原理分析 (二)
Nor Flash上电后处于数据读取状态(Reading Array Data).此状态可以进行正常的读.这和读取SDRAM/SRAM/ROM一样.(要是不一样的话,芯片上电后如何从NorFlash中 ...
- flash写保护原理_【转】NOR Flash擦写和原理分析
概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...
- STM32G0系列将内部FLASH作为EEPROM使用,巧妙编程,可延长Flash擦写寿命上百倍,已用于量产产品。
STM32内部flash可以用作EEPROM,用于保存用户数据. 1.一般来说,stm32的flash擦写寿命只有10万次,如果在同一位置擦写过于频繁,在产品质保期内FLASH就会达到寿命极限,保存数 ...
- freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解(一)之时钟设置
Flash擦写的内容,个人做HC9S12系列单片机时觉得应该是各模块内容中最难而且是最麻烦的一步了.只有能够对Flash进行擦写以后,所做的Bootloader才有真正手段将串口或者其他通讯手段接收到 ...
- spi flash擦写调试记录
最近在调试spi flash的擦写,问题是flash擦写uboot时,不成功.原来的uboot丢失. 测试发现是因为擦能成功,但是写时的地址不是secent大小,一个secent大小为64K. 看da ...
- STM32系列内部Flash擦写程序
stm32内部Flash擦写流程,对于FLash必须按页擦写,不同型号的flash页大小不同,需要根据实际修改 #define FLASH_PAGE_SIZE 2048 //定义Flash页大小,RC ...
- freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解(三)之Flash控制器指令执行
前面我们介绍了Flash主要的几个寄存器,如果还有其他的疑问可以再返回去看看或者直接查阅S12系列单片机的手册中相关的内容.这一节我将介绍Flash控制器指令执行的过程,并举出相关的例子,希望能够起到 ...
- STM32 flash擦写死机
1.在调试BootLoader的时候发现,APP中在擦写flash的时候造成了设备死机,后来发现在startup_stm32f103xb.s文件中设置的Stack_Size不一致造成的.将BootLo ...
最新文章
- activity 启动模式_Intent#FLAG_ACTIVITY_CLEAR_TOP 真的会 clear top 吗
- 取消挂载点可以节省磁盘么_Linux下NTFS格式外接硬盘的挂载,取消挂载和开机自动挂载...
- Robot Framework 使用1-环境配置及简单网站兼容性测试(转)
- SpringBoot测试失败并报错: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration
- 大数据_Hbase-API访问_Java操作Hbase_封装操作数据的工具类---Hbase工作笔记0015
- JQuery和JavaScript常用方法的一些区别
- L1-044 稳赢 (15 分)—团体程序设计天梯赛
- NumPy学习笔记之random.randn()函数
- python判断手机号码是否正确_python检测手机号码是否合法
- iPhone应用炫酷的下拉更新效果
- 灵格斯Lingoes词典及浏览器插件实现屏幕取词等功能的配置使用方法
- 如何让一个未知宽高的div垂直居中
- 文本分类(2)-基于传统机器学习方法进行文本分类
- 【苹果鼠标滑轮失灵】解决办法
- iTest使用说明_V4.5.1
- [移动端开发]到底什么是WebView?
- 【论文解读】文本分类上分利器:Bert微调trick大全
- GPS坐标间距离计算
- 后台多条sql查询,json传前台,前台处理多条sql数据实例
- 千里之行始于足下,Python编写进度条
热门文章
- 电子元器件从入门到精通pdf_电子元件入门基础,常用电子元器件详解大全作用-涨知识必读...
- 区块链研究生专业_滁州区块链平台技术开发专业软件公司
- python两组数的差异_Python中两个日期之间的差异
- indexOf与includes的区别
- 基于c语言客户端的步骤,基于c语言tftp服务器与客户端实现
- 解决Vue-Router报错:vue-router.esm.js:17 [vue-router] <router-link>‘s tag prop is deprecated and has been
- mysql的槽_Mysql槽点 - MySQL及其它开源数据库 - ITPUB论坛-中国专业的IT技术社区...
- 阿里云rds mysql 并发_干货 | 浅析RDS MySQL 8.0语句级并发控制-阿里云开发者社区
- mysql判断不为null
- 公众号回复单个图文消息