#define _SST_C_<br />#include "reg51.h"<br />#include "sst.h"<br />#include <intrins.h><br />#include <absacc.h><br /><br />#define SECTOR_SIZE 128 /*Must be 128 bytes for 29EE020*/<br /><br />#define SST_ID 0xBF<br />#define SST_29SF040 0X13<br />#define uchar unsigned char<br />#define uint unsigned int<br />uchar idata syn[8]={"24.5 6 0"}; //这个字符串8个字节装不完<br /><br />void wait(uchar p,uchar q);<br />int Check_SST_29SF040();<br />void Check_Toggle_Ready(uint Dst);<br />void ByteProgram(uchar SrcByte,uint Dst);<br />int Erase_One_Sector(uint Dst);<br />uchar ByteRead(uint addr);<br /><br /><br />void main(void){<br /> initlcm();//初始化lcd<br /> initmcu();//初始化89C52<br /> for(;;)<br /> {<br /> if(ByteRead(0x0080+7)==3)//这里用来证明数据是否写进<br /> //检查最后一个数据是否是3,如果是从Flash中读取数据更新syn<br /> {<br /> sst_read();<br /> }else{<br /> sst_write();<br /> }<br /> }<br /><br /> //死循环后面还有东西?<br /> syn_add();//syn增<br /> syn_dec();//syn减这两个<br /> sst_write();//改变syn后写进sst29sf040内<br />}<br /><br /><br />void ByteProgram(uchar data SrcByte,uint Dst){<br /> XBYTE[0x0555] = 0xAA;<br /> XBYTE[0x02AA] = 0x55;<br /> XBYTE[0x0555] = 0xA0;<br /> XBYTE[Dst] = SrcByte;<br /> //Check_Toggle_Ready(Dst);<br /> //wait(1,9);//等待25us<br /> while(XBYTE[Dst] != SrcByte){//Data# Polling的变通实现/不建议采用固定的延时(不同的芯片不同的速度可能会有不同结果)<br /> ;//考虑超时处理<br /> }<br />}<br /><br />int Check_SST_29SF040(){<br /> uchar SST_id1;<br /> uchar SST_id2;<br /> int ReturnStatus;<br /> /* Issue the Software ID code to 29sf040*/<br /> XBYTE[0x0555]= 0xAA;/* set up address to be 555h */<br /> /* write data 0xAA to the address */<br /> XBYTE[0x02AA]= 0x55;/* set up address to be 2AAh */<br /> /* write data 0x55 to the address */<br /> XBYTE[0x0555]= 0x90;<br /> wait(61,74); /*delay 10ms*/<br /> /*read the product ID from29sf040*/<br /> /* set up address to be 0000h */<br /> SST_id1 = XBYTE[0x0000] ; /* get first ID byte???????????????*/<br /> SST_id2 = XBYTE[0x0001];/* set up address to be 0001h */<br /> if ((SST_id1 ==SST_ID)&&(SST_id2 == SST_29SF040)){<br /> ReturnStatus = 1;<br /> }else{<br /> ReturnStatus = 0;<br /> }<br /><br /> /* Issue the Soffware Product ID Exit code thus returning the 29EE020 */<br /> /* to the read operating mode */<br /> /* set up address to be 555h */<br /> XBYTE[0x0555] = 0xAA; /* write data 0xAA to the address */<br /> /* set up address to be 2AAh */<br /> XBYTE[0x02AA] = 0x55; /* write data 0x55 to the address */<br /> /* set up address to be 555h */<br /> XBYTE[0x0555] =0xF0; /* write data 0xF0 to the address */<br /> wait(61,74); /*delay 10ms*/<br /> return(ReturnStatus);<br /><br />}<br /><br />int Erase_One_Sector(uint Dst){<br /><br /> /* Issue the Sector Erase command to 39SF040 */<br /><br /> XBYTE[0x0555] = 0xAA; /* set up address to be 555h */<br /> /* write data 0xAA to the address */<br /> XBYTE[0x02AA] = 0x55; /* set up address to be 2AAh */<br /> /* write data 0x55 to the address */<br /> XBYTE[0x0555] = 0x80; /* set up address to be 555h */<br /> /* write data 0x80 to the address */<br /> XBYTE[0x0555] = 0xAA; /* set up address to be 555h */<br /> /* write data 0xAA to the address */<br /> XBYTE[0x02AA] = 0x55; /* set up address to be 2AAh */<br /> /* write data 0x55 to the address */<br /> XBYTE[Dst] = 0x20; /* set up starting address to be erased */<br /> /* write data 0x30 to the address */<br /> wait(85,134); /* check DATABOOK for the most */<br /> /* accurate value -- Tse */<br /> //不建议采用固定的延时(参考字节编程部分)<br />}<br /><br /><br />uchar ByteRead(uint addr){<br /> uchar GetData;<br /> GetData = XBYTE[addr];<br /> return(GetData);<br />}<br /><br />void wait(uchar p,uchar q){<br /> uchar i,j; //(2*j+3)*i+4<br /> for (i=p;i>0;i--){<br /> for (j=q;j>0;j--){<br /> ;<br /> }<br /> }<br />}<br /><br />void sst_read(){<br /> uchar i;<br /> for(i=0;i<4;i++)<br /> {<br /> syn[2*i+1]=ByteRead(0x0080+i);<br /><br /> }<br /> for(i=4;i<8;i++)<br /> {<br /> ByteRead(0x0080+i);<br /> }<br />}<br /><br />void sst_write()//用于保存易丢失数据<br />{<br /> uchar i;<br /> Erase_One_Sector(128);<br /> for(i=0;i<4;i++)<br /> {<br /><br /> ByteProgram(syn[2*i+1],0x0080+i);<br /><br /> }<br /> for(i=4;i<8;i++)<br /> {<br /> ByteProgram(3,0x0080+i);<br /> }<br />}
|