找回密码
 立即注册
查看: 85|回复: 3

小白求助!stc89c58rd+换成stc89c54rd+,eeprom无法读写

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-26 14:58:13
已绑定手机

1

主题

2

回帖

17

积分

新手上路

积分
17
发表于 2025-5-26 14:58:13 | 显示全部楼层 |阅读模式
58用了三个地址8200,8400,8600,烧录后eeprom使用正常。
换成54后,地址对应改为4200,4400,4600,eeprom无法保存数据。
麻烦大佬们帮忙看看谢谢。

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-26 14:58:13
已绑定手机

1

主题

2

回帖

17

积分

新手上路

积分
17
发表于 2025-5-26 15:03:17 | 显示全部楼层
咨询售后,说是只需要改地址其他不用改就好,但是换了多个地址仍是同样异常情况
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-26 14:58:13
已绑定手机

1

主题

2

回帖

17

积分

新手上路

积分
17
发表于 2025-5-26 16:30:51 | 显示全部楼层
uchar ISP_IAP_read(uint byte_addr)                                                                                                                    
{
     ISP_ADDRH      =      (uchar)(byte_addr >> 8);
     ISP_ADDRL      =      (uchar)(byte_addr & 0x00ff);

     ISP_CMD        =      0x01;
     EA=0;                                              /* 关中断 */
     ISP_CONTR      =      0x80;                             /* 打开 ISP,IAP 功能 */

     ISP_TRIG       =      0x46;
     ISP_TRIG       =      0xb9;
     _nop_();

     ISP_CONTR      =      ISP_CONTR & 0x7f;      /* 关闭 ISP,IAP 功能 */
     ISP_TRIG       =      0x00;
     EA             =      1;                /* 开中断 */
     return (ISP_DATA);
}

void ISP_IAP_write(uint begin_addr, uchar array)                                                                                         
{
     uint  sector_addr=0;

  /* 擦除 要修改/写入 的扇区 */
     sector_addr      =      (begin_addr & 0xfe00);      
     ISP_ADDRH      =      (uchar)(sector_addr >> 8);
     ISP_ADDRL      =      0x00;
     ISP_CMD            =  0x03;

     EA             =      0;                                              /* 关中断 */
     ISP_CONTR      =      0x80;                             /* 打开 ISP,IAP 功能 */

     ISP_TRIG      =      0x46;     /* 触发ISP_IAP命令 */
     ISP_TRIG      =      0xb9;     /* 触发ISP_IAP命令 */
     _nop_();

     /* 写一个字节 */
     ISP_ADDRH      =      (uchar)(begin_addr >> 8);
     ISP_ADDRL      =      (uchar)(begin_addr & 0x00ff);
     ISP_DATA       =      array;
     ISP_CMD            =   0x02;

     ISP_TRIG      =      0x46;      /* 触发ISP_IAP命令 */
     ISP_TRIG      =      0xb9;      /* 触发ISP_IAP命令 */
     _nop_();

     ISP_CONTR      =      ISP_CONTR & 0x7f;      /* 关闭 ISP,IAP 功能 */
     ISP_TRIG       =      0x00;
     EA             =      1;                /* 开中断 */
}   
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

积分
16635
发表于 2025-5-27 08:55:35 | 显示全部楼层
截图202505270855225992.jpg



#include "reg51.h"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

/*Declare SFR associated with the IAP */
sfr IAP_DATA    =   0xE2;           //Flash data register
sfr IAP_ADDRH   =   0xE3;           //Flash address HIGH
sfr IAP_ADDRL   =   0xE4;           //Flash address LOW
sfr IAP_CMD     =   0xE5;           //Flash command register
sfr IAP_TRIG    =   0xE6;           //Flash command trigger
sfr IAP_CONTR   =   0xE7;           //Flash control register

/*Define ISP/IAP/EEPROM command*/
#define CMD_IDLE    0               //Stand-By
#define CMD_READ    1               //Byte-Read
#define CMD_PROGRAM 2               //Byte-Program
#define CMD_ERASE   3               //Sector-Erase

/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
//#define ENABLE_IAP 0x80           //if SYSCLK<40MHz
#define ENABLE_IAP   0x81           //if SYSCLK<20MHz
//#define ENABLE_IAP x82            //if SYSCLK<10MHz
//#define ENABLE_IAP 0x83           //if SYSCLK<5MHz

//Start address for STC89C58xx EEPROM
#define IAP_ADDRESS 0x08000

void Delay(BYTE n);
void IapIdle();
BYTE IapReadByte(WORD addr);
void IapProgramByte(WORD addr, BYTE dat);
void IapEraseSector(WORD addr);

void main()
{
    WORD i;

    P1 = 0xfe;                      //1111,1110 System Reset OK
    Delay(10);                      //Delay
    IapEraseSector(IAP_ADDRESS);    //Erase current sector
    for (i=0; i<512; i++)           //Check whether all sector data is FF
    {
        if (IapReadByte(IAP_ADDRESS+i) != 0xff)
            goto Error;             //If error, break
    }
    P1 = 0xfc;                      //1111,1100 Erase successful
    Delay(10);                      //Delay
    for (i=0; i<512; i++)           //Program 512 bytes data into data flash
    {
        IapProgramByte(IAP_ADDRESS+i, (BYTE)i);
    }
    P1 = 0xf8;                      //1111,1000 Program successful
    Delay(10);                      //Delay
    for (i=0; i<512; i++)           //Verify 512 bytes data
    {
        if (IapReadByte(IAP_ADDRESS+i) != (BYTE)i)
            goto Error;             //If error, break
    }
    P1 = 0xf0;                      //1111,0000 Verify successful
    while (1);
Error:
    P1 &= 0x7f;                     //0xxx,xxxx IAP operation fail
    while (1);
}

/*----------------------------
Software delay function
----------------------------*/
void Delay(BYTE n)
{
    WORD x;

    while (n--)
    {
        x = 0;
        while (++x);
    }
}

/*----------------------------
Disable ISP/IAP/EEPROM function
Make MCU in a safe state
----------------------------*/
void IapIdle()
{
    IAP_CONTR = 0;                  //Close IAP function
    IAP_CMD = 0;                    //Clear command to standby
    IAP_TRIG = 0;                   //Clear trigger register
    IAP_ADDRH = 0x80;               //Data ptr point to non-EEPROM area
    IAP_ADDRL = 0;                  //Clear IAP address to prevent misuse
}

/*----------------------------
Read one byte from ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
Output:Flash data
----------------------------*/
BYTE IapReadByte(WORD addr)
{
    BYTE dat;                       //Data buffer

    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_READ;             //Set ISP/IAP/EEPROM READ command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data
    IapIdle();                      //Close ISP/IAP/EEPROM function

    return dat;                     //Return Flash data
}

/*----------------------------
Program one byte to ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
       dat (ISP/IAP/EEPROM data)
Output:-
----------------------------*/
void IapProgramByte(WORD addr, BYTE dat)
{
    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_PROGRAM;          //Set ISP/IAP/EEPROM PROGRAM command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_DATA = dat;                 //Write ISP/IAP/EEPROM data
    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    IapIdle();
}

/*----------------------------
Erase one sector area
Input: addr (ISP/IAP/EEPROM address)
Output:-
----------------------------*/
void IapEraseSector(WORD addr)
{
    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_ERASE;            //Set ISP/IAP/EEPROM ERASE command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    IapIdle();
}


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 13:06 , Processed in 0.941671 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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