用单片机实现对SST39VF040的操作
更新时间:2024-04-25 03:38:01 阅读量: 综合文库 文档下载
AT89C51对SST 之FLASH的编程操作详述
Flash又名闪存,属于EEPROM,即电可擦除可编程的存储器。由于具有电可擦除的特性,并且其数据可保留上百年,所以它的应用范围非常广泛。非常适用于作为MicroChip以及DSP的外部程序存储器,或者作为需要存储大量数据的外部EEPROM。
SST公司设计之39系列Multi-Purpose Flash,按照其存储的空间主要分以下
几种:64K x8/128K x8/256K x8/512K x8 Byte,各自代表的芯片型号有:
39系列Flash之特性: SST39LF512/010/020/040工作电压为3.0-3.6V; SST39VF512/010/020/040工作电压为2.7V~3.6V;数据保留时间>100年;工作电流典型值为10mA,待机电流为1uA;快速擦除芯片时间为70ms,字节编程时间为14us。对芯片有如下操作:chip Erase operation ;sector Erase operation ;byte program operation ;byte read operation ;write operation status detection 。通过软件对芯片的操作可以访问到SST 制造商的ID;以及芯片的ID,各芯片ID如下表:
TABLE 1: PRODUCT IDENTIFICATION
Manufacturer’s ID Device ID SST39LF/VF512 SST39LF/VF010 SST39LF/VF020 SST39LF/VF040 Address 0000H 0001H 0001H 0001H 0001H Data BFH D4H D5H D6H D7H 注意:当通过软件访问了Product Identification后,必须采用软件命令退出该模式才能对芯片进行擦除、读写的操作.
下面给出各软件操作指令的时序图:
1. WE控制的字节编程时序:
2.CE控制的字节编程时序图:
3. 编程操作的状态检测时序图:
4.WE控制的扇区擦除时序图:
5. WE控制的芯片擦除时序图:
6. 软件访问ID的时序图:
7. 退出软件访问ID&复位命令的时序图:
根据上面的时序图,下面给出各种软件指令操作的流程图:
1.字节编程流程图:
2.读取ID流程图:
3.复位命令流程图:
4.芯片擦除命令流程图:
5.扇区擦除命令流程图:
下面以SST39VF040为列,给出AT89C51对其做编程动作的source code:
SST39VF040地址线为A0…A18,数据线为DQ0…DQ7,片选线CE,数据写使能线WE,数据读使能线OE。
#define uchar unsigned char #define uint unsigned int #define ulong unsigned long
sfr DataOut=0x80; //定义P0口接SST39VF040的数据线 sfr Address7_0=0x90; //定义P1口接SST39VF040的地址线 A0…A7 sfr Address15_8=0xa0; //定义P2口接SST39VF040的地址线A8…A15 sbit Address16=P3^2; //定义P3.2接SST39VF040的地址线A16 sbit Address17=P3^3; //定义P3.3接SST39VF040的地址线A17 sbit Address18=P3^4; //定义P3.4接SST39VF040的地址线A18
sbit Sst39vf040_Ce=P3^5; //定义P3.5接SST39VF040的片选线线CE sbit Sst39vf040_We=P3^6; //定义P3.6接SST39VF040的写使能线WE sbit Sst39vf040_Oe=P3^7; //定义P3.7接SST39VF040的读使能线OE struct Flash {
uchar manufacturer_id; uchar device_id; ulong address; } Sst39vf040;
//读FLASH ID的函数,入口参数:FLASH的manfacturer_ID,device_ID,出口参数返回1,0 uchar Read_Id(uchar manfa_id,uchar devi_id) {
Sst39vf040_Ce=1; Sst39vf040_We=1; Address7_0=0x55;
Address15_8=0x55; Sst39vf040_Oe=1; Sst39vf040_Ce=0; Sst39vf040_We=0; DataOut=0xaa; Sst39vf040_We=1; Address7_0=0xaa; Address15_8=0x2a;
Delay10us();
Sst39vf040_We=0; DataOut=0x55;
Delay10us(); Sst39vf040_We=1; Address7_0=0x55; Address15_8=0x55; Delay10us(); Sst39vf040_We=0; DataOut=0x90; Sst39vf040_We=1; Sst39vf040_Ce=1; Delay10us(); Address7_0=0x00; Address15_8=0x00; Sst39vf040_Ce=0; Sst39vf040_Oe=0; DataOut=0xff;
Sst39vf040.manufacturer_id=DataOut; Address7_0=0x01; Delay10us();
Sst39vf040.device_id=DataOut; Sst39vf040_Ce=1;
if((Sst39vf040.manufacturer_id==manuf_ID)&&(Sst39vf040.device_id==devi_ID)) }
//退出读ID的状态以及命令FLASH复位的函数 void Read_Id_Exit(void) {
Sst39vf040_Ce=1; Sst39vf040_Oe=0; Sst39vf040_We=1; Address7_0=0x55; Address15_8=0x55; Sst39vf040_Ce=0; Sst39vf040_Oe=1; Sst39vf040_We=0; Delay10us(); DataOut=0xaa;
else
return 0; return 1;
Sst39vf040_We=1; Delay10us(); Address7_0=0xaa; Address15_8=0x2a; Delay10us(); Sst39vf040_We=0; Delay10us(); DataOut=0x55; Sst39vf040_We=1; Delay10us(); Address7_0=0x55; Address15_8=0x55; Delay10us(); Sst39vf040_We=0; Delay10us(); DataOut=0xf0; Sst39vf040_We=1; Sst39vf040_Ce=1; Delay10us(); Sst39vf040_Ce=0; }
//芯片擦除函数 void Chip_Erase(void) {
Sst39vf040_Ce=1; Sst39vf040_Oe=0; Sst39vf040_We=1; Address18=0; Address17=0; Address16=0; Address7_0=0x55; Address15_8=0x55; Sst39vf040_Ce=0; Sst39vf040_Oe=1; Sst39vf040_We=0; DataOut=0xaa; Delay10us(); Sst39vf040_We=1;
Address7_0=0xaa; Address15_8=0x2a; Delay10us(); Sst39vf040_We=0; DataOut=0x55; Delay10us(); Sst39vf040_We=1; Address7_0=0x55; Address15_8=0x55; Delay10us(); Sst39vf040_We=0; DataOut=0x80; Delay10us(); Sst39vf040_We=1; Delay10us(); Sst39vf040_We=0; DataOut=0xaa; Delay10us(); Sst39vf040_We=1; Address7_0=0xaa; Address15_8=0x2a; Delay10us(); Sst39vf040_We=0; DataOut=0x55; Delay10us(); Sst39vf040_We=1; Address7_0=0x55; Address15_8=0x55; Delay10us(); Sst39vf040_We=0; DataOut=0x10; Delay10us(); Sst39vf040_We=1;
while(!Wait_Data_Pulling()); }
//检测FLASH编程,擦除操作过程中是否完成的函数,完成后返回值1 uchar Wait_Data_Pulling(void) {
uchar outdata; Sst39vf040_Ce=1; Sst39vf040_We=1; Sst39vf040_Oe=1; Delay10us(); Sst39vf040_Ce=0; Sst39vf040_Oe=0; Delay10us(); DataOut=0xff; outdata=DataOut; Sst39vf040_Ce=1; Sst39vf040_Oe=1; if((outdata&0x80)==0x80) else }
//字节编程函数,入口参数:( byte_address:Ams~A0 = A18~A0 ,待写的数据:byte_data ), void We_Byte_Program(ulong byte_address,uchar byte_data) {
ulong temp_address; Sst39vf040_Ce=1; Sst39vf040_Oe=0; Sst39vf040_We=1; Address7_0=0x55; Address15_8=0x55; Address16=0; Address17=0; Address18=0; Sst39vf040_Ce=0; Sst39vf040_Oe=1; Sst39vf040_We=0; DataOut=0xaa; Delay10us(); Sst39vf040_We=1; Address7_0=0xaa; Address15_8=0x2a; Delay10us();
return 0; return 1;
Sst39vf040_We=0; DataOut=0x55; Delay10us(); Sst39vf040_We=1; Address7_0=0x55; Address15_8=0x55; Delay10us(); Sst39vf040_We=0; DataOut=0xa0; Delay10us(); Sst39vf040_We=1; temp_address=byte_address;
Address7_0=temp_address&0x0000ff; temp_address=byte_address;
Address15_8=(temp_address&0x00ff00)>>8; temp_address=byte_address; if((temp_address&0x010000)!=0)
else
Address16=0; Address16=1;
temp_address=byte_address; if((temp_address&0x020000)!=0)
else
Address17=0; Address17=1;
temp_address=byte_address; if((temp_address&0x040000)!=0)
else
Address18=0; Address18=1;
Delay10us(); Sst39vf040_We=0; DataOut=byte_data; Delay10us(); Sst39vf040_We=1;
while(!Wait_Data_Pulling()); }
//字节读函数 入口参数:待读的字节地址byte_address,返回参数值:读出的数据
uchar Byte_Read(ulong byte_address) {
ulong temp_address; uchar temp_data;
temp_address=byte_address; Sst39vf040_Ce=1; Sst39vf040_Oe=1; Sst39vf040_We=1;
Address7_0=temp_address&0x000000ff; temp_address=byte_address;
Address15_8=(temp_address&0x0000ff00)>>8; temp_address=byte_address;
if((temp_address&0x00010000)!=0)
Address16=1;
else }
以上给出了读写SST39VF040的C51源程式,其他几个型号的FLASH读写都可以调用这些函数,只要改变入口参数即可,读者可以灵活应用。
Address16=0;
temp_address=byte_address; if((temp_address&0x00020000)!=0) else
Address17=0; Address17=1;
temp_address=byte_address; if((temp_address&0x00040000)!=0) else
Address18=0; Address18=1;
Delay10us(); Sst39vf040_Ce=0; Sst39vf040_Oe=0; Delay10us(); DataOut=0xff; temp_data=DataOut; Sst39vf040_Ce=1; Sst39vf040_Oe=1; return temp_data;
正在阅读:
用单片机实现对SST39VF040的操作04-25
卫生事业管理-医院管理试题及答案05-12
2012年上海市虹口区初中英语二模卷试题及参考答案【纯word版,完美打印】08-19
毕淑敏母爱经典散文03-30
2018年母婴商品销售企业公司组织架构图职能部门及工作职责03-07
县人社局年度工作回顾与2022年工作规划06-05
有凸缘筒形件拉深设计说明书04-06
观《走出非洲》有感02-12
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 单片机
- SST39VF040
- 操作
- 实现