打印

c8051f020 非易失数据存储器访问

[复制链接]
3558|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
robchjm|  楼主 | 2009-3-10 10:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
lnskngdc| | 2009-3-10 11:15 | 只看该作者

不是定位

当你对那几个寄存器进行操作选择时,就相当于spi通信的性质(打个比方),通过控制几个标志位,就可以往0~127这个空间存放数据了,详情请见020的数据手册,上面有详细步骤

使用特权

评论回复
板凳
robchjm|  楼主 | 2009-3-10 15:07 | 只看该作者

??

我是按照那个步骤做的,可是断电再去读,总是不行,写进去的数据又被恢复为0,我怀疑没写到那个存储区

使用特权

评论回复
地板
robchjm|  楼主 | 2009-3-10 15:13 | 只看该作者

示例代码

能不能提供示例代码啊?

使用特权

评论回复
5
pengliang| | 2009-3-10 20:17 | 只看该作者

试试这个

//函数功能:内部128BFlash读函数
//入参: void
//返回: void
void Flash_Read(void)
{
     char code *address=0x0000;
    unsigned char i;
    EA = 0;    
         PSCTL |= 0x04;
    for(i=0;i<128;i++)
    {
        FlashBuffer = *address  ;
        address++;
    }
    PSCTL &= (~0x04);
    EA = 1;

}
//函数功能:内部128BFlash擦写函数
//入参: void
//返回: void
void Flash_Write(void)
{
     char xdata *address=0x0000;
    unsigned char i;
    EA = 0;
    FLSCL |= 0x01;
         PSCTL = 0x07;
    *address = 0x00;
    PSCTL = 0x05;
    for(i=0;i<128;i++)
    {
        *address =  FlashBuffer;
        address++;
    }
    PSCTL = 0x00;
    FLSCL &=0xfe; 
    EA = 1;

}

使用特权

评论回复
6
ayb_ice| | 2009-3-10 20:39 | 只看该作者

有128字节区和其它FLASH区 区别

不过128区意义也不是很大,020的xram较大,可以利用镜象操作,即开机后将数据复制到xram里,关机时再写回去,这样可以提高速度又增加了FLASH的寿命,至于操作其实很简单,自己仔细去看一下手册.

使用特权

评论回复
7
robchjm|  楼主 | 2009-3-11 10:15 | 只看该作者

还是没成功

试了上面给的示例代码,还是不行。
我需要存储的数据掉电后也不会丢失的,重新启动可以读取

使用特权

评论回复
8
robchjm|  楼主 | 2009-3-11 10:42 | 只看该作者

xdata pdata code

置PSCTL寄存器的SFLE位为1,用户软件访问FLASH时将访问128B的临时存储器扇区。 定义变量时用 char xdata *address=0x0000 能指向这个区域吗?
感觉xdata ,pdata,code等类型没有哪个是指向这个区的,到底怎样才能指向那里啊?

使用特权

评论回复
9
ayb_ice| | 2009-3-11 20:46 | 只看该作者

我给个代码你吧

/*-----------------------------------------------------------------------------------------------
 *-----------------------------------------------------------------------------------------------
 *
 *                                  深圳市普康电子有限公司
 *                                     PROCAN Electronic
 *                                 http: //www.procan.com.cn
 *
 *-----------------------------------------------------------------------------------------------
 * 文 件 名: C8051F_EEPROM.C
 * 创 建 人: 艾艳斌(E-mail:ayb_ice@yahoo.com.cn)
 * 版    本: V1.00 / 2006-3-2 14:41
 * 描    述: C8051F片上EEPROM程序(注意: 并非全部C8051Fx MCU兼容)
 *-----------------------------------------------------------------------------------------------
 * 修 改 人: 艾艳斌
 * 版    本: V1.01 / 2008-2-25 15:01
 * 描    述: 修改程序,使之规范,合理,易于阅读
 *-----------------------------------------------------------------------------------------------
 * 修 改 人: 艾艳斌
 * 版    本: V1.02 / 2008-3-4 16:24
 * 描    述: 将EEPROM写函数的指针由指向U8X改成U8C,c8051f_eeprom_sector_earse改带参数
 *-----------------------------------------------------------------------------------------------
 * 修 改 人: 艾艳斌
 * 版    本: V1.03 / 2008-3-14 13:47
 * 描    述: 修改c8051f_eeprom_sector_check,c8051f_eeprom_xwrite函数,大大提高程序执行效率,同时
 *   >>>   : 提高代码效率
 *-----------------------------------------------------------------------------------------------
 *-----------------------------------------------------------------------------------------------
 */


