打印

sst29sf040当作数据存储器,数据会丢失吗?

[复制链接]
3906|17
手机看帖
扫描二维码
随时随地手机跟帖
沙发
aibxyz| | 2007-9-27 09:34 | 只看该作者

估计你根本就没写进去

这个我用过,还不错的

使用特权

评论回复
板凳
john_light| | 2007-9-27 09:50 | 只看该作者

写后读回验证

使用特权

评论回复
地板
ccjchen|  楼主 | 2007-9-27 14:20 | 只看该作者

楼上两位大哥怎么用的,能否把代码贴出来让我看看阿?

那我读了以后怎么能把读到的数据显示出来呢?

使用特权

评论回复
5
john_light| | 2007-9-27 14:57 | 只看该作者

可以在程序中校验

比如要写入的数据保存在数组DataToWrite[]中,写入后将数据读回数组DataReadBack[]中,然后比较这两个数组。相同的话就点灯或什么……

使用特权

评论回复
6
ccjchen|  楼主 | 2007-9-28 13:43 | 只看该作者

我按你说的这样做了

我声明了两个数组,要写入的数据保存在数组DataToWrite[]中,写入后将数据读回数组DataReadBack[]中,在软件中发现XDATA数据一样,但是我用示波器却在sst29sf040的RD端一直看到高电平,而没有波形,而在WR端却能看到波形,这是为什么?难道硬件根本没通,上面那些只是软件仿真吗?

使用特权

评论回复
7
john_light| | 2007-9-28 14:25 | 只看该作者

为了确定你已经对该芯片正确编址

你最好先实现Product Identification过程,看能否读回正确的芯片ID:0xBF13。

具体实现仔细阅读datasheet。

使用特权

评论回复
8
ccjchen|  楼主 | 2007-9-29 14:11 | 只看该作者

谢谢john_light大哥的指点阿,我现在能正确读回ID

这说明编址应该正确吧,读写也应该正确吧,但是为什么断电后数据恢复为初始化时的数值呢?我是将uchar idata syn[8]={"24.5 6 0"}调在LCD中显示出来,然后通过增减按键改变syn[8]={"24.5 6 0"}的数值,保存在sst29sf040中,但是为什么一断电后从新接好电源或单片机复位后,在LCD中显示的值又恢复为syn[8]={"24.5 6 0"},这是怎么回事呢?

使用特权

评论回复
9
john_light| | 2007-9-29 14:46 | 只看该作者

有点象挤牙膏,但愿ccjchen用得上

能正确读回ID表示硬件连接大概没问题了(至少低十二条地址线,八条数据线还有读、写、片选等正常)。

The first step is the three-byte load sequence for Software Data Protection. The second step is to load byte address and byte data.

你在进行字节写的时候先按顺序写那三个字节了吗?
写后进行Data# Polling了吗?

使用特权

评论回复
10
ccjchen|  楼主 | 2007-9-29 21:22 | 只看该作者

确实是挤牙膏阿,你说的我都写了

能否把你的程序发上来我看一下阿?唉,搞了好长时间了,都没进展!

使用特权

评论回复
11
john_light| | 2007-9-30 08:17 | 只看该作者

回去翻看了我的程序

2004年写的,针对AT29C040A,简直惨不忍睹,不敢拿出来丢丑。

把你的贴上来吧,我看看。

使用特权

评论回复
12
john_light| | 2007-9-30 08:56 | 只看该作者

另外,你可以选择阅读别人的源码

如U-boot就有一些flash.c可供参考。

使用特权

评论回复
13
john_light| | 2007-9-30 09:52 | 只看该作者

SST29SF040共19根地址线

你的CPU是89C52?
A16~A18你怎么连接的?

使用特权

评论回复
14
john_light| | 2007-9-30 10:13 | 只看该作者

看了一下,风格不太好

#define _SST_C_
#include "reg51.h"
#include "sst.h"
#include <intrins.h>
#include <absacc.h>

#define SECTOR_SIZE          128       /*Must be 128 bytes for 29EE020*/

#define SST_ID            0xBF
#define SST_29SF040       0X13
#define uchar             unsigned char
#define uint              unsigned int
uchar idata syn[8]={"24.5 6 0"};        //这个字符串8个字节装不完

void  wait(uchar p,uchar q);
int   Check_SST_29SF040();
void  Check_Toggle_Ready(uint Dst);
void  ByteProgram(uchar SrcByte,uint Dst);
int   Erase_One_Sector(uint Dst);
uchar ByteRead(uint addr);


void main(void){
    initlcm();//初始化lcd
    initmcu();//初始化89C52
    for(;;)
    {
        if(ByteRead(0x0080+7)==3)//这里用来证明数据是否写进
      //检查最后一个数据是否是3,如果是从Flash中读取数据更新syn
        {
            sst_read();
        }else{
            sst_write();
        }
    }

    //死循环后面还有东西?
    syn_add();//syn增
    syn_dec();//syn减这两个
    sst_write();//改变syn后写进sst29sf040内
}


