打印

关于STC单片机IAP不能正确读取问题求各位指教!!!

[复制链接]
2023|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
唯Lose|  楼主 | 2018-8-17 11:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的单片机型号是STC8a8k64s4a12,然后哟个功能用到EEPROM就根据文档提供的示例程序写了个测试代码,首先首先读取某个地址的值打印出来,然后再擦除通过串口打印这个地址的值竟然是00,后面我又写入了一个值到该地址读取该地址的值打印出来是我写入的,但我断电后重新读该地址打印出来的值竟然是00,实验了很多遍根本无法保存我代码如下请各位指正!!
void Delay7us()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        _nop_();
        _nop_();
        i = 16;
        while (--i);
}

void Delay5ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 54;
        j = 199;
        do
        {
                while (--j);
        } while (--i);
}

void Delay500ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 22;
        j = 3;
        k = 227;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


void UartInit()
{
    SCON = 0x5a;
    T2L = BRT;
    T2H = BRT >> 8;
    AUXR = 0x15;
}

void UartSend(char dat)
{
    while (!TI);
    TI = 0;
    SBUF = dat;
}

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

char IapRead(int addr)
{
    char dat;

    IAP_CONTR = WT_20M;                         //使能IAP
    IAP_CMD = 1;                                //设置IAP读命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    dat = IAP_DATA;                             //读IAP数据
    IapIdle();                                  //关闭IAP功能

    return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = WT_20M;                         //使能IAP
    IAP_CMD = 2;                                //设置IAP写命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_DATA = dat;                             //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    IapIdle();                                  //关闭IAP功能
}

void IapErase(int addr)
{
    IAP_CONTR = WT_20M;                         //使能IAP
    IAP_CMD = 3;                                //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}

void main()
{
       
          char i;
    UartInit();

          for(i=0;i<5;i++)
        {
          Delay500ms();       
        }
          UartSend(IapRead(0x0400));
       
          IapErase(0x0400);
          Delay5ms();
    UartSend(IapRead(0x0400));
       
    IapProgram(0x0400, 0x12);
          Delay7us();
    UartSend(IapRead(0x0400));

    while (1);
}

相关帖子

沙发
airwill| | 2018-8-19 08:15 | 只看该作者
是不是因为加密而封锁了读总线. 这个可能需要咨询芯片厂商了

使用特权

评论回复
板凳
ycf119| | 2018-8-20 13:54 | 只看该作者
ISP软件了设置的EEPROM大小是不是小于0x400??

使用特权

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

本版积分规则

2

主题

11

帖子

1

粉丝