#define C8051F_EEPROM_C     // #include "C8051F_EEPROM.H"
#include "HEADER.H"



//------------------------------------------------------
// c8051f_eeprom_sector_earse
//------------------------------------------------------
//
// 扇区擦除
// px = 扇区任意有效地址,推荐使用首地址
//
#if C8051F_EEPROM_SECTOR_EARSE_EN > 0
#pragma DISABLE_INTERRUPT
void c8051f_eeprom_sector_earse(U8C *px)
{
    PSCTL = 0x03;
    FLKEY = 0xA5;
    FLKEY = 0xF1;
//  ((U8X*)C8051F_EEPROM)[0] = 0;
    ((U8X*)px)[0] = ACC;
    PSCTL = 0;
}
#endif
//------------------------------------------------------
// c8051f_eeprom_sector_check
//------------------------------------------------------
//
// 扇区擦除检查
// pc = 检查地址,必须是EEPROM的首地址
//
#if C8051F_EEPROM_SECTOR_CHECK_EN > 0
U8 c8051f_eeprom_sector_check(U8C *pc)
{
/*
    U16 x;

//  if(((U16)pc) % 512 != 0){   // 检查指针是否合法
//      return C8051F_EEPROM_FALSE;
//  }

    for(x=512; x; x--){
        if(pc[0] != -1){
            return C8051F_EEPROM_FALSE;
        }
        pc++;
    }
    return C8051F_EEPROM_TRUE;
*/

    U8 x;
    U8 y;

    for(x=512/128; x; x--){
        for(y=128; y; y--){
            if(pc[0] != -1){
                return C8051F_EEPROM_FALSE;
            }
            pc++;
        }
    }
    return C8051F_EEPROM_TRUE;

/*
    U8 x;
    U8 y;

    x = 512/256;
    do{
        y = 0;
        do{
            if(pc[0] != -1){
                return C8051F_EEPROM_FALSE;
            }
            pc++;
        }while(--y != 0);
    }while(--x != 0);

    return C8051F_EEPROM_TRUE;
*/
}
#endif
//------------------------------------------------------
// c8051f_eeprom_write
//------------------------------------------------------
//
// 字节写
// px = 目标指针
// x  = 数据
//
#if C8051F_EEPROM_WRITE_EN > 0
#pragma DISABLE_INTERRUPT
void c8051f_eeprom_write(U8C *px, U8 x)
{
    PSCTL = 0x01;
    FLKEY = 0xA5;
    FLKEY = 0xF1;
    ((U8X*)(px))[0] = x;
    PSCTL = 0;
}
#endif
//------------------------------------------------------
// c8051f_eeprom_xwrite
//------------------------------------------------------
//
// 连续写
// x  = 数量,注意最大255字节
// pi = 源指针
// px = 目标指针
//
#if C8051F_EEPROM_XWRITE_EN > 0
#pragma DISABLE_INTERRUPT
void c8051f_eeprom_xwrite(U8 x, U8I *pi, U8C *px)
{
    if(!x) return;

    PSCTL = 0x01;
    do{
        FLKEY = 0xA5;
        FLKEY = 0xF1;
        ((U8X*)(px))[0] = pi[0],
        px++,pi++;
    }while(--x != 0);

/*
    PSCTL = 0x01;
    for(; x; x--){
        FLKEY = 0xA5;
        FLKEY = 0xF1;
        ((U8X*)(px))[0] = pi[0];
        px++,pi++;
    }
*/

    PSCTL = 0;
}
#endif



//----------------------------------------------------
// @End
//----------------------------------------------------


使用特权

评论回复
10
robchjm|  楼主 | 2009-3-16 10:05 | 只看该作者

??

控制寄存器与020有很大差别,还是不明白

使用特权

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

本版积分规则

3

主题

9

帖子

0

粉丝