| #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 />} |