void  ByteProgram(uchar data SrcByte,uint Dst){
    XBYTE[0x0555] = 0xAA;
    XBYTE[0x02AA] = 0x55;
    XBYTE[0x0555] = 0xA0;
    XBYTE[Dst]   = SrcByte;
    //Check_Toggle_Ready(Dst);
    //wait(1,9);//等待25us
    while(XBYTE[Dst] != SrcByte){//Data# Polling的变通实现/不建议采用固定的延时(不同的芯片不同的速度可能会有不同结果)
        ;//考虑超时处理
    }
}

int Check_SST_29SF040(){
    uchar  SST_id1;
    uchar  SST_id2;
    int    ReturnStatus;
    /* Issue the Software ID code to 29sf040*/
    XBYTE[0x0555]= 0xAA;/* set up address to be 555h    */
    /* write data 0xAA to the address    */
    XBYTE[0x02AA]= 0x55;/* set up address to be 2AAh    */
    /* write data 0x55 to the address    */
    XBYTE[0x0555]= 0x90;
    wait(61,74);           /*delay 10ms*/
    /*read the product ID from29sf040*/
    /* set up address to be 0000h    */
    SST_id1  = XBYTE[0x0000] ;        /* get first ID byte???????????????*/
    SST_id2  = XBYTE[0x0001];/* set up address to be 0001h    */
    if ((SST_id1 ==SST_ID)&&(SST_id2 == SST_29SF040)){
        ReturnStatus = 1;
    }else{
        ReturnStatus = 0;
    }

    /* Issue the Soffware Product ID Exit code thus returning the 29EE020    */
    /* to the read operating mode   */
    /* set up address to be 555h    */
    XBYTE[0x0555] = 0xAA;                    /* write data 0xAA to the address    */
    /* set up address to be 2AAh    */
    XBYTE[0x02AA] = 0x55;                    /* write data 0x55 to the address    */
    /* set up address to be 555h    */
    XBYTE[0x0555] =0xF0;                    /* write data 0xF0 to the address    */
    wait(61,74);                /*delay 10ms*/
    return(ReturnStatus);

}

int Erase_One_Sector(uint Dst){

    /*  Issue the Sector Erase command to 39SF040   */

    XBYTE[0x0555] = 0xAA; /* set up address to be 555h    */
    /* write data 0xAA to the address     */
    XBYTE[0x02AA] = 0x55; /* set up address to be 2AAh    */
    /* write data 0x55 to the address     */
    XBYTE[0x0555] = 0x80; /* set up address to be 555h    */
    /* write data 0x80 to the address     */
    XBYTE[0x0555] = 0xAA; /* set up address to be 555h    */
    /* write data 0xAA to the address     */
    XBYTE[0x02AA] = 0x55; /* set up address to be 2AAh    */
    /* write data 0x55 to the address     */
    XBYTE[Dst]   = 0x20; /* set up starting address to be erased */
    /* write data 0x30 to the address     */
    wait(85,134);        /* check DATABOOK for the most  */
    /* accurate value -- Tse        */
    //不建议采用固定的延时(参考字节编程部分)
}


uchar ByteRead(uint addr){
    uchar GetData;
    GetData = XBYTE[addr];
    return(GetData);
}

void  wait(uchar p,uchar q){
    uchar  i,j;                //(2*j+3)*i+4
    for (i=p;i>0;i--){
        for (j=q;j>0;j--){
            ;
        }
    }
}

void sst_read(){
    uchar i;
    for(i=0;i<4;i++)
    {
        syn[2*i+1]=ByteRead(0x0080+i);

    }
    for(i=4;i<8;i++)
    {
        ByteRead(0x0080+i);
    }
}

void sst_write()//用于保存易丢失数据
{
    uchar i;
    Erase_One_Sector(128);
    for(i=0;i<4;i++)
    {

        ByteProgram(syn[2*i+1],0x0080+i);

    }
    for(i=4;i<8;i++)
    {
        ByteProgram(3,0x0080+i);
    }
}

使用特权

评论回复
15
john_light| | 2007-9-30 10:28 | 只看该作者

多灌两瓢水吧

我觉得你的问题不是数据丢失,而是数据根本没存进去

2004年,我初次使用ATMEL的AT29C040A,由于是DIP封装,非常方便调试。

我先确定硬件的正确连接:
1、读FlashID;
2、用通用编程器往芯片不同特定地址写入特定数据,然后在程序中读回验证。

然后尝试片擦除:
  用通用编程器读回验证。

再然后字节编程:
  (AT29C040A要求一次要写入256字节的一个扇区)。
  用通用编程器读回验证。

得益于DIP封装和通用编程器,我很快就掌握了这种Flash的编程方法。

使用特权

评论回复
16
ccjchen|  楼主 | 2007-9-30 13:15 | 只看该作者

通用编程器没用过,我这里只有仿真器

使用特权

评论回复
17
wangkj| | 2007-9-30 21:33 | 只看该作者

sst flash网站有例子代码,你可以参考一下.

使用特权

评论回复
18
a305566| | 2011-3-24 15:38 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

446

帖子

1

粉丝