找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4619|回复: 6
打印 上一主题 下一主题
收起左侧

stc单片机的EEPROM每个扇区地址怎么分?

[复制链接]
跳转到指定楼层
楼主
ID:960619 发表于 2021-9-30 12:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 baobao125 于 2021-9-30 13:04 编辑

  EEPROM一共5K10个扇区,起始扇区首地址000H,结束扇区末尾地址13FFH。一个扇区512字节。

我按0x0100,0x0200,0x0300,这样分区只有第一个写进去后读取成功了。感觉这样差不多在两个分区的交界处左右。按0x0100,0x0300,0x0500,0x0700,这样分区得话又能读写成功,
请教这十个扇区的 地址是怎么分的?


以下是我用的EEPROM擦读写程序




                        if(IapReadByte(0x0100)!=PWMZ)
                        {
                                IapEraseSector(0x0100);
                                IapProgramByte(0x0100,PWMZ);                          
                         }







/*----------------------------
关闭IAP
----------------------------*/
void IapIdle()
{
    IAP_CONTR = 0;                  //关闭IAP功能
    IAP_CMD = 0;                    //清除命令寄存器
    IAP_TRIG = 0;                   //清除触发寄存器
    IAP_ADDRH = 0x80;               //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

/*----------------------------
从ISP/IAP/EEPROM区域读取一字节
----------------------------*/
BYTE IapReadByte(WORD addr)
{
    BYTE dat;                       //数据缓冲区

    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_READ;             //设置IAP命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据
    IapIdle();                      //关闭IAP功能

    return dat;                     //返回
}

/*----------------------------
写一字节数据到ISP/IAP/EEPROM区域
----------------------------*/
void IapProgramByte(WORD addr, BYTE dat)
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_PROGRAM;          //设置IAP命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    IapIdle();
}

/*----------------------------
扇区擦除
----------------------------*/
void IapEraseSector(WORD addr)
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_ERASE;            //设置IAP命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    IapIdle();
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2021-9-30 17:04 | 只看该作者
区间是:  0000~01FF, 0200~03FF
以此类推。

另外:    IAP_TRIG = 0;                   //清除触发寄存器
这个不要写,IAP_TRIG 从来都是空的,不存在清空问题。
事实上,整个 IAPIdle() 都是没必要的。真的实在想要防误触 IAP_CMD = 0 就足够了
回复

使用道具 举报

板凳
ID:25310 发表于 2021-9-30 17:16 | 只看该作者
/********************stc15w4k32s4 Eeprom max address 67ff*********/               
#define IAP_ADDR0  0x0600
#define IAP_ADDR1  0x0800   
#define IAP_ADDR2  0x0A00   
#define IAP_ADDR3  0x0C00   //
#define IAP_ADDR4  0x0E00   //
#define IAP_ADDR5  0x1000   //
#define IAP_ADDR6  0x1200
#define IAP_ADDR7  0x1400
#define IAP_ADDR8  0x1600

#define IAP_ADDR9   0x1800   
#define IAP_ADDR10  0x1A00   
#define IAP_ADDR11  0x1C00   //
#define IAP_ADDR12  0x1E00   //
#define IAP_ADDR13  0x2000   //
#define IAP_ADDR14  0x2200
#define IAP_ADDR15  0x2400
#define IAP_ADDR16  0x2600


#define IAP_ADDR17  0x2800   
#define IAP_ADDR18  0x2A00   
#define IAP_ADDR19  0x2C00   //
#define IAP_ADDR20  0x2E00   //
#define IAP_ADDR21  0x3000   //
#define IAP_ADDR22  0x3200
#define IAP_ADDR23  0x3400
#define IAP_ADDR24  0x3600

#define IAP_ADDR25  0x3800   
#define IAP_ADDR26  0x3A00   
#define IAP_ADDR27  0x3C00   //
#define IAP_ADDR28  0x3E00   //
#define IAP_ADDR29  0x4000   //
#define IAP_ADDR30  0x4200
#define IAP_ADDR31  0x4400
#define IAP_ADDR32  0x4600

#define IAP_ADDR33  0x4800   
#define IAP_ADDR34  0x4A00   
#define IAP_ADDR35  0x4C00   //
#define IAP_ADDR36  0x4E00   //
#define IAP_ADDR37  0x5000   //
#define IAP_ADDR38  0x5200
#define IAP_ADDR39  0x5400
#define IAP_ADDR40  0x5600

#define IAP_ADDR41  0x5800   
#define IAP_ADDR42  0x5A00   
#define IAP_ADDR43  0x5C00   //
#define IAP_ADDR44  0x5E00   //
#define IAP_ADDR45  0x6000   //
#define IAP_ADDR46  0x6200
#define IAP_ADDR47  0x6400
回复

使用道具 举报

地板
ID:960619 发表于 2021-9-30 17:41 | 只看该作者
188610329 发表于 2021-9-30 17:04
区间是:  0000~01FF, 0200~03FF
以此类推。

这样划分区间那只有7个扇区呀,还少3个扇区
回复

使用道具 举报

5#
ID:959346 发表于 2021-9-30 17:47 | 只看该作者
按照512字节一个扇区,不是0x0000->0x0200->0x0400->……这样吗?
回复

使用道具 举报

6#
ID:959346 发表于 2021-9-30 17:50 | 只看该作者
baobao125 发表于 2021-9-30 17:41
这样划分区间那只有7个扇区呀,还少3个扇区

0x13FFH,16进制,你再看看是7还是10个?
回复

使用道具 举报

7#
ID:960619 发表于 2021-9-30 19:03 | 只看该作者
Jiang_YY 发表于 2021-9-30 17:50
0x13FFH,16进制,你再看看是7还是10个?

掉了A C E刚好十个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表